From 5a9646386ec2bab26c1428d1c7c9f85ccc5d9380 Mon Sep 17 00:00:00 2001 From: goweii Date: Tue, 17 Jun 2025 23:30:30 +0800 Subject: [PATCH 01/30] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7sdk35?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 16 +- .../book/activity/BookDetailsActivity.kt | 63 +++---- .../module/book/fragment/BookFragment.kt | 38 ++-- .../module/home/activity/SearchActivity.java | 13 +- .../home/activity/UserPageActivity.java | 124 +++++--------- .../module/home/fragment/HomeFragment.java | 9 +- .../home/fragment/SearchHistoryFragment.java | 52 +++--- .../home/fragment/SearchResultFragment.java | 11 +- .../activity/KnowledgeArticleActivity.java | 10 +- .../fragment/KnowledgeArticleFragment.java | 11 +- .../knowledge/fragment/KnowledgeFragment.java | 12 +- .../module/login/activity/AuthActivity.java | 9 +- .../login/activity/QuickLoginActivity.kt | 9 +- .../module/login/fragment/LoginFragment.java | 11 +- .../login/fragment/RegisterFragment.java | 11 +- .../module/main/activity/ArticleActivity.kt | 162 +++++++++++------- .../main/activity/ArticleListActivity.kt | 8 +- .../main/activity/BringToFrontActivity.java | 8 +- .../module/main/activity/CrashActivity.kt | 18 +- .../main/activity/InstallApkActivity.java | 13 +- .../module/main/activity/MainActivity.java | 9 +- .../module/main/activity/RouterActivity.java | 7 +- .../module/main/activity/ScanActivity.kt | 97 ++++++----- .../main/activity/ShareArticleActivity.java | 9 +- .../module/main/activity/SplashActivity.java | 12 +- .../module/main/activity/WebActivity.java | 9 +- .../main/fragment/ArticleListFragment.kt | 12 +- .../module/main/fragment/BookmarkFragment.kt | 39 +++-- .../fragment/KnowledgeNavigationFragment.java | 15 +- .../module/main/fragment/MainFragment.java | 11 +- .../main/fragment/UserArticleFragment.java | 11 +- .../module/mine/activity/AboutActivity.java | 9 +- .../module/mine/activity/AboutMeActivity.java | 10 +- .../module/mine/activity/CoinActivity.java | 10 +- .../mine/activity/CoinRankActivity.java | 10 +- .../mine/activity/CollectionActivity.java | 13 +- .../mine/activity/HostInterruptActivity.java | 13 +- .../module/mine/activity/MessageActivity.kt | 13 +- .../mine/activity/MineShareActivity.java | 10 +- .../module/mine/activity/OpenActivity.java | 13 +- .../mine/activity/ReadLaterActivity.java | 10 +- .../mine/activity/ReadRecordActivity.java | 10 +- .../module/mine/activity/SettingActivity.java | 10 +- .../module/mine/activity/UserInfoActivity.kt | 17 +- .../fragment/CollectionArticleFragment.java | 11 +- .../mine/fragment/CollectionLinkFragment.java | 11 +- .../mine/fragment/HostBlackFragment.java | 10 +- .../mine/fragment/HostWhiteFragment.java | 10 +- .../mine/fragment/MessageReadedFragment.kt | 31 ++-- .../mine/fragment/MessageUnreadFragment.kt | 31 ++-- .../module/mine/fragment/MineFragment.java | 11 +- .../navigation/fragment/NaviFragment.java | 12 +- .../fragment/ProjectArticleFragment.java | 11 +- .../project/fragment/ProjectFragment.java | 12 +- .../question/fragment/QuestionFragment.kt | 33 ++-- .../wxarticle/fragment/WxArticleFragment.java | 11 +- .../module/wxarticle/fragment/WxFragment.java | 12 +- .../utils/fingerprint/FingerprintHelper.kt | 157 ----------------- .../goweii/wanandroid/widget/LogoAnimView.kt | 8 +- app/src/main/res/layout/activity_article.xml | 4 +- .../main/res/layout/activity_quick_login.xml | 6 + basic_core/build.gradle | 1 + basic_core/src/main/AndroidManifest.xml | 3 +- .../goweii/basic/core/base/BaseActivity.java | 4 +- .../goweii/basic/core/base/BaseFragment.java | 4 +- .../goweii/basic/core/mvp/MvpActivity.java | 20 ++- .../goweii/basic/core/mvp/MvpFragment.java | 25 ++- .../surface/activity/SingleFragActivity.java | 10 +- .../surface/fragment/NotFoundFragment.java | 12 +- basic_res/build.gradle | 1 + basic_res/src/main/AndroidManifest.xml | 2 +- basic_ui/build.gradle | 1 + basic_ui/src/main/AndroidManifest.xml | 2 +- basic_utils/build.gradle | 1 + basic_utils/src/main/AndroidManifest.xml | 2 +- build.gradle | 16 +- gradle.properties | 3 + gradle/basic.gradle | 6 +- gradle/config.gradle | 41 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 81 files changed, 846 insertions(+), 679 deletions(-) delete mode 100644 app/src/main/java/per/goweii/wanandroid/utils/fingerprint/FingerprintHelper.kt create mode 100644 app/src/main/res/layout/activity_quick_login.xml diff --git a/app/build.gradle b/app/build.gradle index c3849c0b..d8a74903 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,7 @@ apply from: "${rootDir.path}/gradle/module.gradle" apply from: "${rootDir.path}/gradle/flavor.gradle" android { + namespace "per.goweii.wanandroid" defaultConfig { renderscriptTargetApi rootProject.ext.android.minSdkVersion renderscriptSupportModeEnabled true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1e2000fc..7855c1ae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,10 @@ + xmlns:tools="http://schemas.android.com/tools"> + + @@ -41,6 +44,7 @@ android:name=".module.main.activity.RouterActivity" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:launchMode="singleTask" + android:exported="true" android:theme="@style/AppTheme.Router"> @@ -48,7 +52,8 @@ - + @@ -69,6 +74,7 @@ @@ -79,6 +85,7 @@ android:name=".module.main.activity.theme.MainActivityRed" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:enabled="false" + android:exported="true" android:icon="@mipmap/ic_launcher_red" android:roundIcon="@mipmap/ic_launcher_red_round" android:theme="@style/AppTheme.Main.Red"> @@ -91,6 +98,7 @@ android:name=".module.main.activity.theme.MainActivityGreen" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:enabled="false" + android:exported="true" android:icon="@mipmap/ic_launcher_green" android:roundIcon="@mipmap/ic_launcher_green_round" android:theme="@style/AppTheme.Main.Green"> @@ -103,6 +111,7 @@ android:name=".module.main.activity.theme.MainActivityPink" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:enabled="false" + android:exported="true" android:icon="@mipmap/ic_launcher_pink" android:roundIcon="@mipmap/ic_launcher_pink_round" android:theme="@style/AppTheme.Main.Pink"> @@ -115,6 +124,7 @@ android:name=".module.main.activity.theme.MainActivityGold" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:enabled="false" + android:exported="true" android:icon="@mipmap/ic_launcher_gold" android:roundIcon="@mipmap/ic_launcher_gold_round" android:theme="@style/AppTheme.Main.Gold"> diff --git a/app/src/main/java/per/goweii/wanandroid/module/book/activity/BookDetailsActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/book/activity/BookDetailsActivity.kt index f7120fba..4f84fa9c 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/book/activity/BookDetailsActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/book/activity/BookDetailsActivity.kt @@ -3,14 +3,15 @@ package per.goweii.wanandroid.module.book.activity import android.content.Context import android.content.Intent import android.os.Parcelable +import android.view.LayoutInflater import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener -import kotlinx.android.synthetic.main.activity_book_details.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.utils.ResUtils import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityBookDetailsBinding import per.goweii.wanandroid.db.model.ReadRecordModel import per.goweii.wanandroid.event.ReadRecordAddedEvent import per.goweii.wanandroid.event.ReadRecordUpdateEvent @@ -27,7 +28,7 @@ import per.goweii.wanandroid.utils.MultiStateUtils.Companion.toError import per.goweii.wanandroid.utils.UrlOpenUtils import kotlin.math.abs -class BookDetailsActivity : BaseActivity(), BookDetailsView { +class BookDetailsActivity : BaseActivity(), BookDetailsView { companion object { private const val PAGE_START = 0 private const val PARAM_BOOK = "book" @@ -44,59 +45,59 @@ class BookDetailsActivity : BaseActivity(), BookDetailsVie private var currPage = PAGE_START - override fun getLayoutId(): Int = R.layout.activity_book_details + override fun initViewBinding(inflater: LayoutInflater) = ActivityBookDetailsBinding.inflate(inflater) override fun initPresenter(): BookDetailsPresenter = BookDetailsPresenter() override fun initView() { bookBean = intent.getParcelableExtra(PARAM_BOOK)!! - ImageLoader.userIcon(riv_book_img, bookBean.cover) - abc.titleTextView.text = bookBean.name - tv_book_name.text = bookBean.name - tv_book_author.text = bookBean.author - tv_book_desc.text = bookBean.desc - tv_book_copyright.text = bookBean.lisense - tv_book_copyright.setOnClickListener { + ImageLoader.userIcon(binding.rivBookImg, bookBean.cover) + binding.abc.titleTextView.text = bookBean.name + binding.tvBookName.text = bookBean.name + binding.tvBookAuthor.text = bookBean.author + binding.tvBookDesc.text = bookBean.desc + binding.tvBookCopyright.text = bookBean.lisense + binding.tvBookCopyright.setOnClickListener { UrlOpenUtils.with(bookBean.lisenseLink).open(this) } - rv.layoutManager = LinearLayoutManager(context) + binding.rv.layoutManager = LinearLayoutManager(context) adapter = BookChapterAdapter() adapter.setEnableLoadMore(false) adapter.setOnLoadMoreListener({ presenter.getChapters(bookBean.id, currPage) - }, rv) + }, binding.rv) adapter.setOnItemClickListener { _, _, position -> val item: BookChapterBean = adapter.getItem(position) ?: return@setOnItemClickListener UrlOpenUtils.with(item.articleBean).open(context) } - rv.adapter = adapter - MultiStateUtils.setEmptyAndErrorClick(msv) { - MultiStateUtils.toLoading(msv) + binding.rv.adapter = adapter + MultiStateUtils.setEmptyAndErrorClick(binding.msv) { + MultiStateUtils.toLoading(binding.msv) presenter.getChapters(bookBean.id, currPage) } - abl.addOnOffsetChangedListener(OnOffsetChangedListener { abl, offset -> + binding.abl.addOnOffsetChangedListener(OnOffsetChangedListener { abl, offset -> if (abs(offset) == abl.totalScrollRange) { - abc.titleTextView.alpha = 1f - val color = ResUtils.getThemeColor(abc, R.attr.colorMainOrSurface) - abc.setBackgroundColor(color) - ll_top.alpha = 1F + binding.abc.titleTextView.alpha = 1f + val color = ResUtils.getThemeColor(binding.abc, R.attr.colorMainOrSurface) + binding.abc.setBackgroundColor(color) + binding.llTop.alpha = 1F } else { - abc.titleTextView.alpha = 0f - val color = ResUtils.getThemeColor(abc, R.attr.colorTransparent) - abc.setBackgroundColor(color) - ll_top.alpha = 1f - (abs(offset).toFloat() / abl.totalScrollRange.toFloat()) + binding.abc.titleTextView.alpha = 0f + val color = ResUtils.getThemeColor(binding.abc, R.attr.colorTransparent) + binding.abc.setBackgroundColor(color) + binding.llTop.alpha = 1f - (abs(offset).toFloat() / abl.totalScrollRange.toFloat()) } }) - ctbl.post { - ctbl.minimumHeight = abc.actionBar.height - ctbl.scrimVisibleHeightTrigger = abc.actionBar.height + binding.ctbl.post { + binding.ctbl.minimumHeight = binding.abc.actionBar.height + binding.ctbl.scrimVisibleHeightTrigger = binding.abc.actionBar.height } } override fun loadData() { - MultiStateUtils.toLoading(msv) + MultiStateUtils.toLoading(binding.msv) presenter.getChapters(bookBean.id, currPage) } @@ -146,9 +147,9 @@ class BookDetailsActivity : BaseActivity(), BookDetailsVie adapter.setNewData(list) adapter.setEnableLoadMore(true) if (list.isEmpty()) { - toEmpty(msv) + toEmpty(binding.msv) } else { - toContent(msv) + toContent(binding.msv) } } else { adapter.addData(list) @@ -162,7 +163,7 @@ class BookDetailsActivity : BaseActivity(), BookDetailsVie override fun getBookChaptersFailed() { adapter.loadMoreFail() if (currPage == PAGE_START) { - toError(msv) + toError(binding.msv) } } } \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/module/book/fragment/BookFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/book/fragment/BookFragment.kt index 1142745e..de256c41 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/book/fragment/BookFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/book/fragment/BookFragment.kt @@ -1,12 +1,13 @@ package per.goweii.wanandroid.module.book.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.recyclerview.widget.GridLayoutManager import com.scwang.smart.refresh.layout.api.RefreshFooter import com.scwang.smart.refresh.layout.constant.RefreshState -import kotlinx.android.synthetic.main.fragment_bookmark.* import per.goweii.basic.core.base.BaseFragment import per.goweii.basic.core.utils.SmartRefreshUtils -import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentBookBinding import per.goweii.wanandroid.event.CloseSecondFloorEvent import per.goweii.wanandroid.module.book.activity.BookDetailsActivity import per.goweii.wanandroid.module.book.adapter.BookAdapter @@ -17,16 +18,21 @@ import per.goweii.wanandroid.utils.MultiStateUtils import per.goweii.wanandroid.utils.RvConfigUtils import per.goweii.wanandroid.widget.refresh.SimpleOnMultiListener -class BookFragment : BaseFragment(), BookView { +class BookFragment : BaseFragment(), BookView { private lateinit var mAdapter: BookAdapter - override fun getLayoutRes(): Int = R.layout.fragment_book + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentBookBinding { + return FragmentBookBinding.inflate(inflater, container, false) + } override fun initPresenter(): BookPresenter = BookPresenter() override fun initView() { - SmartRefreshUtils.with(srl).pureScrollMode() - srl.setOnMultiListener(object : SimpleOnMultiListener() { + SmartRefreshUtils.with(binding.srl).pureScrollMode() + binding.srl.setOnMultiListener(object : SimpleOnMultiListener() { override fun onFooterMoving( footer: RefreshFooter?, isDragging: Boolean, @@ -43,13 +49,13 @@ class BookFragment : BaseFragment(), BookView { footerHeight, maxDragHeight ) - if (srl.state != RefreshState.PullUpCanceled && isDragging && percent > 1.2F) { - srl.closeHeaderOrFooter() + if (binding.srl.state != RefreshState.PullUpCanceled && isDragging && percent > 1.2F) { + binding.srl.closeHeaderOrFooter() CloseSecondFloorEvent().post() } } }) - rv.layoutManager = GridLayoutManager(context, 3) + binding.rv.layoutManager = GridLayoutManager(context, 3) mAdapter = BookAdapter() RvConfigUtils.init(mAdapter) mAdapter.setEnableLoadMore(false) @@ -58,15 +64,15 @@ class BookFragment : BaseFragment(), BookView { BookDetailsActivity.start(requireContext(), item) } } - rv.adapter = mAdapter - MultiStateUtils.setEmptyAndErrorClick(msv) { - MultiStateUtils.toLoading(msv) + binding.rv.adapter = mAdapter + MultiStateUtils.setEmptyAndErrorClick(binding.msv) { + MultiStateUtils.toLoading(binding.msv) presenter.getList() } } override fun loadData() { - MultiStateUtils.toLoading(msv) + MultiStateUtils.toLoading(binding.msv) } override fun onVisible(isFirstVisible: Boolean) { @@ -83,13 +89,13 @@ class BookFragment : BaseFragment(), BookView { override fun getBookListSuccess(list: List) { mAdapter.setNewData(list) if (list.isEmpty()) { - MultiStateUtils.toEmpty(msv, true) + MultiStateUtils.toEmpty(binding.msv, true) } else { - MultiStateUtils.toContent(msv) + MultiStateUtils.toContent(binding.msv) } } override fun getBookListFailed() { - MultiStateUtils.toError(msv) + MultiStateUtils.toError(binding.msv) } } \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/activity/SearchActivity.java b/app/src/main/java/per/goweii/wanandroid/module/home/activity/SearchActivity.java index b9c4dd45..4b2edd3b 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/activity/SearchActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/activity/SearchActivity.java @@ -6,12 +6,14 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -20,10 +22,12 @@ import butterknife.BindView; import per.goweii.actionbarex.common.ActionIconView; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.utils.EditTextUtils; import per.goweii.basic.utils.InputMethodUtils; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivitySearchBinding; import per.goweii.wanandroid.module.home.fragment.SearchHistoryFragment; import per.goweii.wanandroid.module.home.fragment.SearchResultFragment; @@ -32,7 +36,7 @@ * @date 2019/5/18 * GitHub: https://github.com/goweii */ -public class SearchActivity extends BaseActivity { +public class SearchActivity extends BaseActivity { @BindView(R.id.aiv_back) ActionIconView aiv_back; @@ -56,14 +60,15 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_search; + protected ActivitySearchBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivitySearchBinding.inflate(inflater); } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java b/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java index 37df4f83..e654f667 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; @@ -45,6 +46,7 @@ import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.BuildConfig; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityUserPageBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.module.home.presenter.UserPagePresenter; @@ -63,41 +65,10 @@ * @date 2019/5/18 * GitHub: https://github.com/goweii */ -public class UserPageActivity extends BaseActivity implements UserPageView { +public class UserPageActivity extends BaseActivity implements UserPageView { private static final int PAGE_START = 1; - @BindView(R.id.msv) - MultiStateView msv; - @BindView(R.id.msv_list) - MultiStateView msv_list; - @BindView(R.id.cl) - CoordinatorLayout cl; - @BindView(R.id.ctbl) - CollapsingToolbarLayout ctbl; - @BindView(R.id.abl) - AppBarLayout abl; - @BindView(R.id.abc) - ActionBarCommon abc; - @BindView(R.id.srl) - SmartRefreshLayout srl; - @BindView(R.id.iv_blur) - ImageView iv_blur; - @BindView(R.id.rl_user_info) - RelativeLayout rl_user_info; - @BindView(R.id.rv) - RecyclerView rv; - @BindView(R.id.civ_user_icon) - ImageView civ_user_icon; - @BindView(R.id.tv_user_name) - TextView tv_user_name; - @BindView(R.id.tv_user_id) - TextView tv_user_id; - @BindView(R.id.tv_user_coin) - TextView tv_user_coin; - @BindView(R.id.tv_user_ranking) - TextView tv_user_ranking; - private SmartRefreshUtils mSmartRefreshUtils; private ArticleAdapter mAdapter; @@ -133,9 +104,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_user_page; + protected ActivityUserPageBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityUserPageBinding.inflate(inflater); } @Nullable @@ -147,7 +119,7 @@ protected UserPagePresenter initPresenter() { @Override protected void initView() { mUserId = getUserIdFromIntent(getIntent()); - abc.setOnRightTextClickListener(new OnActionBarChildClickListener() { + binding.abc.setOnRightTextClickListener(new OnActionBarChildClickListener() { @Override public void onClick(View v) { String userId = String.valueOf(mUserId); @@ -173,7 +145,7 @@ public void onClick(View v) { ToastMaker.showShort("口令已复制"); } }); - mSmartRefreshUtils = SmartRefreshUtils.with(srl); + mSmartRefreshUtils = SmartRefreshUtils.with(binding.srl); mSmartRefreshUtils.pureScrollMode(); mSmartRefreshUtils.setRefreshListener(new SmartRefreshUtils.RefreshListener() { @Override @@ -182,7 +154,7 @@ public void onRefresh() { getUserPage(true); } }); - rv.setLayoutManager(new LinearLayoutManager(getContext())); + binding.rv.setLayoutManager(new LinearLayoutManager(getContext())); mAdapter = new ArticleAdapter(); mAdapter.setEnableLoadMore(false); mAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { @@ -190,7 +162,7 @@ public void onRefresh() { public void onLoadMoreRequested() { getUserPage(true); } - }, rv); + }, binding.rv); mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { @@ -213,22 +185,20 @@ public void onCollectClick(BaseViewHolder helper, CollectView v, int position) { } } }); - rv.setAdapter(mAdapter); - MultiStateUtils.setEmptyAndErrorClick(msv, new SimpleListener() { + binding.rv.setAdapter(mAdapter); + MultiStateUtils.setEmptyAndErrorClick(binding.msv, new SimpleListener() { @Override public void onResult() { - MultiStateUtils.toLoading(msv); + MultiStateUtils.toLoading(binding.msv); currPage = PAGE_START; getUserPage(true); } }); - srl.setOnMultiListener(new OnMultiListener() { + binding.srl.setOnMultiListener(new OnMultiListener() { @Override public void onHeaderMoving(RefreshHeader header, boolean isDragging, float percent, int offset, int headerHeight, int maxDragHeight) { - if (iv_blur != null && rl_user_info != null) { - iv_blur.getLayoutParams().height = rl_user_info.getMeasuredHeight() + offset; - iv_blur.requestLayout(); - } + binding.ivBlur.getLayoutParams().height = binding.rlUserInfo.getMeasuredHeight() + offset; + binding.ivBlur.requestLayout(); } @Override @@ -245,10 +215,8 @@ public void onHeaderFinish(RefreshHeader header, boolean success) { @Override public void onFooterMoving(RefreshFooter footer, boolean isDragging, float percent, int offset, int footerHeight, int maxDragHeight) { - if (iv_blur != null && rl_user_info != null) { - iv_blur.getLayoutParams().height = rl_user_info.getMeasuredHeight() - offset; - iv_blur.requestLayout(); - } + binding.ivBlur.getLayoutParams().height = binding.rlUserInfo.getMeasuredHeight() - offset; + binding.ivBlur.requestLayout(); } @Override @@ -276,35 +244,35 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { } }); - abl.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { + binding.abl.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout abl, int offset) { if (Math.abs(offset) == abl.getTotalScrollRange()) { - abc.getTitleTextView().setAlpha(1F); - int color = ResUtils.getThemeColor(abc, R.attr.colorMainOrSurface); - abc.setBackgroundColor(color); - rl_user_info.setAlpha(1f); + binding.abc.getTitleTextView().setAlpha(1F); + int color = ResUtils.getThemeColor(binding.abc, R.attr.colorMainOrSurface); + binding.abc.setBackgroundColor(color); + binding.rlUserInfo.setAlpha(1f); } else { - abc.getTitleTextView().setAlpha(0F); - int color = ResUtils.getThemeColor(abc, R.attr.colorTransparent); - abc.setBackgroundColor(color); - rl_user_info.setAlpha(1f - ((float) Math.abs(offset) / (float) abl.getTotalScrollRange())); + binding.abc.getTitleTextView().setAlpha(0F); + int color = ResUtils.getThemeColor(binding.abc, R.attr.colorTransparent); + binding.abc.setBackgroundColor(color); + binding.rlUserInfo.setAlpha(1f - ((float) Math.abs(offset) / (float) abl.getTotalScrollRange())); } } }); - ctbl.post(new Runnable() { + binding.ctbl.post(new Runnable() { @Override public void run() { - ctbl.setMinimumHeight(abc.getActionBar().getHeight()); - ctbl.setScrimVisibleHeightTrigger(abc.getActionBar().getHeight()); + binding.ctbl.setMinimumHeight(binding.abc.getActionBar().getHeight()); + binding.ctbl.setScrimVisibleHeightTrigger(binding.abc.getActionBar().getHeight()); } }); } @Override protected void loadData() { - MultiStateUtils.toLoading(msv); - msv_list.setVisibility(View.GONE); + MultiStateUtils.toLoading(binding.msv); + binding.msvList.setVisibility(View.GONE); currPage = PAGE_START; getUserPage(false); } @@ -333,9 +301,9 @@ private int getUserIdFromIntent(Intent intent) { id = intent.getIntExtra("id", id); } if (id < 0) { - abc.getRightTextView().setVisibility(View.GONE); + binding.abc.getRightTextView().setVisibility(View.GONE); } else { - abc.getRightTextView().setVisibility(View.VISIBLE); + binding.abc.getRightTextView().setVisibility(View.VISIBLE); } return id; } @@ -346,23 +314,23 @@ public void getUserPage(boolean refresh) { @Override public void getUserPageSuccess(int code, UserPageBean data) { - MultiStateUtils.toContent(msv); + MultiStateUtils.toContent(binding.msv); currPage = data.getShareArticles().getCurPage() + PAGE_START; if (data.getShareArticles().getCurPage() == 1) { - abc.getTitleTextView().setText(data.getCoinInfo().getUsername()); - ImageLoader.userIcon(civ_user_icon, ""); - ImageLoader.userBlur(iv_blur, ""); - tv_user_name.setText(data.getCoinInfo().getUsername()); - tv_user_id.setText("" + data.getCoinInfo().getUserId()); - tv_user_coin.setText("" + data.getCoinInfo().getCoinCount()); - tv_user_ranking.setText("" + data.getCoinInfo().getRank()); + binding.abc.getTitleTextView().setText(data.getCoinInfo().getUsername()); + ImageLoader.userIcon(binding.civUserIcon, ""); + ImageLoader.userBlur(binding.ivBlur, ""); + binding.tvUserName.setText(data.getCoinInfo().getUsername()); + binding.tvUserId.setText("" + data.getCoinInfo().getUserId()); + binding.tvUserCoin.setText("" + data.getCoinInfo().getCoinCount()); + binding.tvUserRanking.setText("" + data.getCoinInfo().getRank()); mAdapter.setNewData(data.getShareArticles().getDatas()); mAdapter.setEnableLoadMore(true); - msv_list.setVisibility(View.VISIBLE); + binding.msvList.setVisibility(View.VISIBLE); if (data.getShareArticles().getDatas() == null || data.getShareArticles().getDatas().isEmpty()) { - MultiStateUtils.toEmpty(msv_list); + MultiStateUtils.toEmpty(binding.msvList); } else { - MultiStateUtils.toContent(msv_list); + MultiStateUtils.toContent(binding.msvList); } } else { mAdapter.addData(data.getShareArticles().getDatas()); @@ -380,7 +348,7 @@ public void getUserPageFailed(int code, String msg) { mSmartRefreshUtils.fail(); mAdapter.loadMoreFail(); if (currPage == PAGE_START) { - MultiStateUtils.toError(msv); + MultiStateUtils.toError(binding.msv); } } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java index 5e8b8a44..57d07af1 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java @@ -10,6 +10,7 @@ import android.os.Build; import android.text.TextUtils; import android.view.HapticFeedbackConstants; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -63,6 +64,7 @@ import per.goweii.cropimageview.CropImageView; import per.goweii.statusbarcompat.utils.LuminanceUtils; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentHomeBinding; import per.goweii.wanandroid.event.BannerAutoSwitchEnableEvent; import per.goweii.wanandroid.event.CloseSecondFloorEvent; import per.goweii.wanandroid.event.CollectionEvent; @@ -101,7 +103,7 @@ * @date 2019/5/11 * GitHub: https://github.com/goweii */ -public class HomeFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, HomeView { +public class HomeFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, HomeView { private static final int PAGE_START = 0; @@ -230,9 +232,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_home; + protected FragmentHomeBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentHomeBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java index 8ec65373..2e3c8b7c 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java @@ -1,14 +1,18 @@ package per.goweii.wanandroid.module.home.fragment; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; +import androidx.viewbinding.ViewBinding; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; @@ -22,6 +26,7 @@ import per.goweii.basic.ui.dialog.TipDialog; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentSearchHistoryBinding; import per.goweii.wanandroid.module.home.activity.SearchActivity; import per.goweii.wanandroid.module.home.model.HotKeyBean; import per.goweii.wanandroid.module.home.presenter.SearchHistoryPresenter; @@ -34,19 +39,7 @@ * @date 2019/5/11 * GitHub: https://github.com/goweii */ -public class SearchHistoryFragment extends BaseFragment implements SearchHistoryView { - - @BindView(R.id.rv_hot) - RecyclerView rv_hot; - @BindView(R.id.ll_history) - LinearLayout ll_history; - @BindView(R.id.rv_history) - RecyclerView rv_history; - @BindView(R.id.tv_clean) - TextView tv_clean; - @BindView(R.id.tv_down) - TextView tv_down; - +public class SearchHistoryFragment extends BaseFragment implements SearchHistoryView { private BaseQuickAdapter mHotAdapter; private BaseQuickAdapter mHistoryAdapter; @@ -57,9 +50,10 @@ public static SearchHistoryFragment create() { return new SearchHistoryFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_search_history; + protected FragmentSearchHistoryBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentSearchHistoryBinding.inflate(inflater, container, false); } @Nullable @@ -70,9 +64,9 @@ protected SearchHistoryPresenter initPresenter() { @Override protected void initView() { - rv_hot.setNestedScrollingEnabled(false); - rv_hot.setHasFixedSize(true); - rv_hot.setLayoutManager(new FlexboxLayoutManager(getContext())); + binding.rvHot.setNestedScrollingEnabled(false); + binding.rvHot.setHasFixedSize(true); + binding.rvHot.setLayoutManager(new FlexboxLayoutManager(getContext())); mHotAdapter = new BaseQuickAdapter(R.layout.rv_item_search_hot) { @Override protected void convert(BaseViewHolder helper, HotKeyBean item) { @@ -88,8 +82,8 @@ public void onItemClick(BaseQuickAdapter adapter, View view, int position) { } } }); - rv_hot.setAdapter(mHotAdapter); - rv_history.setLayoutManager(new FlexboxLayoutManager(getContext())); + binding.rvHot.setAdapter(mHotAdapter); + binding.rvHistory.setLayoutManager(new FlexboxLayoutManager(getContext())); mHistoryAdapter = new BaseQuickAdapter(R.layout.rv_item_search_history) { @Override protected void convert(BaseViewHolder helper, String item) { @@ -172,7 +166,7 @@ public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) presenter.saveHistory(mHistoryAdapter.getData()); } }); - rv_history.setAdapter(mHistoryAdapter); + binding.rvHistory.setAdapter(mHistoryAdapter); } @Override @@ -184,12 +178,12 @@ protected void loadData() { private void changeHistoryVisible() { if (mHistoryAdapter == null) { - ll_history.setVisibility(View.GONE); + binding.llHistory.setVisibility(View.GONE); } else { if (mHistoryAdapter.getData().isEmpty()) { - ll_history.setVisibility(View.GONE); + binding.llHistory.setVisibility(View.GONE); } else { - ll_history.setVisibility(View.VISIBLE); + binding.llHistory.setVisibility(View.VISIBLE); } } } @@ -202,11 +196,11 @@ private void changeRemoveMode(boolean removeMode) { mRemoveMode = removeMode; mHistoryAdapter.notifyDataSetChanged(); if (removeMode) { - tv_down.setVisibility(View.VISIBLE); - tv_clean.setVisibility(View.GONE); + binding.tvDown.setVisibility(View.VISIBLE); + binding.tvClean.setVisibility(View.GONE); } else { - tv_down.setVisibility(View.GONE); - tv_clean.setVisibility(View.VISIBLE); + binding.tvDown.setVisibility(View.GONE); + binding.tvClean.setVisibility(View.VISIBLE); } } @@ -262,7 +256,7 @@ public void addHistory(String key) { if (list.size() > max) { mHistoryAdapter.remove(list.size() - 1); } - RvScrollTopUtils.smoothScrollTop(rv_history); + RvScrollTopUtils.smoothScrollTop(binding.rvHistory); presenter.saveHistory(mHistoryAdapter.getData()); changeHistoryVisible(); } diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchResultFragment.java b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchResultFragment.java index 4c87bb9c..b4b4734f 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchResultFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchResultFragment.java @@ -1,7 +1,10 @@ package per.goweii.wanandroid.module.home.fragment; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -20,6 +23,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentSearchResultBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.module.home.presenter.SearchResultPresenter; import per.goweii.wanandroid.module.home.view.SearchResultView; @@ -35,7 +39,7 @@ * @date 2019/5/11 * GitHub: https://github.com/goweii */ -public class SearchResultFragment extends BaseFragment implements SearchResultView { +public class SearchResultFragment extends BaseFragment implements SearchResultView { private static final int PAGE_START = 0; @@ -72,9 +76,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_search_result; + protected FragmentSearchResultBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentSearchResultBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/knowledge/activity/KnowledgeArticleActivity.java b/app/src/main/java/per/goweii/wanandroid/module/knowledge/activity/KnowledgeArticleActivity.java index a81380cd..66be45fa 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/knowledge/activity/KnowledgeArticleActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/knowledge/activity/KnowledgeArticleActivity.java @@ -4,8 +4,10 @@ import android.content.Intent; import android.net.Uri; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.viewpager.widget.ViewPager; @@ -23,6 +25,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.ActivityKnowledgeArticleBinding; import per.goweii.wanandroid.event.ScrollTopEvent; import per.goweii.wanandroid.module.knowledge.fragment.KnowledgeArticleFragment; import per.goweii.wanandroid.module.knowledge.presenter.KnowledgePresenter; @@ -38,7 +41,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class KnowledgeArticleActivity extends BaseActivity implements KnowledgeView { +public class KnowledgeArticleActivity extends BaseActivity implements KnowledgeView { @BindView(R.id.abc) ActionBarCommon abc; @@ -100,9 +103,10 @@ public static void start(Context context, ArticleBean.TagsBean tag) { } } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_knowledge_article; + protected ActivityKnowledgeArticleBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityKnowledgeArticleBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeArticleFragment.java b/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeArticleFragment.java index e8eccbff..708f6689 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeArticleFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeArticleFragment.java @@ -1,8 +1,11 @@ package per.goweii.wanandroid.module.knowledge.fragment; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -21,6 +24,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentKnowledgeArticleBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.ScrollTopEvent; @@ -40,7 +44,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class KnowledgeArticleFragment extends BaseFragment implements KnowledgeArticleView { +public class KnowledgeArticleFragment extends BaseFragment implements KnowledgeArticleView { private static final int PAGE_START = 0; @@ -110,9 +114,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_knowledge_article; + protected FragmentKnowledgeArticleBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentKnowledgeArticleBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeFragment.java b/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeFragment.java index 69e46187..f9f0acba 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/knowledge/fragment/KnowledgeFragment.java @@ -1,5 +1,9 @@ package per.goweii.wanandroid.module.knowledge.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -13,6 +17,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentKnowledgeNavigationChildBinding; import per.goweii.wanandroid.module.knowledge.activity.KnowledgeArticleActivity; import per.goweii.wanandroid.module.knowledge.adapter.KnowledgeAdapter; import per.goweii.wanandroid.module.knowledge.presenter.KnowledgePresenter; @@ -26,7 +31,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class KnowledgeFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, KnowledgeView { +public class KnowledgeFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, KnowledgeView { @BindView(R.id.msv) MultiStateView msv; @@ -39,9 +44,10 @@ public static KnowledgeFragment create() { return new KnowledgeFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_knowledge_navigation_child; + protected FragmentKnowledgeNavigationChildBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentKnowledgeNavigationChildBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java b/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java index cd442b6e..7d5100dc 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java @@ -3,6 +3,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.widget.ImageView; import androidx.annotation.NonNull; @@ -21,6 +22,7 @@ import per.goweii.swipeback.SwipeBackAbility; import per.goweii.swipeback.SwipeBackDirection; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityAuthBinding; import per.goweii.wanandroid.module.login.fragment.LoginFragment; import per.goweii.wanandroid.module.login.fragment.RegisterFragment; import per.goweii.wanandroid.module.login.model.LoginInfoEntity; @@ -34,7 +36,7 @@ * @date 2019/5/15 * GitHub: https://github.com/goweii */ -public class AuthActivity extends BaseActivity implements AuthView, SwipeBackAbility.Direction { +public class AuthActivity extends BaseActivity implements AuthView, SwipeBackAbility.Direction { private static final int REQ_CODE_OPEN_QUICK_LOGIN = 1; private static final int REQ_CODE_USE_QUICK_LOGIN = 2; @@ -77,9 +79,10 @@ public int swipeBackDirection() { return SwipeBackDirection.BOTTOM; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_auth; + protected ActivityAuthBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityAuthBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt index 92e25124..2bc931d8 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt @@ -6,12 +6,14 @@ import android.content.ContextWrapper import android.content.Intent import android.os.Build import android.text.TextUtils +import android.view.LayoutInflater import android.view.View import androidx.annotation.RequiresApi import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.utils.Base64Utils.decodeToBytes import per.goweii.swipeback.SwipeBackAbility import per.goweii.swipeback.SwipeBackDirection +import per.goweii.wanandroid.databinding.ActivityQuickLoginBinding import per.goweii.wanandroid.event.LoginEvent import per.goweii.wanandroid.module.login.model.LoginInfoEntity import per.goweii.wanandroid.module.login.model.UserEntity @@ -19,7 +21,7 @@ import per.goweii.wanandroid.module.login.presenter.QuickLoginPresenter import per.goweii.wanandroid.module.login.view.QuickLoginView import per.goweii.wanandroid.utils.biometric.BiometricHelper -class QuickLoginActivity : BaseActivity(), QuickLoginView, SwipeBackAbility.Direction { +class QuickLoginActivity : BaseActivity(), QuickLoginView, SwipeBackAbility.Direction { companion object { private const val PARAMS_OPEN_OR_USE = "openOrUse" private const val PARAMS_START_PASSWORD_LOGIN_ON_FAIL = "startPasswordLoginOnFail" @@ -68,9 +70,8 @@ class QuickLoginActivity : BaseActivity(), QuickLoginView, private var startPasswordLoginOnFail = false private lateinit var biometricHelper: BiometricHelper - override fun getLayoutId(): Int { - setContentView(View(this)) - return 0 + override fun initViewBinding(inflater: LayoutInflater): ActivityQuickLoginBinding { + return ActivityQuickLoginBinding.inflate(inflater) } override fun initPresenter(): QuickLoginPresenter { diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/fragment/LoginFragment.java b/app/src/main/java/per/goweii/wanandroid/module/login/fragment/LoginFragment.java index 2a8927e8..44d38b14 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/fragment/LoginFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/login/fragment/LoginFragment.java @@ -2,9 +2,12 @@ import android.content.Context; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import butterknife.BindView; @@ -13,6 +16,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.InputMethodUtils; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentLoginBinding; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.module.login.activity.AuthActivity; import per.goweii.wanandroid.module.login.model.UserEntity; @@ -27,7 +31,7 @@ * @date 2019/5/16 * GitHub: https://github.com/goweii */ -public class LoginFragment extends BaseFragment implements LoginView { +public class LoginFragment extends BaseFragment implements LoginView { @BindView(R.id.ll_go_register) LinearLayout ll_go_register; @@ -44,9 +48,10 @@ public static LoginFragment create() { return new LoginFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_login; + protected FragmentLoginBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentLoginBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/fragment/RegisterFragment.java b/app/src/main/java/per/goweii/wanandroid/module/login/fragment/RegisterFragment.java index f8f17ea6..d47727ba 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/fragment/RegisterFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/login/fragment/RegisterFragment.java @@ -3,9 +3,12 @@ import android.content.Context; import android.os.Bundle; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import butterknife.BindView; @@ -15,6 +18,7 @@ import per.goweii.basic.utils.InputMethodUtils; import per.goweii.basic.utils.RegexUtils; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentRegisterBinding; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.module.login.activity.AuthActivity; import per.goweii.wanandroid.module.login.model.UserEntity; @@ -29,7 +33,7 @@ * @date 2019/5/16 * GitHub: https://github.com/goweii */ -public class RegisterFragment extends BaseFragment implements RegisterView { +public class RegisterFragment extends BaseFragment implements RegisterView { @BindView(R.id.ll_go_login) LinearLayout ll_go_login; @@ -48,9 +52,10 @@ public static RegisterFragment create() { return new RegisterFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_register; + protected FragmentRegisterBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentRegisterBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleActivity.kt index ce6eb5b0..2118b829 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleActivity.kt @@ -15,8 +15,6 @@ import android.view.animation.DecelerateInterpolator import android.widget.TextView import androidx.core.view.doOnLayout import androidx.core.view.isVisible -import kotlinx.android.synthetic.main.activity_article.* -import kotlinx.android.synthetic.main.activity_article_float_btn.* import per.goweii.anylayer.Layer import per.goweii.anylayer.guide.GuideLayer import per.goweii.basic.core.base.BaseActivity @@ -28,6 +26,7 @@ import per.goweii.statusbarcompat.StatusBarCompat import per.goweii.swipeback.SwipeBackAbility import per.goweii.swipeback.SwipeBackDirection import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityArticleBinding import per.goweii.wanandroid.module.main.dialog.ArticleShareDialog import per.goweii.wanandroid.module.main.presenter.ArticlePresenter import per.goweii.wanandroid.module.main.utils.FloatIconTouchListener @@ -48,7 +47,8 @@ import per.goweii.wanandroid.utils.web.interceptor.WebResUrlInterceptor * @author CuiZhen * @date 2020/2/20 */ -class ArticleActivity : BaseActivity(), ArticleView, SwipeBackAbility.Direction, SwipeBackAbility.ForceEdge { +class ArticleActivity : BaseActivity(), ArticleView, + SwipeBackAbility.Direction, SwipeBackAbility.ForceEdge { private data class FloatIcon( val container: View, val shadow: View, @@ -83,14 +83,44 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack private var floatIconsAnim: AnimatorSet? = null private val floatIcons: List by lazy { mutableListOf().apply { - add(FloatIcon(rl_icon_collect, sl_collect, cv_collect, tv_collect_tip)) - add(FloatIcon(rl_icon_read_later, sl_read_later, aiv_read_later, tv_read_later_tip)) - add(FloatIcon(rl_icon_open, sl_open, aiv_open, tv_open_tip)) - add(FloatIcon(rl_icon_share, sl_share, aiv_share, tv_share_tip)) + add( + FloatIcon( + binding.activityArticleFloatBtn.rlIconCollect, + binding.activityArticleFloatBtn.slCollect, + binding.activityArticleFloatBtn.cvCollect, + binding.activityArticleFloatBtn.tvCollectTip + ) + ) + add( + FloatIcon( + binding.activityArticleFloatBtn.rlIconReadLater, + binding.activityArticleFloatBtn.slReadLater, + binding.activityArticleFloatBtn.aivReadLater, + binding.activityArticleFloatBtn.tvReadLaterTip + ) + ) + add( + FloatIcon( + binding.activityArticleFloatBtn.rlIconOpen, + binding.activityArticleFloatBtn.slOpen, + binding.activityArticleFloatBtn.aivOpen, + binding.activityArticleFloatBtn.tvOpenTip + ) + ) + add( + FloatIcon( + binding.activityArticleFloatBtn.rlIconShare, + binding.activityArticleFloatBtn.slShare, + binding.activityArticleFloatBtn.aivShare, + binding.activityArticleFloatBtn.tvShareTip + ) + ) } } - override fun getLayoutId(): Int = R.layout.activity_article + override fun initViewBinding(inflater: LayoutInflater): ActivityArticleBinding { + return ActivityArticleBinding.inflate(inflater) + } override fun initPresenter(): ArticlePresenter = ArticlePresenter() @@ -109,7 +139,7 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack floatIcons.forEach { icons.add(FloatIconTouchListener.Icon(it.icon)) } - v_back.setOnTouchListener( + binding.activityArticleFloatBtn.vBack.setOnTouchListener( FloatIconTouchListener( icons, object : FloatIconTouchListener.OnFloatTouchedListener { @@ -124,19 +154,19 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack } }) ) - v_back.setOnClickListener { + binding.activityArticleFloatBtn.vBack.setOnClickListener { if (floatIconsVisible) toggleFloatIcons() else finish() } - v_back.setOnLongClickListener { + binding.activityArticleFloatBtn.vBack.setOnLongClickListener { toggleFloatIcons() return@setOnLongClickListener true } - aiv_share.setOnClickListener { + binding.activityArticleFloatBtn.aivShare.setOnClickListener { shareQrcode() if (floatIconsVisible) toggleFloatIcons() } - aiv_read_later.setOnClickListener { + binding.activityArticleFloatBtn.aivReadLater.setOnClickListener { presenter.isReadLater { isReadLater -> if (isReadLater) { presenter.removeReadLater() @@ -146,7 +176,7 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack } if (floatIconsVisible) toggleFloatIcons() } - aiv_open.setOnClickListener { + binding.activityArticleFloatBtn.aivOpen.setOnClickListener { UrlOpenUtils.with(presenter.articleUrl) .title(presenter.articleTitle) .articleId(presenter.articleId) @@ -157,18 +187,18 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack .open(context) if (floatIconsVisible) toggleFloatIcons() } - cv_collect.setOnClickListener { - if (cv_collect.isChecked) { + binding.activityArticleFloatBtn.cvCollect.setOnClickListener { + if (binding.activityArticleFloatBtn.cvCollect.isChecked) { presenter.collect() } else { presenter.uncollect() } if (floatIconsVisible) toggleFloatIcons() } - wc.setOnTouchDownListener { + binding.wc.setOnTouchDownListener { if (floatIconsVisible) toggleFloatIcons() } - mWebHolder = with(this, wc, pb) + mWebHolder = with(this, binding.wc, binding.activityArticleFloatBtn.pb) .setLoadCacheElseNetwork(true) .setUseInstanceCache(true) .setAllowOpenOtherApp(false) @@ -243,10 +273,11 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack .setOnPageScrollChangeListener { presenter.updateReadRecordPercent(mWebHolder.url, it) } - wc.setOnDoubleClickListener { _, _ -> - if (rl != null) { - changeRevealLayoutCenterXY(rl.width * 0.5F, rl.height * 0.5F) - } + binding.wc.setOnDoubleClickListener { _, _ -> + changeRevealLayoutCenterXY( + binding.activityArticleFloatBtn.rl.width * 0.5F, + binding.activityArticleFloatBtn.rl.height * 0.5F + ) presenter.collect() } @@ -258,15 +289,15 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack private fun showArticleFooter() { RecommendManager.getInstance().getBean { it?.articleFooter?.let { articleFooter -> - ll_footer.isVisible = true + binding.llFooter.isVisible = true - tv_footer_title.isVisible = !articleFooter.title.isNullOrBlank() - tv_footer_title.text = articleFooter.title + binding.tvFooterTitle.isVisible = !articleFooter.title.isNullOrBlank() + binding.tvFooterTitle.text = articleFooter.title - iv_footer_image.isVisible = !articleFooter.url.isNullOrBlank() + binding.ivFooterImage.isVisible = !articleFooter.url.isNullOrBlank() if (!articleFooter.url.isNullOrEmpty()) { - ImageLoader.image(iv_footer_image, articleFooter.url) - iv_footer_image.setOnClickListener { + ImageLoader.image(binding.ivFooterImage, articleFooter.url) + binding.ivFooterImage.setOnClickListener { Router.routeTo(articleFooter.route) } } @@ -335,17 +366,17 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack ) ) addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { floatIcon.tip.visible() } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } }) } @@ -368,21 +399,21 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack addListener(object : Animator.AnimatorListener { private var endByCancel = false - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { floatIcon.tip.visible() } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { if (endByCancel) return if (floatIcon.tip.translationX != 0F) { floatIcon.tip.invisible() } } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { endByCancel = true } }) @@ -401,14 +432,14 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack floatIconsAnim = AnimatorSet().apply { val anims = mutableListOf() anims.add(ObjectAnimator.ofFloat( - fl_back, "rotation", - fl_back.rotation, if (floatIconsVisible) 360F else 0F + binding.activityArticleFloatBtn.flBack, "rotation", + binding.activityArticleFloatBtn.flBack.rotation, if (floatIconsVisible) 360F else 0F ).apply { duration = 300L addUpdateListener { if (it.animatedFraction > 0.5F) { - if (floatIconsVisible) iv_close?.visible() - else iv_close?.invisible() + if (floatIconsVisible) binding.activityArticleFloatBtn.ivClose.visible() + else binding.activityArticleFloatBtn.ivClose.invisible() } } }) @@ -435,20 +466,20 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack } floatIconsAnim?.apply { addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { floatIcons.forEach { it.container.visible() } } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { floatIcons.forEach { if (it.container.translationY == 0F) it.container.invisible() } } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } }) }?.start() @@ -469,13 +500,13 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack } private fun changeRevealLayoutCenterXY(x: Float, y: Float) { - rl.setCenter(x, y) - cv_collect.setCenter(x, y) + binding.activityArticleFloatBtn.rl.setCenter(x, y) + binding.activityArticleFloatBtn.cvCollect.setCenter(x, y) } private fun switchCollectView(anim: Boolean = true) { - rl.setChecked(presenter.collected, anim) - cv_collect.setChecked(presenter.collected, anim) + binding.activityArticleFloatBtn.rl.setChecked(presenter.collected, anim) + binding.activityArticleFloatBtn.cvCollect.setChecked(presenter.collected, anim) } override fun collectSuccess() { @@ -518,18 +549,18 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack private fun switchReadLaterIcon() { if (presenter.readLater) { - aiv_read_later.setImageResource(R.drawable.ic_read_later_added) - aiv_read_later.setColorFilter( + binding.activityArticleFloatBtn.aivReadLater.setImageResource(R.drawable.ic_read_later_added) + binding.activityArticleFloatBtn.aivReadLater.setColorFilter( ResUtils.getThemeColor( - aiv_read_later, + binding.activityArticleFloatBtn.aivReadLater, R.attr.colorIconMain ) ) } else { - aiv_read_later.setImageResource(R.drawable.ic_read_later) - aiv_read_later.setColorFilter( + binding.activityArticleFloatBtn.aivReadLater.setImageResource(R.drawable.ic_read_later) + binding.activityArticleFloatBtn.aivReadLater.setColorFilter( ResUtils.getThemeColor( - aiv_read_later, + binding.activityArticleFloatBtn.aivReadLater, R.attr.colorIconSurface ) ) @@ -553,9 +584,14 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack private fun showGuideBackBtnDialog(onDismiss: () -> Unit) { GuideLayer(this@ArticleActivity) - .setBackgroundColorInt(ResUtils.getThemeColor(aiv_read_later, R.attr.colorDialogBg)) + .setBackgroundColorInt( + ResUtils.getThemeColor( + binding.activityArticleFloatBtn.aivReadLater, + R.attr.colorDialogBg + ) + ) .addMapping(GuideLayer.Mapping().apply { - setTargetView(iv_close) + setTargetView(binding.activityArticleFloatBtn.ivClose) cornerRadius = 9999F guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_tip, null, false).apply { @@ -598,7 +634,12 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack @SuppressLint("InflateParams") private fun showGuideDoubleTapDialog(onDismiss: () -> Unit) { GuideLayer(this@ArticleActivity) - .setBackgroundColorInt(ResUtils.getThemeColor(aiv_read_later, R.attr.colorDialogBg)) + .setBackgroundColorInt( + ResUtils.getThemeColor( + binding.activityArticleFloatBtn.aivReadLater, + R.attr.colorDialogBg + ) + ) .addMapping(GuideLayer.Mapping().apply { val cx = window?.decorView?.width ?: 0 / 2 val cy = window?.decorView?.height ?: 0 / 2 @@ -642,7 +683,12 @@ class ArticleActivity : BaseActivity(), ArticleView, SwipeBack private fun showGuidePreviewImageDialog(onDismiss: () -> Unit) { GuideLayer(this@ArticleActivity) - .setBackgroundColorInt(ResUtils.getThemeColor(aiv_read_later, R.attr.colorDialogBg)) + .setBackgroundColorInt( + ResUtils.getThemeColor( + binding.activityArticleFloatBtn.aivReadLater, + R.attr.colorDialogBg + ) + ) .addMapping(GuideLayer.Mapping().apply { val cx = window?.decorView?.width ?: 0 / 2 val cy = window?.decorView?.height ?: 0 / 2 diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleListActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleListActivity.kt index ba675046..e5f4109a 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleListActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ArticleListActivity.kt @@ -1,16 +1,18 @@ package per.goweii.wanandroid.module.main.activity +import android.view.LayoutInflater import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.core.base.BasePresenter import per.goweii.basic.core.base.BaseView import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityArticleListBinding import per.goweii.wanandroid.module.main.model.ChapterBean /** * @author CuiZhen * @date 2020/3/22 */ -class ArticleListActivity : BaseActivity>() { +class ArticleListActivity : BaseActivity, ActivityArticleListBinding>() { companion object { @JvmStatic @@ -19,7 +21,9 @@ class ArticleListActivity : BaseActivity>() { } } - override fun getLayoutId(): Int = R.layout.activity_article_list + override fun initViewBinding(inflater: LayoutInflater): ActivityArticleListBinding { + return ActivityArticleListBinding.inflate(inflater) + } override fun initPresenter(): BasePresenter? = null diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/BringToFrontActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/BringToFrontActivity.java index 3fe2e143..d2a0c088 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/BringToFrontActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/BringToFrontActivity.java @@ -2,8 +2,11 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.core.base.BaseActivity; import per.goweii.basic.core.mvp.MvpPresenter; @@ -14,9 +17,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return 0; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater) { + return null; } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt index 22e499de..933ee63a 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt @@ -9,16 +9,17 @@ import android.os.Process import android.view.View import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity -import kotlinx.android.synthetic.main.activity_crash.* import per.goweii.ponyo.crash.Crash import per.goweii.statusbarcompat.StatusBarCompat import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityCrashBinding import per.goweii.wanandroid.utils.DarkModeUtils import java.io.PrintWriter import java.io.StringWriter import kotlin.system.exitProcess class CrashActivity : AppCompatActivity() { + private lateinit var binding: ActivityCrashBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -29,18 +30,19 @@ class CrashActivity : AppCompatActivity() { window.statusBarColor = Color.TRANSPARENT DarkModeUtils.initDarkMode() StatusBarCompat.setIconMode(this, !DarkModeUtils.isDarkMode(this)) - setContentView(R.layout.activity_crash) - tv_copy_log.setOnClickListener { + binding = ActivityCrashBinding.inflate(layoutInflater) + setContentView(binding.root) + binding.tvCopyLog.setOnClickListener { val cm = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - cm.setPrimaryClip(ClipData.newPlainText("error", tv_error.text)) - tv_copy_log.text = "已复制" + cm.setPrimaryClip(ClipData.newPlainText("error", binding.tvError.text)) + binding.tvCopyLog.text = "已复制" } - btn_exit.setOnClickListener { + binding.btnExit.setOnClickListener { finish() Process.killProcess(Process.myPid()) exitProcess(10) } - btn_restart.setOnClickListener { + binding.btnRestart.setOnClickListener { Crash.restartApp(applicationContext) finish() Process.killProcess(Process.myPid()) @@ -53,7 +55,7 @@ class CrashActivity : AppCompatActivity() { val stringWriter = StringWriter() val printWriter = PrintWriter(stringWriter) e.printStackTrace(printWriter) - tv_error.text = stringWriter.toString().toDBC() + binding.tvError.text = stringWriter.toString().toDBC() } private fun String.toDBC(): String { diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/InstallApkActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/InstallApkActivity.java index 348c4179..e1e8f502 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/InstallApkActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/InstallApkActivity.java @@ -3,20 +3,24 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.view.LayoutInflater; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import java.io.File; import per.goweii.anypermission.AnyPermission; import per.goweii.anypermission.RequestListener; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.utils.LogUtils; import per.goweii.wanandroid.common.WanApp; import per.goweii.wanandroid.utils.ThemeUtils; -public class InstallApkActivity extends BaseActivity { +public class InstallApkActivity extends BaseActivity { private static final String APK_PATH = "apk_path"; public static void start(Context context, File apk) { @@ -27,14 +31,15 @@ public static void start(Context context, File apk) { private File apkFile; + @Nullable @Override - protected int getLayoutId() { - return 0; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater) { + return null; } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java index 8cf5f78d..7559f465 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java @@ -6,6 +6,7 @@ import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; @@ -30,6 +31,7 @@ import per.goweii.basic.utils.display.DisplayInfoUtils; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.WanApp; +import per.goweii.wanandroid.databinding.ActivityMainBinding; import per.goweii.wanandroid.db.model.ReadLaterModel; import per.goweii.wanandroid.event.BannerAutoSwitchEnableEvent; import per.goweii.wanandroid.event.CloseSecondFloorEvent; @@ -58,7 +60,7 @@ import per.goweii.wanandroid.utils.UserUtils; import per.goweii.wanandroid.utils.wanpwd.WanPwdParser; -public class MainActivity extends BaseActivity implements MainView { +public class MainActivity extends BaseActivity implements MainView { private static final int REQ_CODE_PERMISSION = 1; @@ -101,9 +103,10 @@ protected void initWindow() { getWindow().setBackgroundDrawable(new ColorDrawable(ResUtils.getThemeColor(this, R.attr.colorBackground))); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_main; + protected ActivityMainBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityMainBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/RouterActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/RouterActivity.java index 7e05c7ea..8b2c3016 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/RouterActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/RouterActivity.java @@ -6,9 +6,11 @@ import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; +import android.view.LayoutInflater; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.core.base.BaseActivity; import per.goweii.basic.core.mvp.MvpPresenter; @@ -33,9 +35,10 @@ public int swipeBackDirection() { return 0; } + @Nullable @Override - protected int getLayoutId() { - return 0; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater) { + return null; } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt index 2efc9e36..a83b10a9 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt @@ -6,9 +6,9 @@ import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.app.Activity import android.content.Intent +import android.view.LayoutInflater import android.view.View import android.view.animation.DecelerateInterpolator -import kotlinx.android.synthetic.main.activity_scan.* import per.goweii.anypermission.AnyPermission import per.goweii.anypermission.RequestListener import per.goweii.anypermission.RuntimeRequester @@ -31,6 +31,7 @@ import per.goweii.swipeback.SwipeBackAbility import per.goweii.swipeback.SwipeBackDirection import per.goweii.swipeback.SwipeBackTransformer import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityScanBinding import per.goweii.wanandroid.module.main.presenter.ScanPresenter import per.goweii.wanandroid.module.main.view.ScanView import per.goweii.wanandroid.utils.PictureSelector @@ -40,7 +41,7 @@ import per.goweii.wanandroid.utils.UrlOpenUtils * @author CuiZhen * @date 2020/2/26 */ -class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.Direction, SwipeBackAbility.Transformer { +class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.Direction, SwipeBackAbility.Transformer { companion object { private const val REQ_CODE_PERMISSION_CAMERA = 1 @@ -78,35 +79,37 @@ class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.D override fun swipeBackTransformer(): SwipeBackTransformer? = null - override fun getLayoutId(): Int = R.layout.activity_scan + override fun initViewBinding(inflater: LayoutInflater): ActivityScanBinding { + return ActivityScanBinding.inflate(inflater) + } override fun initPresenter(): ScanPresenter = ScanPresenter() override fun initView() { StatusBarCompat.transparent(this) - ivClose.setOnClickListener { + binding.ivClose.setOnClickListener { finish() } - ivTorch.invisible() - ivAlbum.setOnClickListener { + binding.ivTorch.invisible() + binding.ivAlbum.setOnClickListener { startAlbum() } - ivTorch.setOnClickListener { - codeScanner?.enableTorch(!ivTorch.isSelected) + binding.ivTorch.setOnClickListener { + codeScanner?.enableTorch(!binding.ivTorch.isSelected) } - codeScanner = code_scanner.apply { + codeScanner = binding.codeScanner.apply { cameraProxyLiveData.observe(this@ScanActivity) { cameraProxy -> cameraProxy?.torchState?.observe(this@ScanActivity) { torchState -> when (torchState) { - CameraProxy.TORCH_ON -> ivTorch.isSelected = true - CameraProxy.TORCH_OFF -> ivTorch.isSelected = false + CameraProxy.TORCH_ON -> binding.ivTorch.isSelected = true + CameraProxy.TORCH_OFF -> binding.ivTorch.isSelected = false } } } addProcessor(ZXingMultiScanQRCodeProcessor()) addDecorator( - frozen_view, - finder_view, + binding.frozenView, + binding.finderView, BeepDecorator(), VibrateDecorator(), GestureDecorator() @@ -160,8 +163,8 @@ class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.D .request(object : RequestListener { @SuppressLint("MissingPermission") override fun onSuccess() { - ivTorch.visible() - finder_view.visible() + binding.ivTorch.visible() + binding.finderView.visible() codeScanner?.startScan() } @@ -175,8 +178,8 @@ class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.D } private fun stopScan() { - ivTorch.invisible() - finder_view.invisible() + binding.ivTorch.invisible() + binding.finderView.invisible() codeScanner?.stopScan() } @@ -275,34 +278,33 @@ class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.D } private fun showTip(text: String, btnSure: String, onSure: View.OnClickListener, btnCancel: String? = null, onCancel: View.OnClickListener? = null) { - llTip ?: return - tvTipText.text = text - tvTipBtnSure.text = btnSure + binding.llTip ?: return + binding.tvTipText.text = text + binding.tvTipBtnSure.text = btnSure if (btnCancel.isNullOrEmpty()) { - tvTipBtnCancel.gone() + binding.tvTipBtnCancel.gone() } else { - tvTipBtnCancel.visible() - tvTipBtnCancel.text = btnCancel - tvTipBtnCancel.setOnClickListener(onCancel) + binding.tvTipBtnCancel.visible() + binding.tvTipBtnCancel.text = btnCancel + binding.tvTipBtnCancel.setOnClickListener(onCancel) } - llTip.setOnClickListener(onSure) + binding.llTip.setOnClickListener(onSure) cancelTipAnim() - tvTipAnim = ObjectAnimator.ofFloat(llTip, "alpha", 0F, 1F).apply { + tvTipAnim = ObjectAnimator.ofFloat(binding.llTip, "alpha", 0F, 1F).apply { duration = 300 interpolator = DecelerateInterpolator() addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } - override fun onAnimationStart(animation: Animator?) { - llTip ?: return - llTip.visible() + override fun onAnimationStart(animation: Animator) { + binding.llTip.visible() } }) start() @@ -310,35 +312,32 @@ class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.D } private fun hideTip() { - llTip ?: return cancelTipAnim() - if (llTip.visibility != View.VISIBLE) { + if (binding.llTip.visibility != View.VISIBLE) { return } - tvTipText.text = "" - tvTipBtnSure.text = "" - tvTipBtnCancel.text = "" - tvTipBtnCancel.gone() - tvTipBtnCancel.setOnClickListener(null) - llTip.setOnClickListener(null) - tvTipAnim = ObjectAnimator.ofFloat(llTip, "alpha", 1F, 0F).apply { + binding.tvTipText.text = "" + binding.tvTipBtnSure.text = "" + binding.tvTipBtnCancel.text = "" + binding.tvTipBtnCancel.gone() + binding.tvTipBtnCancel.setOnClickListener(null) + binding.llTip.setOnClickListener(null) + tvTipAnim = ObjectAnimator.ofFloat(binding.llTip, "alpha", 1F, 0F).apply { duration = 300 interpolator = DecelerateInterpolator() addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { - llTip ?: return - llTip.gone() + override fun onAnimationEnd(animation: Animator) { + binding.llTip.gone() } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } - override fun onAnimationStart(animation: Animator?) { - llTip ?: return - llTip.visible() + override fun onAnimationStart(animation: Animator) { + binding.llTip.visible() } }) start() diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ShareArticleActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ShareArticleActivity.java index b1098939..0e2e649c 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ShareArticleActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ShareArticleActivity.java @@ -5,6 +5,7 @@ import android.net.Uri; import android.text.Editable; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import android.widget.TextView; @@ -23,6 +24,7 @@ import per.goweii.basic.utils.listener.SimpleTextWatcher; import per.goweii.rxhttp.request.base.BaseBean; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityShareArticleBinding; import per.goweii.wanandroid.module.main.presenter.ShareArticlePresenter; import per.goweii.wanandroid.module.main.view.ShareArticleView; import per.goweii.wanandroid.utils.UrlOpenUtils; @@ -35,7 +37,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class ShareArticleActivity extends BaseActivity implements ShareArticleView { +public class ShareArticleActivity extends BaseActivity implements ShareArticleView { private static final String TAG = ShareArticleActivity.class.getSimpleName(); @@ -70,9 +72,10 @@ public static void start(Context context, String title, String link) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_share_article; + protected ActivityShareArticleBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityShareArticleBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/SplashActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/SplashActivity.java index a5ee0123..42de2e19 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/SplashActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/SplashActivity.java @@ -1,10 +1,15 @@ package per.goweii.wanandroid.module.main.activity; +import android.view.LayoutInflater; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.core.base.BaseActivity; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivitySplashBinding; /** * @author CuiZhen @@ -13,10 +18,11 @@ */ public class SplashActivity extends BaseActivity { + @Nullable @Override - protected int getLayoutId() { - // return R.layout.activity_splash; - return 0; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater) { +// return ActivitySplashBinding.inflate(inflater); + return null; } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java index 5260a4b5..b070e76f 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java @@ -5,6 +5,7 @@ import android.net.Uri; import android.text.TextUtils; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; @@ -31,6 +32,7 @@ import per.goweii.swipeback.SwipeBackAbility; import per.goweii.wanandroid.BuildConfig; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityWebBinding; import per.goweii.wanandroid.db.model.ReadLaterModel; import per.goweii.wanandroid.module.main.dialog.ArticleShareDialog; import per.goweii.wanandroid.module.main.dialog.WebGuideDialog; @@ -49,7 +51,7 @@ * @date 2019/5/15 * GitHub: https://github.com/goweii */ -public class WebActivity extends BaseActivity implements per.goweii.wanandroid.module.main.view.WebView, SwipeBackAbility.OnlyEdge, SwipeBackAbility.ForceEdge { +public class WebActivity extends BaseActivity implements per.goweii.wanandroid.module.main.view.WebView, SwipeBackAbility.OnlyEdge, SwipeBackAbility.ForceEdge { @BindView(R.id.ab) ActionBarEx ab; @@ -102,9 +104,10 @@ public boolean swipeBackForceEdge() { return true; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_web; + protected ActivityWebBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityWebBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/ArticleListFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/ArticleListFragment.kt index 6bd737d2..5200ad13 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/ArticleListFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/ArticleListFragment.kt @@ -1,7 +1,10 @@ package per.goweii.wanandroid.module.main.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import per.goweii.basic.core.base.BaseFragment import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentArticleListBinding import per.goweii.wanandroid.module.main.contract.ArticleListPresenter import per.goweii.wanandroid.module.main.contract.ArticleListView @@ -9,9 +12,14 @@ import per.goweii.wanandroid.module.main.contract.ArticleListView * @author CuiZhen * @date 2020/3/22 */ -class ArticleListFragment : BaseFragment(), ArticleListView { +class ArticleListFragment : BaseFragment(), ArticleListView { - override fun getLayoutRes(): Int = R.layout.fragment_article_list + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentArticleListBinding { + return FragmentArticleListBinding.inflate(inflater, container, false) + } override fun initPresenter(): ArticleListPresenter = ArticleListPresenter() diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/BookmarkFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/BookmarkFragment.kt index 3c7fc062..d1c2255b 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/BookmarkFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/BookmarkFragment.kt @@ -1,14 +1,16 @@ package per.goweii.wanandroid.module.main.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.scwang.smart.refresh.layout.api.RefreshFooter import com.scwang.smart.refresh.layout.constant.RefreshState -import kotlinx.android.synthetic.main.fragment_bookmark.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import per.goweii.basic.core.base.BaseFragment import per.goweii.basic.core.utils.SmartRefreshUtils import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentBookmarkBinding import per.goweii.wanandroid.db.model.ReadLaterModel import per.goweii.wanandroid.event.CloseSecondFloorEvent import per.goweii.wanandroid.event.ReadLaterEvent @@ -24,48 +26,53 @@ import per.goweii.wanandroid.utils.RvConfigUtils import per.goweii.wanandroid.utils.UrlOpenUtils import per.goweii.wanandroid.widget.refresh.SimpleOnMultiListener -class BookmarkFragment : BaseFragment(), BookmarkView { +class BookmarkFragment : BaseFragment(), BookmarkView { private lateinit var mAdapter: BookmarkAdapter private var offset = 0 private val perPageCount = 20 - override fun getLayoutRes(): Int = R.layout.fragment_bookmark + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentBookmarkBinding { + return FragmentBookmarkBinding.inflate(inflater, container, false) + } override fun initPresenter(): BookmarkPresenter = BookmarkPresenter() override fun initView() { - SmartRefreshUtils.with(srl).pureScrollMode() - srl.setOnMultiListener(object : SimpleOnMultiListener() { + SmartRefreshUtils.with(binding.srl).pureScrollMode() + binding.srl.setOnMultiListener(object : SimpleOnMultiListener() { override fun onFooterMoving(footer: RefreshFooter?, isDragging: Boolean, percent: Float, offset: Int, footerHeight: Int, maxDragHeight: Int) { super.onFooterMoving(footer, isDragging, percent, offset, footerHeight, maxDragHeight) - if (srl.state != RefreshState.PullUpCanceled && isDragging && percent > 1.2F) { - srl.closeHeaderOrFooter() + if (binding.srl.state != RefreshState.PullUpCanceled && isDragging && percent > 1.2F) { + binding.srl.closeHeaderOrFooter() CloseSecondFloorEvent().post() } } }) - rv.layoutManager = LinearLayoutManager(context) + binding.rv.layoutManager = LinearLayoutManager(context) mAdapter = BookmarkAdapter() RvConfigUtils.init(mAdapter) mAdapter.setEnableLoadMore(true) - mAdapter.setOnLoadMoreListener({ getPageList() }, rv) + mAdapter.setOnLoadMoreListener({ getPageList() }, binding.rv) mAdapter.setOnItemClickListener { _, _, position -> mAdapter.getItem(position)?.let { item -> UrlOpenUtils.with(item.link).open(context) } } - rv.adapter = mAdapter - setEmptyAndErrorClick(msv) { - toLoading(msv) + binding.rv.adapter = mAdapter + setEmptyAndErrorClick(binding.msv) { + toLoading(binding.msv) offset = 0 getPageList() } } override fun loadData() { - toLoading(msv) + toLoading(binding.msv) } override fun onVisible(isFirstVisible: Boolean) { @@ -95,9 +102,9 @@ class BookmarkFragment : BaseFragment(), BookmarkView { if (offset == 0) { mAdapter.setNewData(list) if (list.isEmpty()) { - toEmpty(msv, true) + toEmpty(binding.msv, true) } else { - toContent(msv) + toContent(binding.msv) } } else { mAdapter.addData(list) @@ -111,7 +118,7 @@ class BookmarkFragment : BaseFragment(), BookmarkView { override fun getBookmarkListFailed() { if (offset == 0) { - toError(msv) + toError(binding.msv) } else { mAdapter.loadMoreFail() } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java index c6f6302a..d04d46b9 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java @@ -1,5 +1,9 @@ package per.goweii.wanandroid.module.main.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; @@ -8,10 +12,12 @@ import per.goweii.actionbarex.ActionBarEx; import per.goweii.basic.core.adapter.FixedFragmentPagerAdapter; import per.goweii.basic.core.base.BaseFragment; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.FragmentKnowledgeNavigationBinding; import per.goweii.wanandroid.module.knowledge.fragment.KnowledgeFragment; import per.goweii.wanandroid.module.navigation.fragment.NaviFragment; import per.goweii.wanandroid.utils.MagicIndicatorUtils; @@ -22,7 +28,7 @@ * @date 2019/5/19 * GitHub: https://github.com/goweii */ -public class KnowledgeNavigationFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { +public class KnowledgeNavigationFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { @BindView(R.id.ab) ActionBarEx ab; @@ -37,14 +43,15 @@ public static KnowledgeNavigationFragment create() { return new KnowledgeNavigationFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_knowledge_navigation; + protected FragmentKnowledgeNavigationBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentKnowledgeNavigationBinding.inflate(inflater, container, false); } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java index 7c89ff60..fdb69cdd 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java @@ -1,7 +1,10 @@ package per.goweii.wanandroid.module.main.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.viewpager.widget.ViewPager; @@ -13,6 +16,7 @@ import per.goweii.basic.core.base.BaseFragment; import per.goweii.basic.core.base.BasePresenter; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentMainBinding; import per.goweii.wanandroid.event.CloseSecondFloorEvent; import per.goweii.wanandroid.event.MessageCountEvent; import per.goweii.wanandroid.module.home.fragment.HomeFragment; @@ -21,7 +25,7 @@ import per.goweii.wanandroid.module.mine.fragment.MineFragment; import per.goweii.wanandroid.module.question.fragment.QuestionFragment; -public class MainFragment extends BaseFragment { +public class MainFragment extends BaseFragment { @BindView(R.id.vp_tab) ViewPager vp_tab; @@ -49,9 +53,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_main; + protected FragmentMainBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentMainBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/UserArticleFragment.java b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/UserArticleFragment.java index b79562af..7f1f0d9a 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/UserArticleFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/UserArticleFragment.java @@ -1,7 +1,10 @@ package per.goweii.wanandroid.module.main.fragment; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -23,6 +26,7 @@ import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.FragmentUserArticleBinding; import per.goweii.wanandroid.event.ArticleShareEvent; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.event.LoginEvent; @@ -42,7 +46,7 @@ * @date 2019/5/18 * GitHub: https://github.com/goweii */ -public class UserArticleFragment extends BaseFragment implements UserArticleView { +public class UserArticleFragment extends BaseFragment implements UserArticleView { private static final int PAGE_START = 0; @@ -95,9 +99,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_user_article; + protected FragmentUserArticleBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentUserArticleBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java index c6d0a5c8..e4205a37 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -30,6 +31,7 @@ import per.goweii.codex.encoder.CodeEncoder; import per.goweii.codex.processor.zxing.ZXingEncodeQRCodeProcessor; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityAboutBinding; import per.goweii.wanandroid.module.main.dialog.CardShareDialog; import per.goweii.wanandroid.module.main.dialog.DownloadDialog; import per.goweii.wanandroid.module.main.model.UpdateBean; @@ -44,7 +46,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class AboutActivity extends BaseActivity implements AboutView { +public class AboutActivity extends BaseActivity implements AboutView { private static final int UPDATE_TYPE_REFRESH = 1; private static final int UPDATE_TYPE_NOTICE = 2; private static final int UPDATE_TYPE_SHARE = 3; @@ -73,9 +75,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_about; + protected ActivityAboutBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityAboutBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java index 691dfadc..2f7b1b76 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java @@ -10,6 +10,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; @@ -17,6 +18,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.daimajia.swipe.SwipeLayout; @@ -41,6 +43,7 @@ import per.goweii.percentimageview.percentimageview.PercentImageView; import per.goweii.wanandroid.BuildConfig; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityAboutMeBinding; import per.goweii.wanandroid.module.mine.model.AboutMeBean; import per.goweii.wanandroid.module.mine.presenter.AboutMePresenter; import per.goweii.wanandroid.module.mine.view.AboutMeView; @@ -53,7 +56,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class AboutMeActivity extends BaseActivity implements AboutMeView { +public class AboutMeActivity extends BaseActivity implements AboutMeView { private static final int REQUEST_CODE_PERMISSION = 1; @@ -101,9 +104,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_about_me; + protected ActivityAboutMeBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityAboutMeBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinActivity.java index 6721a227..cdfbc10b 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinActivity.java @@ -2,9 +2,11 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -20,6 +22,7 @@ import per.goweii.basic.utils.listener.OnClickListener2; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityCoinBinding; import per.goweii.wanandroid.module.main.dialog.WebDialog; import per.goweii.wanandroid.module.mine.adapter.CoinRecordAdapter; import per.goweii.wanandroid.module.mine.model.CoinRecordBean; @@ -33,7 +36,7 @@ * @date 2019/8/31 * GitHub: https://github.com/goweii */ -public class CoinActivity extends BaseActivity implements CoinView { +public class CoinActivity extends BaseActivity implements CoinView { private static final int PAGE_START = 1; @@ -54,9 +57,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_coin; + protected ActivityCoinBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityCoinBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinRankActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinRankActivity.java index 95484ffb..43f5df85 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinRankActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CoinRankActivity.java @@ -2,8 +2,10 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -17,6 +19,7 @@ import per.goweii.basic.core.base.BaseActivity; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityCoinRankBinding; import per.goweii.wanandroid.module.home.activity.UserPageActivity; import per.goweii.wanandroid.module.main.model.CoinInfoBean; import per.goweii.wanandroid.module.mine.adapter.CoinRankAdapter; @@ -31,7 +34,7 @@ * @date 2019/8/31 * GitHub: https://github.com/goweii */ -public class CoinRankActivity extends BaseActivity implements CoinRankView { +public class CoinRankActivity extends BaseActivity implements CoinRankView { private static final int PAGE_START = 1; @@ -50,9 +53,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_coin_rank; + protected ActivityCoinRankBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityCoinRankBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java index df5b40b9..b1da41fc 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java @@ -2,9 +2,11 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; @@ -13,10 +15,12 @@ import per.goweii.actionbarex.ActionBarEx; import per.goweii.basic.core.adapter.FixedFragmentPagerAdapter; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.ActivityCollectionBinding; import per.goweii.wanandroid.module.mine.fragment.CollectionArticleFragment; import per.goweii.wanandroid.module.mine.fragment.CollectionLinkFragment; import per.goweii.wanandroid.utils.MagicIndicatorUtils; @@ -27,7 +31,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class CollectionActivity extends BaseActivity { +public class CollectionActivity extends BaseActivity { @BindView(R.id.ab) ActionBarEx ab; @@ -43,14 +47,15 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_collection; + protected ActivityCollectionBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityCollectionBinding.inflate(inflater); } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java index 2a2d15d3..13210f36 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java @@ -2,9 +2,11 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; @@ -13,10 +15,12 @@ import per.goweii.actionbarex.ActionBarEx; import per.goweii.basic.core.adapter.FixedFragmentPagerAdapter; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.ActivityHostInterruptBinding; import per.goweii.wanandroid.module.mine.fragment.HostBlackFragment; import per.goweii.wanandroid.module.mine.fragment.HostWhiteFragment; import per.goweii.wanandroid.utils.MagicIndicatorUtils; @@ -27,7 +31,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class HostInterruptActivity extends BaseActivity { +public class HostInterruptActivity extends BaseActivity { @BindView(R.id.ab) ActionBarEx ab; @@ -43,14 +47,15 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_host_interrupt; + protected ActivityHostInterruptBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityHostInterruptBinding.inflate(inflater); } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt index 091c6626..dbc8f34f 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt @@ -2,9 +2,9 @@ package per.goweii.wanandroid.module.mine.activity import android.content.Context import android.content.Intent +import android.view.LayoutInflater import android.view.View import butterknife.BindView -import kotlinx.android.synthetic.main.activity_message.* import per.goweii.actionbarex.ActionBarEx import per.goweii.actionbarex.common.ActionIconView import per.goweii.basic.core.adapter.FixedFragmentPagerAdapter @@ -12,6 +12,7 @@ import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.core.base.BasePresenter import per.goweii.basic.core.base.BaseView import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityMessageBinding import per.goweii.wanandroid.module.mine.fragment.MessageReadedFragment import per.goweii.wanandroid.module.mine.fragment.MessageUnreadFragment import per.goweii.wanandroid.utils.MagicIndicatorUtils @@ -21,7 +22,7 @@ import per.goweii.wanandroid.utils.MagicIndicatorUtils * @date 2019/5/17 * GitHub: https://github.com/goweii */ -class MessageActivity : BaseActivity>() { +class MessageActivity : BaseActivity, ActivityMessageBinding>() { @BindView(R.id.ab) lateinit var ab: ActionBarEx @@ -34,7 +35,9 @@ class MessageActivity : BaseActivity>() { } } - override fun getLayoutId() = R.layout.activity_message + override fun initViewBinding(inflater: LayoutInflater): ActivityMessageBinding { + return ActivityMessageBinding.inflate(inflater) + } override fun initPresenter(): BasePresenter? = null @@ -51,8 +54,8 @@ class MessageActivity : BaseActivity>() { MessageUnreadFragment.create(), MessageReadedFragment.create() ) - vp.adapter = adapter - MagicIndicatorUtils.commonNavigator(ab.getView(R.id.mi), vp, adapter, null) + binding.vp.adapter = adapter + MagicIndicatorUtils.commonNavigator(ab.getView(R.id.mi), binding.vp, adapter, null) } override fun loadData() {} diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MineShareActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MineShareActivity.java index 4aa42340..7331689a 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MineShareActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MineShareActivity.java @@ -2,8 +2,10 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -24,6 +26,7 @@ import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.ActivityMineShareBinding; import per.goweii.wanandroid.event.ArticleDeleteEvent; import per.goweii.wanandroid.event.ArticleShareEvent; import per.goweii.wanandroid.event.CollectionEvent; @@ -43,7 +46,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class MineShareActivity extends BaseActivity implements MineShareView { +public class MineShareActivity extends BaseActivity implements MineShareView { public static final int PAGE_START = 1; @@ -106,9 +109,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_mine_share; + protected ActivityMineShareBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityMineShareBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/OpenActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/OpenActivity.java index be0191ee..5080f827 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/OpenActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/OpenActivity.java @@ -3,8 +3,10 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -19,8 +21,10 @@ import butterknife.BindView; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.base.BasePresenter; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityOpenBinding; import per.goweii.wanandroid.module.mine.model.OpenEntity; import per.goweii.wanandroid.utils.MultiStateUtils; import per.goweii.wanandroid.utils.UrlOpenUtils; @@ -30,7 +34,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class OpenActivity extends BaseActivity { +public class OpenActivity extends BaseActivity { @BindView(R.id.msv) MultiStateView msv; @@ -46,14 +50,15 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_open; + protected ActivityOpenBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityOpenBinding.inflate(inflater); } @Nullable @Override - protected MvpPresenter initPresenter() { + protected BasePresenter initPresenter() { return null; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java index 03ff419b..466a35ab 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java @@ -3,8 +3,10 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -30,6 +32,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityReadLaterBinding; import per.goweii.wanandroid.db.model.ReadLaterModel; import per.goweii.wanandroid.event.ReadLaterEvent; import per.goweii.wanandroid.module.mine.adapter.ReadLaterAdapter; @@ -44,7 +47,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class ReadLaterActivity extends BaseActivity implements ReadLaterView { +public class ReadLaterActivity extends BaseActivity implements ReadLaterView { @BindView(R.id.abc) ActionBarCommon abc; @@ -80,9 +83,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_read_later; + protected ActivityReadLaterBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityReadLaterBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java index d34f0ae2..35568007 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java @@ -3,8 +3,10 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -30,6 +32,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.ActivityReadRecordBinding; import per.goweii.wanandroid.db.model.ReadRecordModel; import per.goweii.wanandroid.event.ReadRecordAddedEvent; import per.goweii.wanandroid.event.ReadRecordUpdateEvent; @@ -45,7 +48,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class ReadRecordActivity extends BaseActivity implements ReadRecordView { +public class ReadRecordActivity extends BaseActivity implements ReadRecordView { @BindView(R.id.abc) ActionBarCommon abc; @@ -112,9 +115,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_read_record; + protected ActivityReadRecordBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivityReadRecordBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index 62643e96..225aeeca 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -3,11 +3,13 @@ import android.Manifest; import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; import android.view.View; import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.SwitchCompat; @@ -34,6 +36,7 @@ import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Constant; import per.goweii.wanandroid.common.WanApp; +import per.goweii.wanandroid.databinding.ActivitySettingBinding; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.SettingChangeEvent; import per.goweii.wanandroid.module.main.dialog.DownloadDialog; @@ -52,7 +55,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class SettingActivity extends BaseActivity implements SettingView { +public class SettingActivity extends BaseActivity implements SettingView { @BindView(R.id.tv_theme_mode) TextView tv_theme_mode; @BindView(R.id.tv_show_read_later_notification_title) @@ -84,9 +87,10 @@ public static void start(Context context) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.activity_setting; + protected ActivitySettingBinding initViewBinding(@NonNull LayoutInflater inflater) { + return ActivitySettingBinding.inflate(inflater); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/UserInfoActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/UserInfoActivity.kt index 78a040d7..b1ba9571 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/UserInfoActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/UserInfoActivity.kt @@ -2,9 +2,10 @@ package per.goweii.wanandroid.module.mine.activity import android.content.Context import android.content.Intent -import kotlinx.android.synthetic.main.activity_user_info.* +import android.view.LayoutInflater import per.goweii.basic.core.base.BaseActivity import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityUserInfoBinding import per.goweii.wanandroid.event.UserInfoUpdateEvent import per.goweii.wanandroid.module.login.activity.AuthActivity import per.goweii.wanandroid.module.login.model.UserEntity @@ -16,7 +17,7 @@ import per.goweii.wanandroid.utils.ImageLoader * @author CuiZhen * @date 2020/5/27 */ -class UserInfoActivity : BaseActivity(), UserInfoView { +class UserInfoActivity : BaseActivity(), UserInfoView { companion object { @JvmStatic @@ -25,7 +26,9 @@ class UserInfoActivity : BaseActivity(), UserInfoView { } } - override fun getLayoutId(): Int = R.layout.activity_user_info + override fun initViewBinding(inflater: LayoutInflater): ActivityUserInfoBinding { + return ActivityUserInfoBinding.inflate(inflater) + } override fun initPresenter(): UserInfoPresenter = UserInfoPresenter() @@ -43,9 +46,9 @@ class UserInfoActivity : BaseActivity(), UserInfoView { override fun mineInfoSuccess(userEntity: UserEntity) { UserInfoUpdateEvent().post() - ImageLoader.userIcon(civ_user_icon, userEntity.avatar ?: "") - ImageLoader.userBlur(iv_blur, userEntity.cover ?: "") - tv_user_name.text = userEntity.username - tv_user_id.text = userEntity.wanid.toString() + ImageLoader.userIcon(binding.civUserIcon, userEntity.avatar ?: "") + ImageLoader.userBlur(binding.ivBlur, userEntity.cover ?: "") + binding.tvUserName.text = userEntity.username + binding.tvUserId.text = userEntity.wanid.toString() } } \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionArticleFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionArticleFragment.java index 4f90c1de..ef720d36 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionArticleFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionArticleFragment.java @@ -2,7 +2,10 @@ import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.ViewGroup; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -20,6 +23,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentCollectionArticleBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.module.main.adapter.ArticleAdapter; import per.goweii.wanandroid.module.main.model.ArticleBean; @@ -36,7 +40,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class CollectionArticleFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, CollectionArticleView { +public class CollectionArticleFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, CollectionArticleView { public static final int PAGE_START = 0; @@ -93,9 +97,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_collection_article; + protected FragmentCollectionArticleBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentCollectionArticleBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java index 1c03d389..14ee3b11 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java @@ -1,9 +1,12 @@ package per.goweii.wanandroid.module.mine.fragment; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.ViewParent; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -29,6 +32,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentCollectionLinkBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.module.main.model.CollectionLinkBean; import per.goweii.wanandroid.module.mine.adapter.CollectionLinkAdapter; @@ -45,7 +49,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class CollectionLinkFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, CollectionLinkView { +public class CollectionLinkFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, CollectionLinkView { @BindView(R.id.msv) MultiStateView msv; @@ -88,9 +92,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_collection_link; + protected FragmentCollectionLinkBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentCollectionLinkBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostBlackFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostBlackFragment.java index 62f8f22f..247e8944 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostBlackFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostBlackFragment.java @@ -2,7 +2,9 @@ import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -18,6 +20,7 @@ import per.goweii.basic.utils.listener.OnClickListener2; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentHostInterruptBinding; import per.goweii.wanandroid.module.mine.adapter.HostInterruptAdapter; import per.goweii.wanandroid.module.mine.dialog.AddHostDialog; import per.goweii.wanandroid.module.mine.model.HostEntity; @@ -30,7 +33,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class HostBlackFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { +public class HostBlackFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { @BindView(R.id.rv) RecyclerView rv; @@ -41,9 +44,10 @@ public static HostBlackFragment create() { return new HostBlackFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_host_interrupt; + protected FragmentHostInterruptBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentHostInterruptBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostWhiteFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostWhiteFragment.java index 0f1e6e35..3cd289d0 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostWhiteFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/HostWhiteFragment.java @@ -2,7 +2,9 @@ import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -18,6 +20,7 @@ import per.goweii.basic.utils.listener.OnClickListener2; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentHostInterruptBinding; import per.goweii.wanandroid.module.mine.adapter.HostInterruptAdapter; import per.goweii.wanandroid.module.mine.dialog.AddHostDialog; import per.goweii.wanandroid.module.mine.model.HostEntity; @@ -30,7 +33,7 @@ * @date 2019/5/17 * GitHub: https://github.com/goweii */ -public class HostWhiteFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { +public class HostWhiteFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop { @BindView(R.id.rv) RecyclerView rv; @@ -41,9 +44,10 @@ public static HostWhiteFragment create() { return new HostWhiteFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_host_interrupt; + protected FragmentHostInterruptBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentHostInterruptBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageReadedFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageReadedFragment.kt index 1339c85a..62d5ad88 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageReadedFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageReadedFragment.kt @@ -1,16 +1,18 @@ package per.goweii.wanandroid.module.mine.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager.OnPageChangeListener import com.chad.library.adapter.base.BaseQuickAdapter -import kotlinx.android.synthetic.main.fragment_message_readed.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import per.goweii.basic.core.base.BaseFragment import per.goweii.basic.core.utils.SmartRefreshUtils import per.goweii.basic.utils.listener.SimpleListener import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentMessageReadedBinding import per.goweii.wanandroid.event.MessageDeleteEvent import per.goweii.wanandroid.module.main.model.ListBean import per.goweii.wanandroid.module.mine.adapter.MessageReadedAdapter @@ -24,7 +26,7 @@ import per.goweii.wanandroid.utils.UrlOpenUtils * @author CuiZhen * @date 2020/5/16 */ -class MessageReadedFragment : BaseFragment(), MessageReadedView { +class MessageReadedFragment : BaseFragment(), MessageReadedView { companion object { const val PAGE_START = 1 @@ -55,23 +57,28 @@ class MessageReadedFragment : BaseFragment(), MessageRea return true } - override fun getLayoutRes() = R.layout.fragment_message_readed + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentMessageReadedBinding { + return FragmentMessageReadedBinding.inflate(inflater, container, false) + } override fun initPresenter() = MessageReadedPresenter() override fun initView() { - mSmartRefreshUtils = SmartRefreshUtils.with(srl) + mSmartRefreshUtils = SmartRefreshUtils.with(binding.srl) mSmartRefreshUtils.pureScrollMode() mSmartRefreshUtils.setRefreshListener { currPage = PAGE_START presenter.getMessageReadList(currPage) } - rv.layoutManager = LinearLayoutManager(context) + binding.rv.layoutManager = LinearLayoutManager(context) mAdapter = MessageReadedAdapter() mAdapter.setEnableLoadMore(false) mAdapter.setOnLoadMoreListener({ presenter.getMessageReadList(currPage) - }, rv) + }, binding.rv) mAdapter.onItemChildClickListener = BaseQuickAdapter.OnItemChildClickListener { _, view, position -> mAdapter.closeAll(null) val item = mAdapter.getItem(position) ?: return@OnItemChildClickListener @@ -84,9 +91,9 @@ class MessageReadedFragment : BaseFragment(), MessageRea } } } - rv.adapter = mAdapter - MultiStateUtils.setEmptyAndErrorClick(msv, SimpleListener { - MultiStateUtils.toLoading(msv) + binding.rv.adapter = mAdapter + MultiStateUtils.setEmptyAndErrorClick(binding.msv, SimpleListener { + MultiStateUtils.toLoading(binding.msv) currPage = PAGE_START presenter.getMessageReadList(currPage) }) @@ -110,7 +117,7 @@ class MessageReadedFragment : BaseFragment(), MessageRea override fun onVisible(isFirstVisible: Boolean) { super.onVisible(isFirstVisible) if (isFirstVisible) { - MultiStateUtils.toLoading(msv) + MultiStateUtils.toLoading(binding.msv) currPage = PAGE_START presenter.getMessageReadList(currPage) } @@ -121,9 +128,9 @@ class MessageReadedFragment : BaseFragment(), MessageRea mAdapter.setNewData(data.datas) mAdapter.setEnableLoadMore(true) if (data.datas == null || data.datas.isEmpty()) { - MultiStateUtils.toEmpty(msv) + MultiStateUtils.toEmpty(binding.msv) } else { - MultiStateUtils.toContent(msv) + MultiStateUtils.toContent(binding.msv) } } else { mAdapter.addData(data.datas) diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageUnreadFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageUnreadFragment.kt index 291e635a..fdee4dba 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageUnreadFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MessageUnreadFragment.kt @@ -1,14 +1,16 @@ package per.goweii.wanandroid.module.mine.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.chad.library.adapter.base.BaseQuickAdapter -import kotlinx.android.synthetic.main.fragment_message_unread.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import per.goweii.basic.core.base.BaseFragment import per.goweii.basic.core.utils.SmartRefreshUtils import per.goweii.basic.utils.listener.SimpleListener import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentMessageUnreadBinding import per.goweii.wanandroid.event.MessageDeleteEvent import per.goweii.wanandroid.event.MessageUpdateEvent import per.goweii.wanandroid.module.main.model.ListBean @@ -23,7 +25,7 @@ import per.goweii.wanandroid.utils.UrlOpenUtils * @author CuiZhen * @date 2020/5/16 */ -class MessageUnreadFragment : BaseFragment(), MessageUnreadView { +class MessageUnreadFragment : BaseFragment(), MessageUnreadView { companion object { const val PAGE_START = 1 @@ -54,31 +56,36 @@ class MessageUnreadFragment : BaseFragment(), MessageUnr return true } - override fun getLayoutRes() = R.layout.fragment_message_unread + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentMessageUnreadBinding { + return FragmentMessageUnreadBinding.inflate(inflater, container, false) + } override fun initPresenter() = MessageUnreadPresenter() override fun initView() { - mSmartRefreshUtils = SmartRefreshUtils.with(srl) + mSmartRefreshUtils = SmartRefreshUtils.with(binding.srl) mSmartRefreshUtils.pureScrollMode() mSmartRefreshUtils.setRefreshListener { currPage = PAGE_START presenter.getMessageUnreadList(currPage) } - rv.layoutManager = LinearLayoutManager(context) + binding.rv.layoutManager = LinearLayoutManager(context) mAdapter = MessageUnreadAdapter() mAdapter.setEnableLoadMore(false) mAdapter.setOnLoadMoreListener({ presenter.getMessageUnreadList(currPage) - }, rv) + }, binding.rv) mAdapter.onItemClickListener = BaseQuickAdapter.OnItemClickListener { _, _, position -> mAdapter.getItem(position)?.let { UrlOpenUtils.with(it.realLink).open(context) } } - rv.adapter = mAdapter - MultiStateUtils.setEmptyAndErrorClick(msv, SimpleListener { - MultiStateUtils.toLoading(msv) + binding.rv.adapter = mAdapter + MultiStateUtils.setEmptyAndErrorClick(binding.msv, SimpleListener { + MultiStateUtils.toLoading(binding.msv) currPage = PAGE_START presenter.getMessageUnreadList(currPage) }) @@ -90,7 +97,7 @@ class MessageUnreadFragment : BaseFragment(), MessageUnr override fun onVisible(isFirstVisible: Boolean) { super.onVisible(isFirstVisible) if (isFirstVisible) { - MultiStateUtils.toLoading(msv) + MultiStateUtils.toLoading(binding.msv) currPage = PAGE_START presenter.getMessageUnreadList(currPage) } @@ -101,9 +108,9 @@ class MessageUnreadFragment : BaseFragment(), MessageUnr mAdapter.setNewData(data.datas) mAdapter.setEnableLoadMore(true) if (data.datas == null || data.datas.isEmpty()) { - MultiStateUtils.toEmpty(msv) + MultiStateUtils.toEmpty(binding.msv) } else { - MultiStateUtils.toContent(msv) + MultiStateUtils.toContent(binding.msv) } } else { mAdapter.addData(data.datas) diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java index 8e04d672..6bca71a6 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java @@ -3,12 +3,15 @@ import android.annotation.SuppressLint; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.widget.NestedScrollView; @@ -26,6 +29,7 @@ import per.goweii.basic.core.utils.SmartRefreshUtils; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.FragmentMineBinding; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.MessageCountEvent; import per.goweii.wanandroid.event.MessageUpdateEvent; @@ -52,7 +56,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class MineFragment extends BaseFragment implements MineView { +public class MineFragment extends BaseFragment implements MineView { @BindView(R.id.aiv_notification) ImageView aiv_notification; @@ -125,9 +129,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_mine; + protected FragmentMineBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentMineBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/navigation/fragment/NaviFragment.java b/app/src/main/java/per/goweii/wanandroid/module/navigation/fragment/NaviFragment.java index 1e4eaaad..82d12656 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/navigation/fragment/NaviFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/navigation/fragment/NaviFragment.java @@ -1,5 +1,9 @@ package per.goweii.wanandroid.module.navigation.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -13,6 +17,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentKnowledgeNavigationChildBinding; import per.goweii.wanandroid.module.main.model.ArticleBean; import per.goweii.wanandroid.module.navigation.adapter.NaviAdapter; import per.goweii.wanandroid.module.navigation.model.NaviBean; @@ -27,7 +32,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class NaviFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, NaviView { +public class NaviFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, NaviView { @BindView(R.id.msv) MultiStateView msv; @@ -40,9 +45,10 @@ public static NaviFragment create() { return new NaviFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_knowledge_navigation_child; + protected FragmentKnowledgeNavigationChildBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentKnowledgeNavigationChildBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectArticleFragment.java b/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectArticleFragment.java index 9fd36d2d..0314c9e1 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectArticleFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectArticleFragment.java @@ -1,8 +1,11 @@ package per.goweii.wanandroid.module.project.fragment; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -21,6 +24,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentProjectArticleBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.ScrollTopEvent; @@ -40,7 +44,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class ProjectArticleFragment extends BaseFragment implements ProjectArticleView { +public class ProjectArticleFragment extends BaseFragment implements ProjectArticleView { private static final int PAGE_START = 1; @@ -110,9 +114,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_project_article; + protected FragmentProjectArticleBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentProjectArticleBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectFragment.java b/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectFragment.java index 884e8506..4fbb9a3b 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/project/fragment/ProjectFragment.java @@ -1,5 +1,9 @@ package per.goweii.wanandroid.module.project.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.viewpager.widget.ViewPager; @@ -15,6 +19,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.FragmentProjectBinding; import per.goweii.wanandroid.event.ScrollTopEvent; import per.goweii.wanandroid.module.main.model.ChapterBean; import per.goweii.wanandroid.module.project.presenter.ProjectPresenter; @@ -27,7 +32,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class ProjectFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, ProjectView { +public class ProjectFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, ProjectView { @BindView(R.id.ab) ActionBarEx ab; @@ -43,9 +48,10 @@ public static ProjectFragment create() { return new ProjectFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_project; + protected FragmentProjectBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentProjectBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/question/fragment/QuestionFragment.kt b/app/src/main/java/per/goweii/wanandroid/module/question/fragment/QuestionFragment.kt index 39b09339..c31ebb1f 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/question/fragment/QuestionFragment.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/question/fragment/QuestionFragment.kt @@ -1,7 +1,8 @@ package per.goweii.wanandroid.module.question.fragment +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import kotlinx.android.synthetic.main.fragment_question.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import per.goweii.basic.core.base.BaseFragment @@ -9,6 +10,7 @@ import per.goweii.basic.core.utils.SmartRefreshUtils import per.goweii.basic.ui.toast.ToastMaker import per.goweii.basic.utils.listener.SimpleListener import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.FragmentQuestionBinding import per.goweii.wanandroid.event.CollectionEvent import per.goweii.wanandroid.event.LoginEvent import per.goweii.wanandroid.event.ScrollTopEvent @@ -25,7 +27,7 @@ import per.goweii.wanandroid.utils.RvScrollTopUtils.ScrollTop * @author CuiZhen * @date 2020/3/25 */ -class QuestionFragment : BaseFragment(), QuestionView, ScrollTop { +class QuestionFragment : BaseFragment(), QuestionView, ScrollTop { companion object { private const val PAGE_START = 1 @@ -68,29 +70,34 @@ class QuestionFragment : BaseFragment(), QuestionView, Scroll @Subscribe(threadMode = ThreadMode.MAIN) fun onScrollTopEvent(event: ScrollTopEvent) { if (isAdded && !isDetached) { - RvScrollTopUtils.smoothScrollTop(rv) + RvScrollTopUtils.smoothScrollTop(binding.rv) } } override fun isRegisterEventBus() = true - override fun getLayoutRes(): Int = R.layout.fragment_question + override fun initViewBinding( + inflater: LayoutInflater, + container: ViewGroup? + ): FragmentQuestionBinding { + return FragmentQuestionBinding.inflate(inflater, container, false) + } override fun initPresenter(): QuestionPresenter = QuestionPresenter() override fun initView() { - mSmartRefreshUtils = SmartRefreshUtils.with(srl) + mSmartRefreshUtils = SmartRefreshUtils.with(binding.srl) mSmartRefreshUtils.pureScrollMode() mSmartRefreshUtils.setRefreshListener { currPage = PAGE_START presenter.getQuestionList(currPage) } - rv.layoutManager = LinearLayoutManager(context) + binding.rv.layoutManager = LinearLayoutManager(context) mAdapter = ArticleAdapter() mAdapter.setEnableLoadMore(false) mAdapter.setOnLoadMoreListener({ presenter.getQuestionList(currPage) - }, rv) + }, binding.rv) mAdapter.setOnItemChildViewClickListener { _, v, position -> mAdapter.getItem(position)?.let { item -> if (v.isChecked) { @@ -100,15 +107,15 @@ class QuestionFragment : BaseFragment(), QuestionView, Scroll } } } - rv.adapter = mAdapter - setEmptyAndErrorClick(msv, SimpleListener { - MultiStateUtils.toLoading(msv) + binding.rv.adapter = mAdapter + setEmptyAndErrorClick(binding.msv, SimpleListener { + MultiStateUtils.toLoading(binding.msv) presenter.getQuestionList(currPage) }) } override fun loadData() { - MultiStateUtils.toLoading(msv) + MultiStateUtils.toLoading(binding.msv) presenter.getQuestionListCache(PAGE_START) } @@ -122,14 +129,14 @@ class QuestionFragment : BaseFragment(), QuestionView, Scroll override fun scrollTop() { if (isAdded && !isDetached) { - RvScrollTopUtils.smoothScrollTop(rv) + RvScrollTopUtils.smoothScrollTop(binding.rv) } } override fun getQuestionListSuccess(code: Int, data: ArticleListBean) { currPage = data.curPage + PAGE_START if (data.curPage == PAGE_START) { - MultiStateUtils.toContent(msv) + MultiStateUtils.toContent(binding.msv) mAdapter.setNewData(data.datas) } else { mAdapter.addData(data.datas) diff --git a/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxArticleFragment.java b/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxArticleFragment.java index 64d17e09..68e2a651 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxArticleFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxArticleFragment.java @@ -1,7 +1,10 @@ package per.goweii.wanandroid.module.wxarticle.fragment; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -20,6 +23,7 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.wanandroid.R; +import per.goweii.wanandroid.databinding.FragmentWxArticleBinding; import per.goweii.wanandroid.event.CollectionEvent; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.ScrollTopEvent; @@ -38,7 +42,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class WxArticleFragment extends BaseFragment implements WxArticleView { +public class WxArticleFragment extends BaseFragment implements WxArticleView { private static final int PAGE_START = 1; @@ -108,9 +112,10 @@ protected boolean isRegisterEventBus() { return true; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_wx_article; + protected FragmentWxArticleBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentWxArticleBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxFragment.java b/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxFragment.java index 531b1796..0249609d 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/wxarticle/fragment/WxFragment.java @@ -1,5 +1,9 @@ package per.goweii.wanandroid.module.wxarticle.fragment; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.viewpager.widget.ViewPager; @@ -15,6 +19,7 @@ import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Config; +import per.goweii.wanandroid.databinding.FragmentWxBinding; import per.goweii.wanandroid.event.ScrollTopEvent; import per.goweii.wanandroid.module.main.model.ChapterBean; import per.goweii.wanandroid.module.wxarticle.presenter.WxPresenter; @@ -27,7 +32,7 @@ * @date 2019/5/12 * GitHub: https://github.com/goweii */ -public class WxFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, WxView { +public class WxFragment extends BaseFragment implements RvScrollTopUtils.ScrollTop, WxView { @BindView(R.id.ab) ActionBarEx ab; @@ -43,9 +48,10 @@ public static WxFragment create() { return new WxFragment(); } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.fragment_wx; + protected FragmentWxBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentWxBinding.inflate(inflater, container, false); } @Nullable diff --git a/app/src/main/java/per/goweii/wanandroid/utils/fingerprint/FingerprintHelper.kt b/app/src/main/java/per/goweii/wanandroid/utils/fingerprint/FingerprintHelper.kt deleted file mode 100644 index 34d51f7a..00000000 --- a/app/src/main/java/per/goweii/wanandroid/utils/fingerprint/FingerprintHelper.kt +++ /dev/null @@ -1,157 +0,0 @@ -package per.goweii.wanandroid.utils.fingerprint - -import android.app.Activity -import android.app.KeyguardManager -import android.hardware.biometrics.BiometricPrompt -import android.os.Build -import android.os.Handler -import android.os.Looper -import android.security.keystore.KeyGenParameterSpec -import android.security.keystore.KeyProperties -import androidx.annotation.RequiresApi -import androidx.core.hardware.fingerprint.FingerprintManagerCompat -import androidx.core.os.CancellationSignal -import java.security.KeyStore -import javax.crypto.Cipher -import javax.crypto.KeyGenerator - -class FingerprintHelper( - private val activity: Activity -) { - private val fingerprintManager = FingerprintManagerCompat.from(activity) - - private var onCancel: (() -> Unit)? = null - - /** 检查指纹识别支持状态 */ - @RequiresApi(Build.VERSION_CODES.M) - fun checkBiometric(): String { - // 获取锁屏管理 - val km = activity.getSystemService(KeyguardManager::class.java) - return when { - !fingerprintManager.isHardwareDetected -> { - "不支持指纹" - } - !km.isKeyguardSecure -> { - "未设置锁屏" - } - !fingerprintManager.hasEnrolledFingerprints() -> { - "未注册有效指纹" - } - else -> { - "" - } - } - } - - @RequiresApi(Build.VERSION_CODES.M) - fun authenticate() { - } - - @RequiresApi(Build.VERSION_CODES.M) - private fun authenticateM() { - val cancellationSignal = CancellationSignal() - cancellationSignal.setOnCancelListener { - // 取消回调 - onCancel?.invoke() - } - val cryptoObject = FingerprintManagerCompat.CryptoObject(loadCipher()) - fingerprintManager.authenticate( - cryptoObject, // 包装了 Cipher 对象的 FingerprintManagerCompat.CryptoObject 对象,用于加解密 - 0, // 可选 flag,建议为 0 - cancellationSignal, // CancellationSignal 对象,用于取消指纹认证,可空,但不建议为 null - object : FingerprintManagerCompat.AuthenticationCallback() { - override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) { - super.onAuthenticationError(errMsgId, errString) - } - - override fun onAuthenticationHelp(helpMsgId: Int, helpString: CharSequence?) { - super.onAuthenticationHelp(helpMsgId, helpString) - } - - override fun onAuthenticationSucceeded(result: FingerprintManagerCompat.AuthenticationResult?) { - super.onAuthenticationSucceeded(result) - } - - override fun onAuthenticationFailed() { - super.onAuthenticationFailed() - } - }, // 认证回调接口 - Handler(Looper.getMainLooper()) // 回调所在 Handler,一般为 null - ) - } - - @RequiresApi(Build.VERSION_CODES.P) - private fun authenticateQ() { - val cancellationSignal = android.os.CancellationSignal() - cancellationSignal.setOnCancelListener { - // 取消回调 - onCancel?.invoke() - } - // 生成认证对象 - val prompt = with(BiometricPrompt.Builder(activity)) { - setTitle("") - setSubtitle("") - setDescription("") - setNegativeButton("取消", activity.mainExecutor, { dialog, _ -> - // 取消回调 - dialog?.dismiss() - cancellationSignal.cancel() - }) - build() - } - val cryptoObject = BiometricPrompt.CryptoObject(loadCipher()) - prompt.authenticate( - cryptoObject, // 包装了 Cipher 对象的 BiometricPrompt.CryptoObject 对象,用于加解密 - cancellationSignal, // CancellationSignal 对象,用于取消指纹认证,不能为空 - activity.mainExecutor, // 回调 Executor,不能为空,可使用 activity.mainExecutor - object : BiometricPrompt.AuthenticationCallback() { - override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { - super.onAuthenticationError(errorCode, errString) - } - - override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence?) { - super.onAuthenticationHelp(helpCode, helpString) - } - - override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { - super.onAuthenticationSucceeded(result) - } - - override fun onAuthenticationFailed() { - super.onAuthenticationFailed() - } - }// 认证回调 - ) - } - - private var keyAlias = "keyAlias" - - /** 获取 Cipher 对象 */ - @RequiresApi(Build.VERSION_CODES.M) - private fun loadCipher(): Cipher { - val keyStore = KeyStore.getInstance("AndroidKeyStore") - keyStore.load(null) - // keyAlias 为密钥别名,可自己定义,加密解密要一致 - if (!keyStore.containsAlias(keyAlias)) { - // 不包含改别名,重新生成 - // 秘钥生成器 - val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore") - val builder = KeyGenParameterSpec.Builder( - keyAlias, - KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) - .setBlockModes(KeyProperties.BLOCK_MODE_CBC) - .setUserAuthenticationRequired(false) - .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) - keyGenerator.init(builder.build()) - keyGenerator.generateKey() - } - // 根据别名获取密钥 - val key = keyStore.getKey(keyAlias, null) - val cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" - + KeyProperties.BLOCK_MODE_CBC + "/" - + KeyProperties.ENCRYPTION_PADDING_PKCS7) - // 开启登录时用于加密,使用 Cipher.ENCRYPT_MODE 初始化 - cipher.init(Cipher.ENCRYPT_MODE, key) - return cipher - } -} \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/widget/LogoAnimView.kt b/app/src/main/java/per/goweii/wanandroid/widget/LogoAnimView.kt index 6ca67029..10e54dc8 100644 --- a/app/src/main/java/per/goweii/wanandroid/widget/LogoAnimView.kt +++ b/app/src/main/java/per/goweii/wanandroid/widget/LogoAnimView.kt @@ -144,17 +144,17 @@ class LogoAnimView : FrameLayout, Runnable { private fun Animator.onEnd(onEnd: (() -> Unit)? = null) { addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { onEnd?.invoke() } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { } }) } diff --git a/app/src/main/res/layout/activity_article.xml b/app/src/main/res/layout/activity_article.xml index d2e7972c..83ffdbbc 100644 --- a/app/src/main/res/layout/activity_article.xml +++ b/app/src/main/res/layout/activity_article.xml @@ -75,6 +75,8 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_quick_login.xml b/app/src/main/res/layout/activity_quick_login.xml new file mode 100644 index 00000000..25f0f3be --- /dev/null +++ b/app/src/main/res/layout/activity_quick_login.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/basic_core/build.gradle b/basic_core/build.gradle index 87407049..f209cac1 100644 --- a/basic_core/build.gradle +++ b/basic_core/build.gradle @@ -2,6 +2,7 @@ apply plugin: 'com.android.library' apply from: "${rootDir.path}/gradle/basic.gradle" android { + namespace "per.goweii.basic.core" } dependencies { diff --git a/basic_core/src/main/AndroidManifest.xml b/basic_core/src/main/AndroidManifest.xml index 56af8fbe..c522624f 100644 --- a/basic_core/src/main/AndroidManifest.xml +++ b/basic_core/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/basic_core/src/main/java/per/goweii/basic/core/base/BaseActivity.java b/basic_core/src/main/java/per/goweii/basic/core/base/BaseActivity.java index 02fe28af..dd172fff 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/base/BaseActivity.java +++ b/basic_core/src/main/java/per/goweii/basic/core/base/BaseActivity.java @@ -4,6 +4,8 @@ import android.app.Activity; import android.os.Bundle; +import androidx.viewbinding.ViewBinding; + import org.greenrobot.eventbus.EventBus; import butterknife.ButterKnife; @@ -20,7 +22,7 @@ * @version v1.0.0 * @date 2018/4/4-下午1:23 */ -public abstract class BaseActivity

extends MvpActivity

{ +public abstract class BaseActivity

extends MvpActivity { private LoadingDialog mLoadingDialog = null; private LoadingBarManager mLoadingBarManager = null; private Unbinder mUnbinder = null; diff --git a/basic_core/src/main/java/per/goweii/basic/core/base/BaseFragment.java b/basic_core/src/main/java/per/goweii/basic/core/base/BaseFragment.java index 89194c6f..76eece9c 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/base/BaseFragment.java +++ b/basic_core/src/main/java/per/goweii/basic/core/base/BaseFragment.java @@ -1,5 +1,7 @@ package per.goweii.basic.core.base; +import androidx.viewbinding.ViewBinding; + import org.greenrobot.eventbus.EventBus; import butterknife.ButterKnife; @@ -13,7 +15,7 @@ * @version v1.0.0 * @date 2018/3/10-下午12:38 */ -public abstract class BaseFragment

extends MvpFragment

{ +public abstract class BaseFragment

extends MvpFragment { private LoadingDialog mLoadingDialog = null; private LoadingBarManager mLoadingBarManager = null; private Unbinder mUnbinder = null; diff --git a/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpActivity.java b/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpActivity.java index 37f5fddc..4231cd0a 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpActivity.java +++ b/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpActivity.java @@ -3,9 +3,13 @@ import android.app.Activity; import android.content.Context; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.View; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.utils.ClickHelper; @@ -15,14 +19,17 @@ * @version v1.0.0 * @date 2018/4/4-下午1:23 */ -public abstract class MvpActivity

extends CacheActivity implements MvpView, View.OnClickListener { - +public abstract class MvpActivity

extends CacheActivity implements MvpView, View.OnClickListener { public P presenter; + public V binding; /** - * 获取布局资源文件 + * 初始化ViewBinding + * + * @return V */ - protected abstract int getLayoutId(); + @Nullable + protected abstract V initViewBinding(@NonNull LayoutInflater inflater); /** * 初始化presenter @@ -60,8 +67,9 @@ protected void initWindow() { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initWindow(); - if (getLayoutId() > 0) { - setContentView(getLayoutId()); + binding = initViewBinding(getLayoutInflater()); + if (binding != null) { + setContentView(binding.getRoot()); } presenter = initPresenter(); if (presenter != null) { diff --git a/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpFragment.java b/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpFragment.java index 59e94d16..3583d806 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpFragment.java +++ b/basic_core/src/main/java/per/goweii/basic/core/mvp/MvpFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.utils.ClickHelper; import per.goweii.lazyfragment.LazyFragment; @@ -19,8 +20,9 @@ * @version v1.0.0 * @date 2018/3/10-下午12:38 */ -public abstract class MvpFragment extends LazyFragment implements MvpView, View.OnClickListener { +public abstract class MvpFragment extends LazyFragment implements MvpView, View.OnClickListener { protected T presenter; + public V binding; /** * 获取布局资源文件 @@ -29,7 +31,9 @@ public abstract class MvpFragment extends LazyFragment i */ @Override @LayoutRes - protected abstract int getLayoutRes(); + protected final int getLayoutRes() { + return 0; + } /** * 初始化presenter @@ -39,6 +43,14 @@ public abstract class MvpFragment extends LazyFragment i @Nullable protected abstract T initPresenter(); + /** + * 初始化ViewBinding + * + * @return V + */ + @Nullable + protected abstract V initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container); + /** * 绑定事件 */ @@ -70,7 +82,13 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return super.onCreateView(inflater, container, savedInstanceState); + View view = super.onCreateView(inflater, container, savedInstanceState); + binding = initViewBinding(inflater, container); + if (binding != null) { + view = binding.getRoot(); + } + mRootView = view; + return view; } @Override @@ -100,6 +118,7 @@ public void onDestroyView() { if (presenter != null) { presenter.detach(); } + binding = null; super.onDestroyView(); } diff --git a/basic_core/src/main/java/per/goweii/basic/core/surface/activity/SingleFragActivity.java b/basic_core/src/main/java/per/goweii/basic/core/surface/activity/SingleFragActivity.java index 180f338c..2ed441b4 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/surface/activity/SingleFragActivity.java +++ b/basic_core/src/main/java/per/goweii/basic/core/surface/activity/SingleFragActivity.java @@ -2,13 +2,18 @@ import android.content.Context; import android.content.Intent; +import android.view.LayoutInflater; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.viewbinding.ViewBinding; import per.goweii.basic.core.R; import per.goweii.basic.core.base.BaseActivity; +import per.goweii.basic.core.databinding.BasicCoreActivitySingleFragBinding; import per.goweii.basic.core.mvp.MvpPresenter; import per.goweii.basic.core.surface.fragment.NotFoundFragment; @@ -28,9 +33,10 @@ public static void start(Context context, Class fragmentClass) { context.startActivity(intent); } + @Nullable @Override - protected int getLayoutId() { - return R.layout.basic_core_activity_single_frag; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater) { + return BasicCoreActivitySingleFragBinding.inflate(inflater); } @Override diff --git a/basic_core/src/main/java/per/goweii/basic/core/surface/fragment/NotFoundFragment.java b/basic_core/src/main/java/per/goweii/basic/core/surface/fragment/NotFoundFragment.java index fa0d4487..7411fd0a 100644 --- a/basic_core/src/main/java/per/goweii/basic/core/surface/fragment/NotFoundFragment.java +++ b/basic_core/src/main/java/per/goweii/basic/core/surface/fragment/NotFoundFragment.java @@ -2,10 +2,17 @@ import android.os.Bundle; import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; + import per.goweii.basic.core.R; import per.goweii.basic.core.base.BaseFragment; +import per.goweii.basic.core.databinding.BasicCoreFragmentNotFoundBinding; import per.goweii.basic.core.mvp.MvpPresenter; /** @@ -24,9 +31,10 @@ public static NotFoundFragment create(String msg) { return fragment; } + @Nullable @Override - protected int getLayoutRes() { - return R.layout.basic_core_fragment_not_found; + protected ViewBinding initViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return BasicCoreFragmentNotFoundBinding.inflate(inflater, container, false); } @Override diff --git a/basic_res/build.gradle b/basic_res/build.gradle index b587cf2e..bf10561d 100644 --- a/basic_res/build.gradle +++ b/basic_res/build.gradle @@ -2,6 +2,7 @@ apply plugin: 'com.android.library' apply from: "${rootDir.path}/gradle/basic.gradle" android { + namespace "per.goweii.basic.res" resourcePrefix "" } diff --git a/basic_res/src/main/AndroidManifest.xml b/basic_res/src/main/AndroidManifest.xml index c46e683e..9b65eb06 100644 --- a/basic_res/src/main/AndroidManifest.xml +++ b/basic_res/src/main/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/basic_ui/build.gradle b/basic_ui/build.gradle index 817c502e..495286f8 100644 --- a/basic_ui/build.gradle +++ b/basic_ui/build.gradle @@ -2,6 +2,7 @@ apply plugin: 'com.android.library' apply from: "${rootDir.path}/gradle/basic.gradle" android { + namespace "per.goweii.basic.ui" } dependencies { diff --git a/basic_ui/src/main/AndroidManifest.xml b/basic_ui/src/main/AndroidManifest.xml index 9360fc37..9b65eb06 100644 --- a/basic_ui/src/main/AndroidManifest.xml +++ b/basic_ui/src/main/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/basic_utils/build.gradle b/basic_utils/build.gradle index 1b246762..dc0339e3 100644 --- a/basic_utils/build.gradle +++ b/basic_utils/build.gradle @@ -2,6 +2,7 @@ apply plugin: 'com.android.library' apply from: "${rootDir.path}/gradle/basic.gradle" android { + namespace "per.goweii.basic.utils" } dependencies { diff --git a/basic_utils/src/main/AndroidManifest.xml b/basic_utils/src/main/AndroidManifest.xml index 20ab918d..0bfa73ba 100644 --- a/basic_utils/src/main/AndroidManifest.xml +++ b/basic_utils/src/main/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/build.gradle b/build.gradle index eda76ed1..4bcc900a 100644 --- a/build.gradle +++ b/build.gradle @@ -2,16 +2,17 @@ apply from: "${rootDir.path}/gradle/config.gradle" apply from: "${rootDir.path}/gradle/version.gradle" buildscript { - ext.kotlin_version = "1.4.21" - ext.kotlin_coroutines_version = "1.3.2" + ext.kotlin_version = "2.0.0" + ext.kotlin_coroutines_version = "1.7.1" repositories { - maven { url "https://maven.aliyun.com/repository/google" } - maven { url "https://maven.aliyun.com/repository/jcenter" } google() + mavenCentral() jcenter() + maven { url "https://maven.aliyun.com/repository/google" } + maven { url "https://maven.aliyun.com/repository/jcenter" } } dependencies { - classpath "com.android.tools.build:gradle:4.1.1" + classpath "com.android.tools.build:gradle:8.7.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.tencent.bugly:symtabfileuploader:2.2.1' } @@ -19,13 +20,14 @@ buildscript { allprojects { repositories { - maven { url "https://maven.aliyun.com/repository/google" } - maven { url "https://maven.aliyun.com/repository/jcenter" } maven { url "https://jitpack.io" } //maven { url "https://raw.githubusercontent.com/goweii/maven-repository/master/releases/" } maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" } google() + mavenCentral() jcenter() + maven { url "https://maven.aliyun.com/repository/google" } + maven { url "https://maven.aliyun.com/repository/jcenter" } } } diff --git a/gradle.properties b/gradle.properties index 13e5ddfc..6f0240d0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,6 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true kapt.incremental.apt=true android.useDeprecatedNdk=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/gradle/basic.gradle b/gradle/basic.gradle index 418a9219..a4cc7d2c 100644 --- a/gradle/basic.gradle +++ b/gradle/basic.gradle @@ -1,5 +1,5 @@ apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' android { @@ -13,6 +13,10 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true } + buildFeatures { + viewBinding true + dataBinding true + } buildTypes { release { debuggable false diff --git a/gradle/config.gradle b/gradle/config.gradle index 149c94fa..4b594563 100644 --- a/gradle/config.gradle +++ b/gradle/config.gradle @@ -1,9 +1,10 @@ ext { android = [ - compileSdkVersion: 30, + applicationId : "per.goweii.wanandroid", + compileSdkVersion: 35, minSdkVersion : 21, - targetSdkVersion : 30, - buildToolsVersion: "30.0.3", + targetSdkVersion : 35, + buildToolsVersion: "35.0.0", versionCode : 82, versionName : "2.2.9", //-beta1 ] @@ -18,25 +19,26 @@ ext { ] versions = [ - androidx_core : "1.2.0", - androidx_appcompat : "1.2.0", - androidx_arch : "2.1.0", - androidx_annotation : "1.1.0", + androidx_core : "1.10.1", + androidx_appcompat : "1.7.1", + androidx_arch : "2.2.0", + androidx_annotation : "1.9.1", androidx_multidex : "2.0.1", - androidx_fragment : "1.1.0", - androidx_lifecycle : "2.2.0", - androidx_room : "2.2.5", + androidx_fragment : "1.8.8", + androidx_lifecycle : "2.9.1", + androidx_room : "2.7.1", sqlite_jdbc : "3.34.0", - androidx_recyclerview : "1.1.0", + androidx_recyclerview : "1.4.0", androidx_cardview : "1.0.0", palette : "1.0.0", - camerax_core : "1.0.0-beta11", - camerax_view : "1.0.0-alpha18", - androidx_biometric : "1.2.0-alpha01", - localbroadcastmanager : "1.0.0", - startup : "1.0.0", - - constraintLayout : "1.1.3", + camerax_core : "1.4.2", + camerax_view : "1.4.2", + androidx_biometric : "1.4.0-alpha04", + localbroadcastmanager : "1.1.0", + startup : "1.2.0", + webkit : "1.14.0", + + constraintLayout : "2.2.1", flexbox : "1.0.0", butterknife : "10.0.0", @@ -102,13 +104,14 @@ ext { lifecycle_java8 : "androidx.lifecycle:lifecycle-common-java8:${versions.androidx_lifecycle}", lifecycle_compiler : "androidx.lifecycle:lifecycle-compiler:${versions.androidx_lifecycle}", annotation : "androidx.annotation:${versions.androidx_annotation}", - webkit : "androidx.webkit:webkit:${versions.androidx_core}", + webkit : "androidx.webkit:webkit:${versions.webkit}", biometric : "androidx.biometric:biometric:${versions.androidx_biometric}", multidex : "androidx.multidex:multidex:${versions.androidx_multidex}", recyclerview : "androidx.recyclerview:recyclerview:${versions.androidx_recyclerview}", cardview : "androidx.cardview:cardview:${versions.androidx_cardview}", palette : "androidx.palette:palette:${versions.palette}", roomRuntime : "androidx.room:room-runtime:${versions.androidx_room}", + roomRxjava2 : "androidx.room:room-rxjava2:${versions.androidx_room}", roomCompiler : "androidx.room:room-compiler:${versions.androidx_room}", roomKtx : "androidx.room:room-ktx:${versions.androidx_room}", constraintLayout : "com.android.support.constraint:constraint-layout:${versions.constraintLayout}", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5cac1839..7ecca487 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip From d9b1c1b16804f82dae6e2a1f8ddabc44512c92b3 Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 12:51:51 +0800 Subject: [PATCH 02/30] =?UTF-8?q?feat:=20l10n=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../module/main/dialog/DownloadDialog.java | 6 +-- app/src/main/res/layout/dialog_download.xml | 2 +- app/src/main/res/values/strings.xml | 5 +- .../layout/basic_core_fragment_not_found.xml | 8 ---- basic_core/src/main/res/values/strings.xml | 3 -- basic_l10n/build.gradle | 11 +++++ basic_l10n/proguard-rules.pro | 21 +++++++++ basic_l10n/src/main/AndroidManifest.xml | 3 ++ basic_l10n/src/main/res/values/strings.xml | 47 +++++++++++++++++++ basic_res/src/main/res/values/strings.xml | 4 -- basic_ui/build.gradle | 1 + .../basic/ui/dialog/DownloadDialog.java | 10 ++-- .../goweii/basic/ui/dialog/ListDialog.java | 4 +- .../basic/ui/dialog/PermissionDialog.java | 30 ++++++------ .../per/goweii/basic/ui/dialog/TipDialog.java | 4 +- .../goweii/basic/ui/dialog/UpdateDialog.java | 4 +- .../per/goweii/basic/ui/toast/ToastMaker.java | 1 + .../res/layout/basic_ui_dialog_download.xml | 2 +- .../main/res/layout/basic_ui_dialog_list.xml | 4 +- .../res/layout/basic_ui_dialog_permission.xml | 8 ++-- .../main/res/layout/basic_ui_dialog_tip.xml | 4 +- .../res/layout/basic_ui_dialog_update.xml | 6 +-- basic_ui/src/main/res/values/strings.xml | 33 ------------- settings.gradle | 7 ++- 25 files changed, 134 insertions(+), 96 deletions(-) create mode 100644 basic_l10n/build.gradle create mode 100644 basic_l10n/proguard-rules.pro create mode 100644 basic_l10n/src/main/AndroidManifest.xml create mode 100644 basic_l10n/src/main/res/values/strings.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7855c1ae..b32707c8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ android:name=".common.WanApp" android:allowBackup="false" android:icon="@mipmap/ic_launcher" - android:label="@string/label" + android:label="@string/app_label" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/DownloadDialog.java b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/DownloadDialog.java index 6fd4e565..91cc0d95 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/DownloadDialog.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/DownloadDialog.java @@ -130,7 +130,7 @@ public void onError(DownloadInfo info, Throwable e) { } else if (retryCount <= 6) { startDownload(DownloadDialog.this.urlBackup); } else { - ToastMaker.showShort("下载失败,可前往Github仓库下载:我的-系统设置-关于我们-项目仓库"); + ToastMaker.showShort(mActivity.getString(R.string.download_update_failed_tips)); dismiss(); } } @@ -221,7 +221,7 @@ private void preDownload() { tvProgress.setText(""); } if (tvState != null) { - tvState.setText(R.string.basic_ui_dialog_download_state_downloading); + tvState.setText(R.string.dialog_download_state_downloading); } } @@ -235,7 +235,7 @@ private void setProgress(int progress) { } if (progress >= 100) { if (tvState != null) { - tvState.setText(R.string.basic_ui_dialog_download_state_install); + tvState.setText(R.string.dialog_download_state_install); tvState.setTextColor(ResUtils.getThemeColor(tvState, R.attr.colorTextMain)); } } diff --git a/app/src/main/res/layout/dialog_download.xml b/app/src/main/res/layout/dialog_download.xml index 7579f880..7c2004b1 100644 --- a/app/src/main/res/layout/dialog_download.xml +++ b/app/src/main/res/layout/dialog_download.xml @@ -25,7 +25,7 @@ android:layout_marginLeft="16dp" android:layout_marginTop="15dp" android:layout_marginRight="16dp" - android:text="@string/basic_ui_dialog_download_state_downloading" + android:text="@string/dialog_download_state_downloading" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 36e6a362..e8894190 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,2 @@ - 玩安卓 - 《隐私政策》 - 感谢您使用玩安卓!\n我们依据最新的监管要求更新了《隐私政策》特向您说明如下:\n1. 为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2. 基于您的明示授权我们会获取存储权限,用于保存文章分享图,您有权拒绝或取消授权;\n3. 我们会采取安全措施保护您的信息安全;\n4. 未经您同意,我们不会从第三方处获取、共享或向其提供您的信息。 - + diff --git a/basic_core/src/main/res/layout/basic_core_fragment_not_found.xml b/basic_core/src/main/res/layout/basic_core_fragment_not_found.xml index 2dfbff71..e2baa512 100644 --- a/basic_core/src/main/res/layout/basic_core_fragment_not_found.xml +++ b/basic_core/src/main/res/layout/basic_core_fragment_not_found.xml @@ -8,14 +8,6 @@ android:padding="15dp" android:background="?colorBackground"> - - - BasicCore - - Fragment not found diff --git a/basic_l10n/build.gradle b/basic_l10n/build.gradle new file mode 100644 index 00000000..f2ecc055 --- /dev/null +++ b/basic_l10n/build.gradle @@ -0,0 +1,11 @@ +apply plugin: 'com.android.library' +apply from: "${rootDir.path}/gradle/basic.gradle" + +android { + namespace "per.goweii.basic.l10n" + resourcePrefix "" +} + +dependencies { + api rootProject.ext.dependencies.androidxAppcompat +} diff --git a/basic_l10n/proguard-rules.pro b/basic_l10n/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/basic_l10n/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/basic_l10n/src/main/AndroidManifest.xml b/basic_l10n/src/main/AndroidManifest.xml new file mode 100644 index 00000000..69fc4129 --- /dev/null +++ b/basic_l10n/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/basic_l10n/src/main/res/values/strings.xml b/basic_l10n/src/main/res/values/strings.xml new file mode 100644 index 00000000..0dcc1ac5 --- /dev/null +++ b/basic_l10n/src/main/res/values/strings.xml @@ -0,0 +1,47 @@ + + + 玩安卓 + + 网络连接失败,请检查网络设置 + 访问出错,请稍后重试 + + 确定 + 取消 + 关闭 +Ï + + 发现新版本 + 发现内测版本 + 立即更新 + 暂不更新 + + + 下载更新中... + 立即安装 + + + 暂不授权 + 去授权 + 去设置 + 未知 + 日历 + 照相机 + 通讯录 + 定位 + 麦克风 + 手机 + 短信 + 传感器 + 存储空间 + 相关 + 我们需要获取%s权限以确保应用的正常运行,请点击去授权完成权限申请。 + 您已拒绝应用使用%s权限,这将影响功能的正常运行,请前往设置打开权限。 + + + 《隐私政策》 + 感谢您使用玩安卓!\n我们依据最新的监管要求更新了《隐私政策》特向您说明如下:\n1. 为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2. 基于您的明示授权我们会获取存储权限,用于保存文章分享图,您有权拒绝或取消授权;\n3. 我们会采取安全措施保护您的信息安全;\n4. 未经您同意,我们不会从第三方处获取、共享或向其提供您的信息。 + + %d B + %d \% + "下载失败,可前往Github仓库下载:我的-系统设置-关于我们-项目仓库" + \ No newline at end of file diff --git a/basic_res/src/main/res/values/strings.xml b/basic_res/src/main/res/values/strings.xml index 55ad019c..85420055 100644 --- a/basic_res/src/main/res/values/strings.xml +++ b/basic_res/src/main/res/values/strings.xml @@ -1,6 +1,2 @@ - BasicRes - - 网络连接失败,请检查网络设置 - 访问出错,请稍后重试 diff --git a/basic_ui/build.gradle b/basic_ui/build.gradle index 495286f8..4d097aa5 100644 --- a/basic_ui/build.gradle +++ b/basic_ui/build.gradle @@ -8,6 +8,7 @@ android { dependencies { api project(":basic_utils") api project(":basic_res") + api project(":basic_l10n") api rootProject.ext.dependencies.design api rootProject.ext.dependencies.smartRefreshLayoutKernel diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/DownloadDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/DownloadDialog.java index 631942cb..c56cdf04 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/DownloadDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/DownloadDialog.java @@ -124,13 +124,13 @@ private void preDownload() { progressBar.setProgress(0); } if (tvApkSize != null) { - tvApkSize.setText("0B"); + tvApkSize.setText(mActivity.getString(R.string.n_bytes, 0)); } if (tvProgress != null) { - tvProgress.setText("0"); + tvProgress.setText(mActivity.getString(R.string.n_percent, 0)); } if (tvState != null) { - tvState.setText(R.string.basic_ui_dialog_download_state_downloading); + tvState.setText(R.string.dialog_download_state_downloading); } } @@ -139,11 +139,11 @@ private void setProgress(int progress) { progressBar.setProgress(progress); } if (tvProgress != null) { - tvProgress.setText("" + progress); + tvProgress.setText(mActivity.getString(R.string.n_percent, progress)); } if (progress >= 100) { if (tvState != null) { - tvState.setText(R.string.basic_ui_dialog_download_state_install); + tvState.setText(R.string.dialog_download_state_install); tvState.setTextColor(ResUtils.getThemeColor(mActivity, R.attr.colorTextMain)); } } diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java index efc05b07..172c5f09 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java @@ -141,7 +141,7 @@ public void onBindData(@NonNull Layer layer) { if (yesText != null) { tvYes.setText(yesText); } else { - tvYes.setText(R.string.basic_ui_dialog_btn_yes); + tvYes.setText(R.string.dialog_btn_yes); } if (singleBtnYes) { tvNo.setVisibility(View.GONE); @@ -152,7 +152,7 @@ public void onBindData(@NonNull Layer layer) { if (noText != null) { tvNo.setText(noText); } else { - tvNo.setText(R.string.basic_ui_dialog_btn_no); + tvNo.setText(R.string.dialog_btn_no); } } } diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/PermissionDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/PermissionDialog.java index 868b0a98..15a201e4 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/PermissionDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/PermissionDialog.java @@ -87,9 +87,9 @@ public void onBindData(@NonNull Layer layer) { } tvDescription.setText(getDescription()); if (isGoSetting) { - tvNext.setText(R.string.basic_ui_dialog_permission_next_go_setting); + tvNext.setText(R.string.dialog_permission_next_go_setting); } else { - tvNext.setText(R.string.basic_ui_dialog_permission_next); + tvNext.setText(R.string.dialog_permission_next); } } }) @@ -152,7 +152,7 @@ private int getIconResId() { } private int getTitleResId() { - int resId = R.string.basic_ui_dialog_permission_title_unknow; + int resId = R.string.dialog_permission_title_unknown; if (mGroupType == null) { return resId; } @@ -160,31 +160,31 @@ private int getTitleResId() { default: break; case CALENDAR: - resId = R.string.basic_ui_dialog_permission_title_calendar; + resId = R.string.dialog_permission_title_calendar; break; case CAMERA: - resId = R.string.basic_ui_dialog_permission_title_camera; + resId = R.string.dialog_permission_title_camera; break; case CONTACTS: - resId = R.string.basic_ui_dialog_permission_title_contacts; + resId = R.string.dialog_permission_title_contacts; break; case LOCATION: - resId = R.string.basic_ui_dialog_permission_title_location; + resId = R.string.dialog_permission_title_location; break; case MICROPHONE: - resId = R.string.basic_ui_dialog_permission_title_microphone; + resId = R.string.dialog_permission_title_microphone; break; case PHONE: - resId = R.string.basic_ui_dialog_permission_title_phone; + resId = R.string.dialog_permission_title_phone; break; case SMS: - resId = R.string.basic_ui_dialog_permission_title_sms; + resId = R.string.dialog_permission_title_sms; break; case SENSORS: - resId = R.string.basic_ui_dialog_permission_title_sensors; + resId = R.string.dialog_permission_title_sensors; break; case STORAGE: - resId = R.string.basic_ui_dialog_permission_title_storage; + resId = R.string.dialog_permission_title_storage; break; } return resId; @@ -194,13 +194,13 @@ private String getDescription() { String description; String descriptionRes; if (isGoSetting) { - descriptionRes = ResUtils.getString(R.string.basic_ui_dialog_permission_description_go_setting); + descriptionRes = ResUtils.getString(R.string.dialog_permission_description_go_setting); } else { - descriptionRes = ResUtils.getString(R.string.basic_ui_dialog_permission_description); + descriptionRes = ResUtils.getString(R.string.dialog_permission_description); } int titleResId = getTitleResId(); if (titleResId <= 0) { - description = String.format(descriptionRes, ResUtils.getString(R.string.basic_ui_dialog_permission_description_title_holder)); + description = String.format(descriptionRes, ResUtils.getString(R.string.dialog_permission_description_title_holder)); } else { description = String.format(descriptionRes, ResUtils.getString(titleResId)); } diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/TipDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/TipDialog.java index 25a8df52..5a7c67b6 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/TipDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/TipDialog.java @@ -73,14 +73,14 @@ public void onBindData(@NonNull Layer layer) { if (noText != null) { tvNo.setText(noText); } else { - tvNo.setText(R.string.basic_ui_dialog_btn_no); + tvNo.setText(R.string.dialog_btn_no); } } if (yesText != null) { tvYes.setText(yesText); } else { - tvYes.setText(R.string.basic_ui_dialog_btn_yes); + tvYes.setText(R.string.dialog_btn_yes); } TextView tvTitle = layer.requireView(R.id.basic_ui_tv_dialog_tip_title); diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/UpdateDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/UpdateDialog.java index da5463e1..20c72f10 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/UpdateDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/UpdateDialog.java @@ -111,10 +111,10 @@ public void onBindData(@NonNull Layer layer) { final TextView tvDescription = layer.requireView(R.id.basic_ui_tv_dialog_update_description); if (mTest) { tvTitle.setTextColor(ResUtils.getThemeColor(tvTitle.getContext(), R.attr.colorTextAccent)); - tvTitle.setText(R.string.basic_ui_dialog_update_test_title); + tvTitle.setText(R.string.dialog_update_test_title); } else { tvTitle.setTextColor(ResUtils.getThemeColor(tvTitle.getContext(), R.attr.colorTextMain)); - tvTitle.setText(R.string.basic_ui_dialog_update_title); + tvTitle.setText(R.string.dialog_update_title); } if (TextUtils.isEmpty(mVersionName)) { tvVersionName.setVisibility(View.GONE); diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/toast/ToastMaker.java b/basic_ui/src/main/java/per/goweii/basic/ui/toast/ToastMaker.java index d771a52a..1f968a5d 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/toast/ToastMaker.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/toast/ToastMaker.java @@ -47,6 +47,7 @@ public void handleMessage(@NonNull Message msg) { }; } + @Deprecated public static void showShort(@StringRes int message) { showShort(sContext.getString(message)); } diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml index cd2409b2..fa928514 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml @@ -15,7 +15,7 @@ android:id="@+id/basic_ui_tv_dialog_download_state" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/basic_ui_dialog_download_state_downloading" + android:text="@string/dialog_download_state_downloading" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml index 35df6cb7..769c8ffe 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml @@ -53,7 +53,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - tools:text="@string/basic_ui_dialog_btn_no" + tools:text="@string/dialog_btn_no" android:textColor="?colorTextThird" android:textSize="@dimen/text_content" /> @@ -69,7 +69,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - tools:text="@string/basic_ui_dialog_btn_yes" + tools:text="@string/dialog_btn_yes" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_permission.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_permission.xml index 7d4a2368..8f50b21f 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_permission.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_permission.xml @@ -31,7 +31,7 @@ android:lineSpacingExtra="8dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_title" - tools:text="@string/basic_ui_dialog_permission_title_camera" /> + tools:text="@string/dialog_permission_title_camera" /> + tools:text="@string/dialog_permission_description" /> + android:text="@string/dialog_permission_close" /> \ No newline at end of file diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_tip.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_tip.xml index b8e17318..9d10e2ce 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_tip.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_tip.xml @@ -49,7 +49,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - tools:text="@string/basic_ui_dialog_btn_no" + tools:text="@string/dialog_btn_no" android:textColor="?colorTextThird" android:textSize="@dimen/text_content" /> @@ -65,7 +65,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - tools:text="@string/basic_ui_dialog_btn_yes" + tools:text="@string/dialog_btn_yes" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_update.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_update.xml index 1dacdfd2..a3b42438 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_update.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_update.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" - android:text="@string/basic_ui_dialog_update_title" + android:text="@string/dialog_update_title" android:textColor="?attr/colorTextSurface" android:textSize="@dimen/text_headline" /> @@ -108,7 +108,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="@string/basic_ui_dialog_update_no" + android:text="@string/dialog_update_no" android:textColor="?attr/colorTextThird" android:textSize="@dimen/text_content" /> @@ -124,7 +124,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="@string/basic_ui_dialog_update_yes" + android:text="@string/dialog_update_yes" android:textColor="?attr/colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/basic_ui/src/main/res/values/strings.xml b/basic_ui/src/main/res/values/strings.xml index 2c8e40fa..85420055 100644 --- a/basic_ui/src/main/res/values/strings.xml +++ b/basic_ui/src/main/res/values/strings.xml @@ -1,35 +1,2 @@ - BasicUI - - 确定 - 取消 - 关闭 - - - 发现新版本 - 发现内测版本 - 立即更新 - 暂不更新 - - - 下载更新中... - 立即安装 - - - 暂不授权 - 去授权 - 去设置 - 未知 - 日历 - 照相机 - 通讯录 - 定位 - 麦克风 - 手机 - 短信 - 传感器 - 存储空间 - 相关 - 我们需要获取%s权限以确保应用的正常运行,请点击去授权完成权限申请。 - 您已拒绝应用使用%s权限,这将影响功能的正常运行,请前往设置打开权限。 diff --git a/settings.gradle b/settings.gradle index 4b8d0449..a2c8a548 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,6 @@ -include ':app', ':basic_core', ':basic_utils', ':basic_ui', ':basic_res' +include ':app' +include ':basic_core' +include ':basic_utils' +include ':basic_ui' +include ':basic_res' +include ':basic_l10n' From 915116c4860575b94390cb7e0880936114ce31ce Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 17:28:00 +0800 Subject: [PATCH 03/30] =?UTF-8?q?feat:=20=E6=8F=90=E5=8F=96strings?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../per/goweii/wanandroid/http/WanCache.java | 4 +- .../book/adapter/BookChapterAdapter.java | 6 +- .../home/activity/UserPageActivity.java | 8 +- .../module/home/fragment/HomeFragment.java | 4 +- .../home/fragment/SearchHistoryFragment.java | 2 +- .../module/login/activity/AuthActivity.java | 6 +- .../login/activity/QuickLoginActivity.kt | 5 +- .../login/fragment/RegisterFragment.java | 2 +- .../module/main/activity/ArticleActivity.kt | 20 +- .../module/main/activity/CrashActivity.kt | 2 +- .../module/main/activity/MainActivity.java | 2 +- .../module/main/activity/ScanActivity.kt | 164 +++++---- .../module/main/activity/WebActivity.java | 10 +- .../module/main/dialog/ArticleShareDialog.kt | 6 +- .../module/main/dialog/CardShareDialog.kt | 6 +- .../module/main/dialog/ImageMenuDialog.kt | 4 +- .../module/main/dialog/ImagePreviewDialog.kt | 8 +- .../module/main/dialog/WebMenuDialog.java | 6 +- .../fragment/KnowledgeNavigationFragment.java | 2 +- .../module/main/fragment/MainFragment.java | 8 +- .../module/main/model/ArticleBean.java | 6 +- .../module/main/model/MainRequest.java | 5 +- .../module/main/model/UserPageBean.java | 2 +- .../module/main/presenter/WebPresenter.java | 9 +- .../module/mine/activity/AboutActivity.java | 26 +- .../module/mine/activity/AboutMeActivity.java | 8 +- .../mine/activity/CollectionActivity.java | 2 +- .../mine/activity/HostInterruptActivity.java | 2 +- .../module/mine/activity/MessageActivity.kt | 2 +- .../mine/activity/ReadLaterActivity.java | 10 +- .../mine/activity/ReadRecordActivity.java | 10 +- .../module/mine/activity/SettingActivity.java | 20 +- .../mine/fragment/CollectionLinkFragment.java | 4 +- .../module/mine/fragment/MineFragment.java | 2 +- .../mine/presenter/AboutMePresenter.java | 17 +- .../wanandroid/utils/MultiStateUtils.kt | 4 +- .../wanandroid/utils/PredefinedTaskQueen.kt | 4 +- .../wanandroid/utils/RvConfigUtils.java | 15 +- .../utils/biometric/BiometricHelper.kt | 9 +- .../utils/wanpwd/AboutMeWanPwd.java | 6 +- .../wanandroid/utils/wanpwd/CDKeyWanPwd.java | 12 +- .../utils/wanpwd/CreateCDKeyWanPwd.java | 16 +- .../utils/wanpwd/FestivalWanPwd.java | 131 -------- .../wanandroid/utils/wanpwd/QQWanPwd.java | 6 +- .../utils/wanpwd/UnknownWanPwd.java | 6 +- .../utils/wanpwd/UserPageWanPwd.java | 6 +- .../wanandroid/utils/wanpwd/WanPwdParser.java | 4 - .../wanandroid/utils/wanpwd/WebWanPwd.java | 6 +- .../utils/web/HostInterceptUtils.java | 8 +- .../wanandroid/utils/web/WebHolder.java | 4 +- .../utils/web/WebScrollableUtils.kt | 2 +- .../wanandroid/widget/AccountInputView.java | 2 +- .../wanandroid/widget/EmailInputView.java | 2 +- .../wanandroid/widget/PasswordInputView.java | 2 +- .../widget/refresh/ShiciRefreshHeader.java | 15 +- app/src/main/res/layout/action_bar_search.xml | 2 +- app/src/main/res/layout/action_bar_web.xml | 2 +- app/src/main/res/layout/activity_about.xml | 14 +- app/src/main/res/layout/activity_about_me.xml | 4 +- .../res/layout/activity_article_float_btn.xml | 8 +- .../main/res/layout/activity_article_list.xml | 2 +- app/src/main/res/layout/activity_auth.xml | 4 +- .../main/res/layout/activity_book_details.xml | 8 +- app/src/main/res/layout/activity_coin.xml | 2 +- .../main/res/layout/activity_coin_rank.xml | 2 +- app/src/main/res/layout/activity_crash.xml | 8 +- .../res/layout/activity_knowledge_article.xml | 2 +- .../main/res/layout/activity_mine_share.xml | 2 +- app/src/main/res/layout/activity_open.xml | 2 +- .../main/res/layout/activity_read_later.xml | 4 +- .../main/res/layout/activity_read_record.xml | 4 +- app/src/main/res/layout/activity_scan.xml | 6 +- app/src/main/res/layout/activity_setting.xml | 32 +- .../res/layout/activity_share_article.xml | 18 +- .../main/res/layout/activity_user_info.xml | 6 +- .../main/res/layout/activity_user_page.xml | 6 +- app/src/main/res/layout/dialog_add_host.xml | 8 +- .../main/res/layout/dialog_article_share.xml | 10 +- app/src/main/res/layout/dialog_card_share.xml | 4 +- .../main/res/layout/dialog_copied_link.xml | 2 +- .../res/layout/dialog_edit_collect_link.xml | 8 +- app/src/main/res/layout/dialog_guide_btn.xml | 2 +- app/src/main/res/layout/dialog_guide_tip.xml | 2 +- app/src/main/res/layout/dialog_image_menu.xml | 4 +- .../main/res/layout/dialog_image_preview.xml | 2 +- app/src/main/res/layout/dialog_info_edit.xml | 8 +- app/src/main/res/layout/dialog_password.xml | 6 +- .../main/res/layout/dialog_privacy_policy.xml | 6 +- app/src/main/res/layout/dialog_web_guide.xml | 6 +- app/src/main/res/layout/dialog_web_menu.xml | 18 +- app/src/main/res/layout/dialog_web_quick.xml | 6 +- app/src/main/res/layout/dialog_web_share.xml | 6 +- app/src/main/res/layout/fragment_book.xml | 2 +- app/src/main/res/layout/fragment_bookmark.xml | 2 +- app/src/main/res/layout/fragment_home.xml | 2 +- app/src/main/res/layout/fragment_login.xml | 4 +- app/src/main/res/layout/fragment_mine.xml | 22 +- app/src/main/res/layout/fragment_question.xml | 2 +- app/src/main/res/layout/fragment_register.xml | 4 +- .../res/layout/fragment_search_history.xml | 8 +- .../main/res/layout/fragment_user_article.xml | 2 +- .../main/res/layout/layout_about_me_info.xml | 10 +- .../res/layout/layout_about_me_sponsor.xml | 2 +- .../res/layout/layout_app_qrcode_share.xml | 4 +- .../layout/layout_article_qrcode_share.xml | 6 +- .../layout/layout_shici_refresh_header.xml | 2 +- .../res/layout/layout_state_empty_center.xml | 2 +- .../res/layout/layout_state_empty_top.xml | 2 +- .../res/layout/layout_state_error_center.xml | 2 +- .../res/layout/layout_state_error_top.xml | 2 +- app/src/main/res/layout/rv_item_article.xml | 16 +- .../main/res/layout/rv_item_book_chapter.xml | 4 +- app/src/main/res/layout/rv_item_bookmark.xml | 2 +- .../main/res/layout/rv_item_coin_record.xml | 2 +- .../res/layout/rv_item_collection_link.xml | 12 +- .../res/layout/rv_item_dialog_web_menu.xml | 2 +- app/src/main/res/layout/rv_item_knowledge.xml | 2 +- .../res/layout/rv_item_knowledge_child.xml | 2 +- .../res/layout/rv_item_message_readed.xml | 2 +- .../res/layout/rv_item_message_unread.xml | 10 +- .../res/layout/rv_item_mine_share_article.xml | 2 +- app/src/main/res/layout/rv_item_open.xml | 2 +- .../main/res/layout/rv_item_read_later.xml | 8 +- .../main/res/layout/rv_item_read_record.xml | 8 +- .../res/layout/rv_item_search_history.xml | 2 +- .../main/res/layout/rv_item_search_hot.xml | 2 +- app/src/main/res/layout/tab_item_main.xml | 2 +- basic_l10n/src/main/res/values-zh/strings.xml | 279 ++++++++++++++++ basic_l10n/src/main/res/values/strings.xml | 314 +++++++++++++++--- .../res/layout/basic_ui_dialog_download.xml | 4 +- .../main/res/layout/basic_ui_dialog_list.xml | 2 +- .../main/res/layout/basic_ui_dialog_tip.xml | 4 +- .../res/layout/basic_ui_dialog_update.xml | 2 +- .../layout/basic_ui_rv_item_dialog_list.xml | 2 +- .../src/main/res/layout/basic_ui_toast.xml | 2 +- .../java/per/goweii/basic/utils/ResUtils.java | 12 +- .../per/goweii/basic/utils/ShareUtils.java | 4 +- .../java/per/goweii/basic/utils/Utils.java | 80 ++++- 138 files changed, 1140 insertions(+), 621 deletions(-) delete mode 100644 app/src/main/java/per/goweii/wanandroid/utils/wanpwd/FestivalWanPwd.java create mode 100644 basic_l10n/src/main/res/values-zh/strings.xml diff --git a/app/src/main/java/per/goweii/wanandroid/http/WanCache.java b/app/src/main/java/per/goweii/wanandroid/http/WanCache.java index c9741c3a..5464b7d6 100644 --- a/app/src/main/java/per/goweii/wanandroid/http/WanCache.java +++ b/app/src/main/java/per/goweii/wanandroid/http/WanCache.java @@ -49,7 +49,7 @@ public static void init() { public static WanCache getInstance() { if (INSTANCE == null) { - throw new RuntimeException("WanCache未初始化"); + throw new RuntimeException("WanCache is not initialized"); } return INSTANCE; } @@ -60,7 +60,7 @@ private WanCache() { private DiskLruCache getDiskLruCache() { if (mDiskLruCache == null) { - throw new RuntimeException("WanCache未初始化或初始化失败"); + throw new RuntimeException("WanCache is not initialized"); } return mDiskLruCache; } diff --git a/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java b/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java index b1dac3a1..1368b7b5 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java +++ b/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java @@ -40,7 +40,7 @@ protected void convert(@NonNull BaseViewHolder helper, @NonNull BookChapterBean tv_title.setText((helper.getAdapterPosition() + 1) + ". " + Html.fromHtml(item.getArticleBean().getTitle())); if (item.getTime() == 0) { ll_state.setVisibility(View.VISIBLE); - tv_state.setText("未学习"); + tv_state.setText(R.string.not_learned); tv_state.setTextColor(ResUtils.getThemeColor(tv_state, R.attr.colorTextThird)); pb_percent.setVisibility(View.INVISIBLE); tv_time.setVisibility(View.INVISIBLE); @@ -49,12 +49,12 @@ protected void convert(@NonNull BaseViewHolder helper, @NonNull BookChapterBean tv_time.setVisibility(View.VISIBLE); tv_time.setText(sdf.format(new Date(item.getTime()))); if (item.getPercent() >= 0.98) { - tv_state.setText("已学完"); + tv_state.setText(R.string.already_learned); tv_state.setTextColor(ResUtils.getThemeColor(tv_state, R.attr.colorTextAccent)); pb_percent.setVisibility(View.INVISIBLE); } else { ll_state.setVisibility(View.VISIBLE); - tv_state.setText("已学" + ((int) (item.getPercent() * 100)) + "%"); + tv_state.setText(mContext.getString(R.string.learned_n_percent, (int) (item.getPercent() * 100))); tv_state.setTextColor(ResUtils.getThemeColor(tv_state, R.attr.colorTextMain)); pb_percent.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java b/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java index e654f667..cafc37ef 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/activity/UserPageActivity.java @@ -137,12 +137,12 @@ public void onClick(View v) { } id.append(salt); StringBuilder s = new StringBuilder(); - s.append("【玩口令】你的好友给你分享了一个神秘用户,户制泽条消息"); - s.append(String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_USERPAGE, id.toString())); - s.append("打開最美玩安卓客户端揭开他/她的神秘面纱"); + String content = ResUtils.getString(R.string.your_friend_has_shared_a_mystery_user_with_you); + String key = String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_USERPAGE, id.toString()); + s.append(String.format(content, key)); LogUtils.d("UserPageActivity", s); CopyUtils.copyText(s.toString()); - ToastMaker.showShort("口令已复制"); + ToastMaker.showShort(getString(R.string.copied)); } }); mSmartRefreshUtils = SmartRefreshUtils.with(binding.srl); diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java index 57d07af1..2b18ed44 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/HomeFragment.java @@ -467,7 +467,7 @@ public void onHeaderMoving(RefreshHeader header, boolean isDragging, float perce abc.getTranslationY(), -abc.getHeight()); abcAnim.start(); if (shiciRefreshHeader != null) { - shiciRefreshHeader.setTextAndHideIcon("释放进入书籍教程"); + shiciRefreshHeader.setTextAndHideIcon(getString(R.string.release_into_the_book_tutorial)); } } } else { @@ -836,7 +836,7 @@ public void allFail() { private void updateActionBarByConfig(@NonNull HomeActionBarEvent event) { if (abc != null) { if (event.getHomeTitle() == null) { - abc.getTitleTextView().setText("首页"); + abc.getTitleTextView().setText(R.string.homepage); } else { abc.getTitleTextView().setText(event.getHomeTitle()); } diff --git a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java index 2e3c8b7c..45433284 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/home/fragment/SearchHistoryFragment.java @@ -224,7 +224,7 @@ protected void onClick2(View v) { break; case R.id.tv_clean: TipDialog.with(getContext()) - .message("确定要清除搜索历史?") + .message(R.string.make_sure_you_want_to_clear_your_search_history) .onYes(new SimpleCallback() { @Override public void onResult(Void data) { diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java b/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java index 7d5100dc..1c4dec75 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/login/activity/AuthActivity.java @@ -164,16 +164,16 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten switch (requestCode) { case REQ_CODE_OPEN_QUICK_LOGIN: if (resultCode == RESULT_OK) { - ToastMaker.showShort("开启快捷登录成功"); + ToastMaker.showShort(getString(R.string.enabled_quick_sign_in_successfully)); } finish(); break; case REQ_CODE_USE_QUICK_LOGIN: if (resultCode == RESULT_OK) { - ToastMaker.showShort("快捷登录成功"); + ToastMaker.showShort(getString(R.string.quick_sign_in_successful)); finish(); } else { - ToastMaker.showShort("快捷登录失败,请使用密码登录"); + ToastMaker.showShort(getString(R.string.quick_sign_in_failed)); } break; default: diff --git a/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt index 2bc931d8..3abae8e1 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/login/activity/QuickLoginActivity.kt @@ -13,6 +13,7 @@ import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.utils.Base64Utils.decodeToBytes import per.goweii.swipeback.SwipeBackAbility import per.goweii.swipeback.SwipeBackDirection +import per.goweii.wanandroid.R import per.goweii.wanandroid.databinding.ActivityQuickLoginBinding import per.goweii.wanandroid.event.LoginEvent import per.goweii.wanandroid.module.login.model.LoginInfoEntity @@ -114,7 +115,7 @@ class QuickLoginActivity : BaseActivity finishWithFailed() } - biometricHelper.authForEncode("是否开启快捷登录", "暂不开启") + biometricHelper.authForEncode(getString(R.string.whether_to_enable_quick_login), getString(R.string.not_enabled_yet)) } @RequiresApi(Build.VERSION_CODES.M) @@ -138,7 +139,7 @@ class QuickLoginActivity : BaseActivity() override fun addReadLaterSuccess() { switchReadLaterIcon() - ToastMaker.showShort("已加入我的书签") + ToastMaker.showShort(getString(R.string.added_to_my_bookmarks)) } override fun addReadLaterFailed() { switchReadLaterIcon() - ToastMaker.showShort("加入我的书签失败") + ToastMaker.showShort(getString(R.string.failed_to_add_my_bookmarks)) } override fun removeReadLaterSuccess() { switchReadLaterIcon() - ToastMaker.showShort("已移出我的书签") + ToastMaker.showShort(getString(R.string.moved_out_of_my_bookmarks)) } override fun removeReadLaterFailed() { switchReadLaterIcon() - ToastMaker.showShort("移出我的书签失败") + ToastMaker.showShort(getString(R.string.failed_to_move_out_of_my_bookmarks)) } private fun switchReadLaterIcon() { @@ -596,7 +596,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_tip, null, false).apply { findViewById(R.id.dialog_guide_tv_tip).apply { - text = "长按返回按钮有更多快捷菜单~" + text = getString(R.string.long_press_the_back_button_to_have_more_shortcut_menus) } } marginLeft = ResUtils.getDimens(R.dimen.margin_def).toInt() @@ -610,7 +610,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_btn, null, false).apply { findViewById(R.id.dialog_guide_tv_btn).apply { - text = "下一个" + text = getString(R.string.next) } } marginBottom = ResUtils.getDimens(R.dimen.margin_big).toInt() @@ -647,7 +647,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_tip, null, false).apply { findViewById(R.id.dialog_guide_tv_tip).apply { - text = "双击任意位置可快速收藏~" + text = getString(R.string.double_click_anywhere_to_quickly_bookmark) } } horizontalAlign = GuideLayer.Align.Horizontal.CENTER @@ -660,7 +660,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_btn, null, false).apply { findViewById(R.id.dialog_guide_tv_btn).apply { - text = "下一个" + text = getString(R.string.next) } } horizontalAlign = GuideLayer.Align.Horizontal.CENTER @@ -696,7 +696,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_tip, null, false).apply { findViewById(R.id.dialog_guide_tv_tip).apply { - text = "长按网页图片可预览大图~" + text = getString(R.string.long_press_the_web_image_to_preview_a_larger_image) } } horizontalAlign = GuideLayer.Align.Horizontal.CENTER @@ -709,7 +709,7 @@ class ArticleActivity : BaseActivity() guideView = LayoutInflater.from(this@ArticleActivity) .inflate(R.layout.dialog_guide_btn, null, false).apply { findViewById(R.id.dialog_guide_tv_btn).apply { - text = "我知道了" + text = getString(R.string.i_know) } } horizontalAlign = GuideLayer.Align.Horizontal.CENTER diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt index 933ee63a..11f7d2fd 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt @@ -35,7 +35,7 @@ class CrashActivity : AppCompatActivity() { binding.tvCopyLog.setOnClickListener { val cm = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager cm.setPrimaryClip(ClipData.newPlainText("error", binding.tvError.text)) - binding.tvCopyLog.text = "已复制" + binding.tvCopyLog.text = getString(R.string.copied) } binding.btnExit.setOnClickListener { finish() diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java index 7559f465..982d5482 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/MainActivity.java @@ -561,7 +561,7 @@ public void onBindData(@NonNull Layer layer) { child.setPadding(0, DisplayInfoUtils.getInstance().getStatusBarHeight(), 0, 0); TextView tv_title = layer.requireView(R.id.dialog_read_later_notification_tv_title); TextView tv_desc = layer.requireView(R.id.dialog_read_later_notification_tv_desc); - tv_title.setText("是否继续阅读?"); + tv_title.setText(getString(R.string.read_on_or_not)); tv_desc.setText(readLaterModel.getTitle()); } }) diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt index a83b10a9..d9da85e2 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/ScanActivity.kt @@ -41,7 +41,8 @@ import per.goweii.wanandroid.utils.UrlOpenUtils * @author CuiZhen * @date 2020/2/26 */ -class ScanActivity : BaseActivity(), ScanView, SwipeBackAbility.Direction, SwipeBackAbility.Transformer { +class ScanActivity : BaseActivity(), ScanView, + SwipeBackAbility.Direction, SwipeBackAbility.Transformer { companion object { private const val REQ_CODE_PERMISSION_CAMERA = 1 @@ -53,8 +54,8 @@ class ScanActivity : BaseActivity(), ScanVie val intent = Intent(activity, ScanActivity::class.java) activity.startActivity(intent) activity.overridePendingTransition( - R.anim.swipeback_activity_open_bottom_in, - R.anim.swipeback_activity_open_alpha_out + R.anim.swipeback_activity_open_bottom_in, + R.anim.swipeback_activity_open_alpha_out ) } @@ -63,8 +64,8 @@ class ScanActivity : BaseActivity(), ScanVie val intent = Intent(activity, ScanActivity::class.java) activity.startActivityForResult(intent, requestCode) activity.overridePendingTransition( - R.anim.swipeback_activity_open_bottom_in, - R.anim.swipeback_activity_open_alpha_out + R.anim.swipeback_activity_open_bottom_in, + R.anim.swipeback_activity_open_alpha_out ) } } @@ -110,9 +111,9 @@ class ScanActivity : BaseActivity(), ScanVie addDecorator( binding.frozenView, binding.finderView, - BeepDecorator(), - VibrateDecorator(), - GestureDecorator() + BeepDecorator(), + VibrateDecorator(), + GestureDecorator() ) onFound { onScanQRCodeSuccess(it.first().text) @@ -133,48 +134,60 @@ class ScanActivity : BaseActivity(), ScanVie override fun finish() { super.finish() overridePendingTransition( - R.anim.swipeback_activity_close_alpha_in, - R.anim.swipeback_activity_close_bottom_out + R.anim.swipeback_activity_close_alpha_in, + R.anim.swipeback_activity_close_bottom_out ) } private fun startScan() { mRuntimeRequester = AnyPermission.with(context) - .runtime(REQ_CODE_PERMISSION_CAMERA) - .permissions(Manifest.permission.CAMERA) - .onBeforeRequest { _, executor -> - showTip("扫二维码需要相机权限", "点击申请", { + .runtime(REQ_CODE_PERMISSION_CAMERA) + .permissions(Manifest.permission.CAMERA) + .onBeforeRequest { _, executor -> + showTip( + getString(R.string.scanning_the_qr_code_requires_camera_permission), + getString(R.string.click_apply), + { hideTip() executor.execute() }) - } - .onBeenDenied { _, executor -> - showTip("拒绝相机权限将无法扫码", "重新申请", { + } + .onBeenDenied { _, executor -> + showTip( + getString(R.string.camera_permission_denied_tips), + getString(R.string.reapply), + { hideTip() executor.execute() }) - } - .onGoSetting { _, executor -> - showTip("相机权限已被拒绝", "去设置", { + } + .onGoSetting { _, executor -> + showTip( + getString(R.string.camera_permission_always_denied_tips), + getString(R.string.go_to_settings), + { hideTip() executor.execute() }) + } + .request(object : RequestListener { + @SuppressLint("MissingPermission") + override fun onSuccess() { + binding.ivTorch.visible() + binding.finderView.visible() + codeScanner?.startScan() } - .request(object : RequestListener { - @SuppressLint("MissingPermission") - override fun onSuccess() { - binding.ivTorch.visible() - binding.finderView.visible() - codeScanner?.startScan() - } - override fun onFailed() { - showTip("无法获取相机权限", "点击获取", { + override fun onFailed() { + showTip( + getString(R.string.unable_to_get_camera_permissions), + getString(R.string.click_get), + { hideTip() startScan() }) - } - }) + } + }) } private fun stopScan() { @@ -186,44 +199,59 @@ class ScanActivity : BaseActivity(), ScanVie private fun startAlbum() { stopScan() mRuntimeRequester = AnyPermission.with(context) - .runtime(REQ_CODE_PERMISSION_ALBUM) - .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) - .onBeforeRequest { _, executor -> - showTip("选择图片需要存储权限", "点击申请", { + .runtime(REQ_CODE_PERMISSION_ALBUM) + .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .onBeforeRequest { _, executor -> + showTip( + getString(R.string.selecting_an_image_requires_storage_permissions), + getString(R.string.click_apply), + { hideTip() executor.execute() - }, "返回扫码", { + }, + getString(R.string.return_to_scan_the_code), + { hideTip() executor.cancel() }) - } - .onBeenDenied { _, executor -> - showTip("拒绝存储权限将无法选择图片", "重新申请", { + } + .onBeenDenied { _, executor -> + showTip( + getString(R.string.storage_permission_denied_tips), + getString(R.string.reapply), + { hideTip() executor.execute() - }, "返回扫码", { + }, + getString(R.string.return_to_scan_the_code), + { hideTip() executor.cancel() }) - } - .onGoSetting { _, executor -> - showTip("存储权限已被拒绝", "去设置", { + } + .onGoSetting { _, executor -> + showTip( + getString(R.string.storage_permission_always_denied_tips), + getString(R.string.go_to_settings), + { hideTip() executor.execute() - }, "返回扫码", { + }, + getString(R.string.return_to_scan_the_code), + { hideTip() executor.cancel() }) + } + .request(object : RequestListener { + override fun onSuccess() { + PictureSelector.select(this@ScanActivity, REQ_CODE_SELECT_PIC) } - .request(object : RequestListener { - override fun onSuccess() { - PictureSelector.select(this@ScanActivity, REQ_CODE_SELECT_PIC) - } - override fun onFailed() { - startScan() - } - }) + override fun onFailed() { + startScan() + } + }) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -232,9 +260,11 @@ class ScanActivity : BaseActivity(), ScanVie REQ_CODE_PERMISSION_CAMERA -> { mRuntimeRequester?.onActivityResult(requestCode) } + REQ_CODE_PERMISSION_ALBUM -> { mRuntimeRequester?.onActivityResult(requestCode) } + REQ_CODE_SELECT_PIC -> { PictureSelector.result(resultCode, data)?.let { BitmapUtils.getBitmapFromUri(context, it)?.let { bitmap -> @@ -242,15 +272,21 @@ class ScanActivity : BaseActivity(), ScanVie decoder.decode(bitmap, onSuccess = { results -> onAlbumQRCodeSuccess(results.first().text) }, onFailure = { - showTip("没有识别到二维码", "返回扫码", { - hideTip() - startScan() - }) + showTip( + getString(R.string.no_qr_code_is_recognized), + getString(R.string.return_to_scan_the_code), + { + hideTip() + startScan() + }) + }) + } ?: showTip( + getString(R.string.failed_to_open_the_image), + getString(R.string.return_to_scan_the_code), + { + hideTip() + startScan() }) - } ?: showTip("打开图片失败", "返回扫码", { - hideTip() - startScan() - }) } ?: startScan() } } @@ -277,7 +313,13 @@ class ScanActivity : BaseActivity(), ScanVie tvTipAnim = null } - private fun showTip(text: String, btnSure: String, onSure: View.OnClickListener, btnCancel: String? = null, onCancel: View.OnClickListener? = null) { + private fun showTip( + text: String, + btnSure: String, + onSure: View.OnClickListener, + btnCancel: String? = null, + onCancel: View.OnClickListener? = null + ) { binding.llTip ?: return binding.tvTipText.text = text binding.tvTipBtnSure.text = btnSure diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java b/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java index b070e76f..7bea408b 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/WebActivity.java @@ -325,7 +325,7 @@ private void showQuickDialog() { @Override public void onCopyLink() { CopyUtils.copyText(mWebHolder.getUrl()); - ToastMaker.showShort("已复制"); + ToastMaker.showShort(getString(R.string.copied)); } @Override @@ -337,12 +337,12 @@ public void onBrowser() { public void onWanPwd() { String url = URLEncoder.encode(mWebHolder.getUrl()); StringBuilder s = new StringBuilder(); - s.append("【玩口令】你的好友给你分享了一个链接,户制泽条消息"); - s.append(String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_WEB, url)); - s.append("打開最美玩安卓客户端即可查看该网页或者文章"); + String content = getString(R.string.your_friend_shared_a_link_with_you); + String key = String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_WEB, url); + s.append(String.format(content, key)); LogUtils.d("UserPageActivity", s); CopyUtils.copyText(s.toString()); - ToastMaker.showShort("口令已复制"); + ToastMaker.showShort(getString(R.string.copied)); } }); mWebQuickDialog.addOnDismissListener(new Layer.OnDismissListener() { diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ArticleShareDialog.kt b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ArticleShareDialog.kt index 53db15ef..847d28d6 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ArticleShareDialog.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ArticleShareDialog.kt @@ -163,15 +163,15 @@ class ArticleShareDialog( runtimeRequester = PermissionUtils.request(object : RequestListener { override fun onSuccess() { if (BitmapUtils.saveGallery(bitmap, "wanandroid_app_" + System.currentTimeMillis())) { - ToastMaker.showShort("保存成功") + ToastMaker.showShort(activity.getString(R.string.save_successful)) } else { - ToastMaker.showShort("保存失败") + ToastMaker.showShort(activity.getString(R.string.save_failed)) } bitmap.recycle() } override fun onFailed() { - ToastMaker.showShort("授权失败") + ToastMaker.showShort(activity.getString(R.string.authorization_failed)) bitmap.recycle() } }, activity, reqCodePermission, Manifest.permission.WRITE_EXTERNAL_STORAGE) diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/CardShareDialog.kt b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/CardShareDialog.kt index 6f371fdf..6abc6911 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/CardShareDialog.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/CardShareDialog.kt @@ -118,15 +118,15 @@ class CardShareDialog( runtimeRequester = PermissionUtils.request(object : RequestListener { override fun onSuccess() { if (BitmapUtils.saveGallery(bitmap, "wanandroid_app_" + System.currentTimeMillis())) { - ToastMaker.showShort("保存成功") + ToastMaker.showShort(activity.getString(R.string.save_successful)) } else { - ToastMaker.showShort("保存失败") + ToastMaker.showShort(activity.getString(R.string.save_failed)) } bitmap.recycle() } override fun onFailed() { - ToastMaker.showShort("授权失败") + ToastMaker.showShort(activity.getString(R.string.authorization_failed)) bitmap.recycle() } }, activity, reqCodePermission, Manifest.permission.WRITE_EXTERNAL_STORAGE) diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImageMenuDialog.kt b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImageMenuDialog.kt index 7021ab27..c8b9ec2f 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImageMenuDialog.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImageMenuDialog.kt @@ -96,9 +96,9 @@ class ImageMenuDialog( PermissionUtils.request(object : RequestListener { override fun onSuccess() { if (BitmapUtils.saveGallery(bitmap, "wanandroid_article_image_${System.currentTimeMillis()}")) { - ToastMaker.showShort("以保存到相册") + ToastMaker.showShort(activity.getString(R.string.save_successful)) } else { - ToastMaker.showShort("保存失败") + ToastMaker.showShort(activity.getString(R.string.save_failed)) } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImagePreviewDialog.kt b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImagePreviewDialog.kt index 86f5d866..76403446 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImagePreviewDialog.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/ImagePreviewDialog.kt @@ -115,19 +115,19 @@ class ImagePreviewDialog( when { progress >= 1F -> { tv_tip.gone() - tv_tip.text = "加载成功" + tv_tip.text = activity.getString(R.string.loaded_successfully) } progress < 0F -> { tv_tip.visible() - tv_tip.text = "加载失败" + tv_tip.text = activity.getString(R.string.loaded_failed) } progress == 0F -> { tv_tip.visible() - tv_tip.text = "加载中" + tv_tip.text = activity.getString(R.string.loading) } else -> { tv_tip.visible() - tv_tip.text = "加载中(${(progress * 100).toInt()}%)" + tv_tip.text = activity.getString(R.string.loading_n_percent, (progress * 100).toInt()) } } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/WebMenuDialog.java b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/WebMenuDialog.java index 8b9510db..ff0d12f3 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/dialog/WebMenuDialog.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/dialog/WebMenuDialog.java @@ -124,7 +124,7 @@ public void onBindData(@NonNull Layer layer) { tv_host.setVisibility(View.GONE); } else { tv_host.setVisibility(View.VISIBLE); - tv_host.setText("网页由 " + host + " 提供"); + tv_host.setText(tv_host.getContext().getString(R.string.this_webpage_is_provided_by, host)); } ImageView iv_collect = layer.requireView(R.id.dialog_web_menu_iv_collect); TextView tv_collect = layer.requireView(R.id.dialog_web_menu_tv_collect); @@ -150,9 +150,9 @@ public boolean onLongClick(View v) { private static void switchCollectState(ImageView iv_collect, TextView tv_collect, boolean collected) { setIconChecked(iv_collect, collected); if (collected) { - tv_collect.setText("已收藏"); + tv_collect.setText(R.string.collected); } else { - tv_collect.setText("收藏"); + tv_collect.setText(R.string.collect); } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java index d04d46b9..4119a07d 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/KnowledgeNavigationFragment.java @@ -58,7 +58,7 @@ protected BasePresenter initPresenter() { @Override protected void initView() { mAdapter = new FixedFragmentPagerAdapter(getChildFragmentManager()); - mAdapter.setTitles("体系", "导航"); + mAdapter.setTitles(getString(R.string.architecture), getString(R.string.navigation)); mAdapter.setFragmentList( KnowledgeFragment.create(), NaviFragment.create() diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java index fdb69cdd..f5ca706c 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/fragment/MainFragment.java @@ -68,11 +68,11 @@ protected BasePresenter initPresenter() { @Override protected void initView() { mTabFragmentPagerAdapter = new TabFragmentPagerAdapter<>(getChildFragmentManager(), vp_tab, ll_bottom_bar, R.layout.tab_item_main); - mMinePage = new TabFragmentPagerAdapter.Page<>(MineFragment.create(), new TabEntity("我的", R.drawable.ic_bottom_bar_mine, -1), new MainTabAdapter()); + mMinePage = new TabFragmentPagerAdapter.Page<>(MineFragment.create(), new TabEntity(getString(R.string.mine), R.drawable.ic_bottom_bar_mine, -1), new MainTabAdapter()); mTabFragmentPagerAdapter.setPages( - new TabFragmentPagerAdapter.Page<>(HomeFragment.create(), new TabEntity("首页", R.drawable.ic_bottom_bar_home, -1), new MainTabAdapter()), - new TabFragmentPagerAdapter.Page<>(QuestionFragment.create(), new TabEntity("问答", R.drawable.ic_bottom_bar_ques, -1), new MainTabAdapter()), - new TabFragmentPagerAdapter.Page<>(KnowledgeNavigationFragment.create(), new TabEntity("体系", R.drawable.ic_bottom_bar_navi, -1), new MainTabAdapter()), + new TabFragmentPagerAdapter.Page<>(HomeFragment.create(), new TabEntity(getString(R.string.homepage), R.drawable.ic_bottom_bar_home, -1), new MainTabAdapter()), + new TabFragmentPagerAdapter.Page<>(QuestionFragment.create(), new TabEntity(getString(R.string.qa), R.drawable.ic_bottom_bar_ques, -1), new MainTabAdapter()), + new TabFragmentPagerAdapter.Page<>(KnowledgeNavigationFragment.create(), new TabEntity(getString(R.string.architecture), R.drawable.ic_bottom_bar_navi, -1), new MainTabAdapter()), mMinePage ); vp_tab.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/model/ArticleBean.java b/app/src/main/java/per/goweii/wanandroid/module/main/model/ArticleBean.java index 612ff21e..2a5dbe7e 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/model/ArticleBean.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/model/ArticleBean.java @@ -4,7 +4,9 @@ import java.util.List; +import per.goweii.basic.utils.ResUtils; import per.goweii.rxhttp.request.base.BaseBean; +import per.goweii.wanandroid.R; /** * @author CuiZhen @@ -31,7 +33,7 @@ public class ArticleBean extends BaseBean { * publishTime : 1557072000000 * superChapterId : 408 * superChapterName : 公众号 - * tags : [{"name":"公众号","url":"/wxarticle/list/410/1"}] + * tags : [{"name":"WX","url":"/wxarticle/list/410/1"}] * title : 深扒 EventBus:register * type : 0 * userId : -1 @@ -82,7 +84,7 @@ public String getAuthor() { if (!TextUtils.isEmpty(shareUser)) { return shareUser; } - return "匿名"; + return ResUtils.getString(R.string.anonymous); } public String getShareUser() { diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/model/MainRequest.java b/app/src/main/java/per/goweii/wanandroid/module/main/model/MainRequest.java index 88838939..ec155856 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/model/MainRequest.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/model/MainRequest.java @@ -6,9 +6,12 @@ import java.util.List; import io.reactivex.disposables.Disposable; +import per.goweii.basic.utils.ResUtils; import per.goweii.rxhttp.core.RxLife; import per.goweii.rxhttp.request.base.BaseBean; import per.goweii.rxhttp.request.exception.ExceptionHandle; +import per.goweii.wanandroid.R; +import per.goweii.wanandroid.common.WanApp; import per.goweii.wanandroid.http.BaseRequest; import per.goweii.wanandroid.http.RequestCallback; import per.goweii.wanandroid.http.RequestListener; @@ -84,7 +87,7 @@ public void onFailed(int code, String msg) { } })); } else { - listener.onFailed(WanApi.ApiCode.ERROR, "非内测用户"); + listener.onFailed(WanApi.ApiCode.ERROR, ResUtils.getString(R.string.not_the_beta_user)); listener.onFinish(); } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/model/UserPageBean.java b/app/src/main/java/per/goweii/wanandroid/module/main/model/UserPageBean.java index 859c8539..fcde7ed3 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/model/UserPageBean.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/model/UserPageBean.java @@ -10,7 +10,7 @@ public class UserPageBean extends BaseBean { /** * coinInfo : {"coinCount":1285,"rank":6,"userId":2,"username":"x**oyang"} - * shareArticles : {"curPage":1,"datas":[{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

从2019年10月1日更新记录,在这里也备份一份,有问题可以直接回复我。<\/p>","envelopePic":"","fresh":false,"id":9470,"link":"https://wanandroid.com/wenda/show/9470","niceDate":"1天前","niceShareDate":"1天前","origin":"","prefix":"","projectLink":"","publishTime":1569990724000,"selfVisible":0,"shareDate":1569990436000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"玩Android更新记录 [>2019-10-02]","type":1,"userId":2,"visible":1,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9410,"link":"https://juejin.im/post/5d8b34cff265da5b88209e7b","niceDate":"2019-09-28","niceShareDate":"2019-09-28","origin":"","prefix":"","projectLink":"","publishTime":1569662568000,"selfVisible":0,"shareDate":1569662568000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"滴滴开源库Booster:模块功能作用分析说明","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9409,"link":"https://www.jianshu.com/p/79b30238b994","niceDate":"2019-09-28","niceShareDate":"2019-09-28","origin":"","prefix":"","projectLink":"","publishTime":1569662550000,"selfVisible":0,"shareDate":1569662550000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"Android常见安全风险及规避措施","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

就当是问卷啦,带大家一起发现一些好用的插件,欢迎分享出来哈。<\/p>\r\n

    \r\n
  1. 好用的 chrome 插件;<\/li>\r\n
  2. 好用的 AS 插件;<\/li>\r\n
  3. ...其他<\/li>\r\n<\/ol>\r\n

    如果有链接,最好能附上链接哈~<\/p>","envelopePic":"","fresh":false,"id":9286,"link":"https://www.wanandroid.com/wenda/show/9286","niceDate":"2019-09-25","niceShareDate":"2019-09-23","origin":"","prefix":"","projectLink":"","publishTime":1569419925000,"selfVisible":0,"shareDate":1569171588000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 好用到你离不开的插件有哪些?","type":0,"userId":2,"visible":0,"zan":18},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

    这是一个很常见的需求,那么到底有多少种方案,每种各有什么特点?<\/p>","envelopePic":"","fresh":false,"id":9233,"link":"https://www.wanandroid.com/wenda/show/9233","niceDate":"2019-09-23","niceShareDate":"2019-09-17","origin":"","prefix":"","projectLink":"","publishTime":1569171675000,"selfVisible":0,"shareDate":1568731287000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 屏蔽连续点击的方案有哪些?","type":0,"userId":2,"visible":1,"zan":20},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

    wanandroid有很多开源app,最近发现通过app查看文章时,经常自动打开淘宝、京东等第三方 app。<\/p>\r\n

      \r\n
    1. h5页面怎么做到的可以让我们\u201c自动打开淘宝\u201d? <\/li>\r\n
    2. 如果认为\u201c自动打开淘宝\u201d是一个非常严重的体验问题,那么从技术角度思考该如何解决?<\/li>\r\n
    3. 除了h5 页本身写了跳转代码,还有哪些情况下会导致\u201c自动打开淘宝\u201d这样的现象产生?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9177,"link":"https://www.wanandroid.com/wenda/show/9177","niceDate":"2019-09-17","niceShareDate":"2019-09-15","origin":"","prefix":"","projectLink":"","publishTime":1568731303000,"selfVisible":0,"shareDate":1568561270000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 webview 加载的页面好像被劫持了?","type":0,"userId":2,"visible":1,"zan":6},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

      描述下Gradle 构建过程中的核心任务,以及我们能做哪些事干涉整个过程,例如:<\/p>\r\n

      第一类: 通过配置影响 task,例如:混淆,BuildConfig 等;
      第二类:我们可以add一些 listener,插入一些 task 等;<\/p>\r\n

      对于第一类,回答我们可以配置什么,有何作用;<\/p>\r\n

      对于第二类,回答我们可以怎么干,有何使用场景;<\/p>","envelopePic":"","fresh":false,"id":9113,"link":"https://www.wanandroid.com/wenda/show/9113","niceDate":"2019-09-15","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568561458000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Gradle 构建过程中,我们可以做哪些事?","type":0,"userId":2,"visible":1,"zan":7},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

      干涉指的是:<\/p>\r\n

        \r\n
      1. 有些可以通过配置,改变task执行输出产物,例如BuildConfig,混淆,签名等;<\/li>\r\n
      2. 有些可以在构建流程中插入一些自己的Task,做一些事情;<\/li>\r\n<\/ol>\r\n

        可以分别列举一些~<\/p>","envelopePic":"","fresh":false,"id":9112,"link":"https://wanandroid.com/wenda/show/9112","niceDate":"2019-09-15","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568561355000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 gradle项目构建,需要经历哪些核心task,整个构建流程哪些我们可以干涉?","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"鸿洋","chapterId":360,"chapterName":"小编发布","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9152,"link":"https://www.wanandroid.com/blog/show/2676","niceDate":"2019-09-15","niceShareDate":"2019-09-14","origin":"","prefix":"","projectLink":"","publishTime":1568561333000,"selfVisible":0,"shareDate":1568448789000,"shareUser":"鸿洋","superChapterId":298,"superChapterName":"原创文章","tags":[],"title":"我们支持大家自己投递文章啦!","type":1,"userId":2,"visible":1,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9153,"link":"https://juejin.im/post/5d7a169af265da03ad147e64","niceDate":"2019-09-14","niceShareDate":"2019-09-14","origin":"","prefix":"","projectLink":"","publishTime":1568448869000,"selfVisible":0,"shareDate":1568448869000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"Android 另一种更换字体的方式","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

        <\/p>\r\n

        打开一个 apk,忽然发现res 下没有我们熟知的 xxhdpi,xxxhdpi,替之的是:<\/p>\r\n

        drawable-xxhdpi-v4
        drawable-xxxhdpi-v4 <\/p>\r\n

        为什么会这样呢?<\/p>\r\n

        截图 Apk 点这里<\/a><\/p>","envelopePic":"","fresh":false,"id":9096,"link":"https://www.wanandroid.com/wenda/show/9096","niceDate":"2019-09-11","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568132666000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 我的资源去哪了???","type":0,"userId":2,"visible":0,"zan":8},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

        上次我们问了每日一问 关于 R.java 的生成规则,你知道多少?\r\n<\/a>,但是一个有用的知识点还是没弄清楚。<\/p>\r\n

        对于不同的 module 下,同名但值不同的资源,最终:<\/p>\r\n

          \r\n
        1. 会被覆盖成其中一个资源吗?<\/li>\r\n
        2. 如果会,那么覆盖的规则是,随机吗?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9088,"link":"https://www.wanandroid.com/wenda/show/9088","niceDate":"2019-09-09","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567959553000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 项目中同名资源,会不会覆盖,规则是怎么样的?","type":0,"userId":2,"visible":1,"zan":24},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

          作为一名 Java 开发者,这两个方法应该早已烂熟于心了。<\/p>\r\n

          今天我想问的是:<\/p>\r\n

            \r\n
          1. 两个对象,equals 相同,hashcode 一定相同吗?<\/li>\r\n
          2. hashcode 相同,equals 一定相同吗?<\/li>\r\n
          3. 二者一篇在什么时候配合?如何配合?在哪些源码中可以看到类似的配合?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9078,"link":"https://www.wanandroid.com/wenda/show/9078","niceDate":"2019-09-04","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567611191000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 equals vs hashcode ?","type":0,"userId":2,"visible":0,"zan":17},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

            一般情况,每个 app 会依赖多个 module,一般 module 里面的资源,例如 res中有个 love。<\/p>\r\n

            对应的在 module中会有个:<\/p>\r\n

            com.module.R.res.love\r\n<\/code><\/pre>

            app 中也可以使用这个资源,但是包名为:<\/p>\r\n

            com.app.R.res.love\r\n<\/code><\/pre>

            两者虽然对应一个资源,但是id 值很大概率上是不同的。<\/p>\r\n

            那么最终打包是如何处理的呢?<\/p>","envelopePic":"","fresh":false,"id":9067,"link":"https://www.wanandroid.com/wenda/show/9067","niceDate":"2019-09-01","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567351014000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 关于 R.java 的生成规则,你知道多少?","type":0,"userId":2,"visible":1,"zan":15},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

              \r\n
            1. 为什么效果比Serializable高?<\/li>\r\n
            2. 为了效率损失了什么?<\/li>\r\n
            3. 一个对象可以序列化的关键,你认为是?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9002,"link":"https://www.wanandroid.com/wenda/show/9002","niceDate":"2019-08-26","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566748970000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Parcelable 为什么效率高于 Serializable ?","type":0,"userId":2,"visible":1,"zan":31},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

              就找个细节考察下 Gradle 相关知识吧。<\/p>\r\n

              每个项目中,gradle 都会帮助我们生成一个 BuildConfig,那么:<\/p>\r\n

                \r\n
              1. 这个类有何用处?<\/li>\r\n
              2. 是在项目的编译期间,那个环节、如何生成的?<\/li>\r\n<\/ol>\r\n

                欢迎了解多少说多少,不了解学了过来总结一下。<\/p>","envelopePic":"","fresh":false,"id":8985,"link":"https://www.wanandroid.com/wenda/show/8985","niceDate":"2019-08-20","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566314853000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 今天聊一下Gradle 相关,BuildConfig这个类是如何生成的?","type":0,"userId":2,"visible":1,"zan":15},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                很多时候大家在剖析butterknife源码的时候,更多的是讲解其中的apt等,在library中使用buttterknife的时候,会使用R2.id.xxx<\/p>\r\n

                class ExampleActivity extends Activity {\r\n  @BindView(R2.id.user) EditText username;\r\n  @BindView(R2.id.pass) EditText password;\r\n...\r\n}\r\n<\/code><\/pre>

                而非R.id.xxx.<\/p>\r\n

                所以今天提问是:<\/p>\r\n

                  \r\n
                1. 简述butterknife 原理;<\/li>\r\n
                2. apt 大致开发流程;<\/li>\r\n
                3. 以及上面描述为何使用 R2.id.xxx ,怎么做到的。<\/li>\r\n<\/ol>\r\n

                  任意回答其中一点都可以。<\/p>","envelopePic":"","fresh":false,"id":8926,"link":"https://www.wanandroid.com/wenda/show/8926","niceDate":"2019-08-18","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566135745000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 butterknife 中的黑科技","type":0,"userId":2,"visible":0,"zan":5},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                  都说程序员应该对位运算了如指掌,那么Android中有哪些地方用到了呢?<\/p>\r\n

                  可否列举一些场景。<\/p>","envelopePic":"","fresh":false,"id":8913,"link":"https://wanandroid.com/wenda/show/8913","niceDate":"2019-08-13","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565704592000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Android 有哪些 位运算 的例子很值得借鉴?","type":0,"userId":2,"visible":1,"zan":4},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                    \r\n
                  1. 你有任何想问的问题<\/li>\r\n
                  2. 任何方向<\/li>\r\n
                  3. 关键词<\/li>\r\n<\/ol>\r\n

                    都可以直接留言提出。<\/p>","envelopePic":"","fresh":false,"id":8857,"link":"https://www.wanandroid.com/wenda/show/8857","niceDate":"2019-08-12","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565575082000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 问答征集","type":0,"userId":2,"visible":0,"zan":10},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                    记得曾经有位同学做贴纸应用时,有RT 的需求。<\/p>\r\n

                    默认事件分发为逆序,遍历子 View 为 (childCount ~ 0 ],有哪些方式可以修改这一策略,比如修改遍历方式为[0,childCount)?<\/p>\r\n

                    3/3<\/p>","envelopePic":"","fresh":false,"id":8852,"link":"https://www.wanandroid.com/wenda/show/8852","niceDate":"2019-08-11","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565529502000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 事件分发机制大家应该都熟记于心,默认事件分发是逆序的,有哪些方法可以修改分发顺序?","type":0,"userId":2,"visible":1,"zan":12}],"offset":0,"over":false,"pageCount":3,"size":20,"total":57} + * shareArticles : {"curPage":1,"datas":[{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"descdescdescdescdesc","envelopePic":"","fresh":false,"id":9470,"link":"https://wanandroid.com/wenda/show/9470","niceDate":"1天前","niceShareDate":"1天前","origin":"","prefix":"","projectLink":"","publishTime":1569990724000,"selfVisible":0,"shareDate":1569990436000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"玩Android更新记录 [>2019-10-02]","type":1,"userId":2,"visible":1,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9410,"link":"https://juejin.im/post/5d8b34cff265da5b88209e7b","niceDate":"2019-09-28","niceShareDate":"2019-09-28","origin":"","prefix":"","projectLink":"","publishTime":1569662568000,"selfVisible":0,"shareDate":1569662568000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"滴滴开源库Booster:模块功能作用分析说明","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9409,"link":"https://www.jianshu.com/p/79b30238b994","niceDate":"2019-09-28","niceShareDate":"2019-09-28","origin":"","prefix":"","projectLink":"","publishTime":1569662550000,"selfVisible":0,"shareDate":1569662550000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"Android常见安全风险及规避措施","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                    就当是问卷啦,带大家一起发现一些好用的插件,欢迎分享出来哈。<\/p>\r\n

                      \r\n
                    1. 好用的 chrome 插件;<\/li>\r\n
                    2. 好用的 AS 插件;<\/li>\r\n
                    3. ...其他<\/li>\r\n<\/ol>\r\n

                      如果有链接,最好能附上链接哈~<\/p>","envelopePic":"","fresh":false,"id":9286,"link":"https://www.wanandroid.com/wenda/show/9286","niceDate":"2019-09-25","niceShareDate":"2019-09-23","origin":"","prefix":"","projectLink":"","publishTime":1569419925000,"selfVisible":0,"shareDate":1569171588000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 好用到你离不开的插件有哪些?","type":0,"userId":2,"visible":0,"zan":18},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                      这是一个很常见的需求,那么到底有多少种方案,每种各有什么特点?<\/p>","envelopePic":"","fresh":false,"id":9233,"link":"https://www.wanandroid.com/wenda/show/9233","niceDate":"2019-09-23","niceShareDate":"2019-09-17","origin":"","prefix":"","projectLink":"","publishTime":1569171675000,"selfVisible":0,"shareDate":1568731287000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 屏蔽连续点击的方案有哪些?","type":0,"userId":2,"visible":1,"zan":20},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                      wanandroid有很多开源app,最近发现通过app查看文章时,经常自动打开淘宝、京东等第三方 app。<\/p>\r\n

                        \r\n
                      1. h5页面怎么做到的可以让我们\u201c自动打开淘宝\u201d? <\/li>\r\n
                      2. 如果认为\u201c自动打开淘宝\u201d是一个非常严重的体验问题,那么从技术角度思考该如何解决?<\/li>\r\n
                      3. 除了h5 页本身写了跳转代码,还有哪些情况下会导致\u201c自动打开淘宝\u201d这样的现象产生?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9177,"link":"https://www.wanandroid.com/wenda/show/9177","niceDate":"2019-09-17","niceShareDate":"2019-09-15","origin":"","prefix":"","projectLink":"","publishTime":1568731303000,"selfVisible":0,"shareDate":1568561270000,"shareUser":"","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 webview 加载的页面好像被劫持了?","type":0,"userId":2,"visible":1,"zan":6},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                        描述下Gradle 构建过程中的核心任务,以及我们能做哪些事干涉整个过程,例如:<\/p>\r\n

                        第一类: 通过配置影响 task,例如:混淆,BuildConfig 等;
                        第二类:我们可以add一些 listener,插入一些 task 等;<\/p>\r\n

                        对于第一类,回答我们可以配置什么,有何作用;<\/p>\r\n

                        对于第二类,回答我们可以怎么干,有何使用场景;<\/p>","envelopePic":"","fresh":false,"id":9113,"link":"https://www.wanandroid.com/wenda/show/9113","niceDate":"2019-09-15","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568561458000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Gradle 构建过程中,我们可以做哪些事?","type":0,"userId":2,"visible":1,"zan":7},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                        干涉指的是:<\/p>\r\n

                          \r\n
                        1. 有些可以通过配置,改变task执行输出产物,例如BuildConfig,混淆,签名等;<\/li>\r\n
                        2. 有些可以在构建流程中插入一些自己的Task,做一些事情;<\/li>\r\n<\/ol>\r\n

                          可以分别列举一些~<\/p>","envelopePic":"","fresh":false,"id":9112,"link":"https://wanandroid.com/wenda/show/9112","niceDate":"2019-09-15","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568561355000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 gradle项目构建,需要经历哪些核心task,整个构建流程哪些我们可以干涉?","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"鸿洋","chapterId":360,"chapterName":"小编发布","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9152,"link":"https://www.wanandroid.com/blog/show/2676","niceDate":"2019-09-15","niceShareDate":"2019-09-14","origin":"","prefix":"","projectLink":"","publishTime":1568561333000,"selfVisible":0,"shareDate":1568448789000,"shareUser":"鸿洋","superChapterId":298,"superChapterName":"原创文章","tags":[],"title":"我们支持大家自己投递文章啦!","type":1,"userId":2,"visible":1,"zan":0},{"apkLink":"","audit":1,"author":"","chapterId":494,"chapterName":"广场","collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":false,"id":9153,"link":"https://juejin.im/post/5d7a169af265da03ad147e64","niceDate":"2019-09-14","niceShareDate":"2019-09-14","origin":"","prefix":"","projectLink":"","publishTime":1568448869000,"selfVisible":0,"shareDate":1568448869000,"shareUser":"鸿洋","superChapterId":494,"superChapterName":"广场Tab","tags":[],"title":"Android 另一种更换字体的方式","type":0,"userId":2,"visible":0,"zan":0},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                          <\/p>\r\n

                          打开一个 apk,忽然发现res 下没有我们熟知的 xxhdpi,xxxhdpi,替之的是:<\/p>\r\n

                          drawable-xxhdpi-v4
                          drawable-xxxhdpi-v4 <\/p>\r\n

                          为什么会这样呢?<\/p>\r\n

                          截图 Apk 点这里<\/a><\/p>","envelopePic":"","fresh":false,"id":9096,"link":"https://www.wanandroid.com/wenda/show/9096","niceDate":"2019-09-11","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1568132666000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 我的资源去哪了???","type":0,"userId":2,"visible":0,"zan":8},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                          上次我们问了每日一问 关于 R.java 的生成规则,你知道多少?\r\n<\/a>,但是一个有用的知识点还是没弄清楚。<\/p>\r\n

                          对于不同的 module 下,同名但值不同的资源,最终:<\/p>\r\n

                            \r\n
                          1. 会被覆盖成其中一个资源吗?<\/li>\r\n
                          2. 如果会,那么覆盖的规则是,随机吗?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9088,"link":"https://www.wanandroid.com/wenda/show/9088","niceDate":"2019-09-09","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567959553000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 项目中同名资源,会不会覆盖,规则是怎么样的?","type":0,"userId":2,"visible":1,"zan":24},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                            作为一名 Java 开发者,这两个方法应该早已烂熟于心了。<\/p>\r\n

                            今天我想问的是:<\/p>\r\n

                              \r\n
                            1. 两个对象,equals 相同,hashcode 一定相同吗?<\/li>\r\n
                            2. hashcode 相同,equals 一定相同吗?<\/li>\r\n
                            3. 二者一篇在什么时候配合?如何配合?在哪些源码中可以看到类似的配合?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9078,"link":"https://www.wanandroid.com/wenda/show/9078","niceDate":"2019-09-04","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567611191000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 equals vs hashcode ?","type":0,"userId":2,"visible":0,"zan":17},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                              一般情况,每个 app 会依赖多个 module,一般 module 里面的资源,例如 res中有个 love。<\/p>\r\n

                              对应的在 module中会有个:<\/p>\r\n

                              com.module.R.res.love\r\n<\/code><\/pre>

                              app 中也可以使用这个资源,但是包名为:<\/p>\r\n

                              com.app.R.res.love\r\n<\/code><\/pre>

                              两者虽然对应一个资源,但是id 值很大概率上是不同的。<\/p>\r\n

                              那么最终打包是如何处理的呢?<\/p>","envelopePic":"","fresh":false,"id":9067,"link":"https://www.wanandroid.com/wenda/show/9067","niceDate":"2019-09-01","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1567351014000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 关于 R.java 的生成规则,你知道多少?","type":0,"userId":2,"visible":1,"zan":15},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                \r\n
                              1. 为什么效果比Serializable高?<\/li>\r\n
                              2. 为了效率损失了什么?<\/li>\r\n
                              3. 一个对象可以序列化的关键,你认为是?<\/li>\r\n<\/ol>","envelopePic":"","fresh":false,"id":9002,"link":"https://www.wanandroid.com/wenda/show/9002","niceDate":"2019-08-26","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566748970000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Parcelable 为什么效率高于 Serializable ?","type":0,"userId":2,"visible":1,"zan":31},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                就找个细节考察下 Gradle 相关知识吧。<\/p>\r\n

                                每个项目中,gradle 都会帮助我们生成一个 BuildConfig,那么:<\/p>\r\n

                                  \r\n
                                1. 这个类有何用处?<\/li>\r\n
                                2. 是在项目的编译期间,那个环节、如何生成的?<\/li>\r\n<\/ol>\r\n

                                  欢迎了解多少说多少,不了解学了过来总结一下。<\/p>","envelopePic":"","fresh":false,"id":8985,"link":"https://www.wanandroid.com/wenda/show/8985","niceDate":"2019-08-20","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566314853000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 今天聊一下Gradle 相关,BuildConfig这个类是如何生成的?","type":0,"userId":2,"visible":1,"zan":15},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                  很多时候大家在剖析butterknife源码的时候,更多的是讲解其中的apt等,在library中使用buttterknife的时候,会使用R2.id.xxx<\/p>\r\n

                                  class ExampleActivity extends Activity {\r\n  @BindView(R2.id.user) EditText username;\r\n  @BindView(R2.id.pass) EditText password;\r\n...\r\n}\r\n<\/code><\/pre>

                                  而非R.id.xxx.<\/p>\r\n

                                  所以今天提问是:<\/p>\r\n

                                    \r\n
                                  1. 简述butterknife 原理;<\/li>\r\n
                                  2. apt 大致开发流程;<\/li>\r\n
                                  3. 以及上面描述为何使用 R2.id.xxx ,怎么做到的。<\/li>\r\n<\/ol>\r\n

                                    任意回答其中一点都可以。<\/p>","envelopePic":"","fresh":false,"id":8926,"link":"https://www.wanandroid.com/wenda/show/8926","niceDate":"2019-08-18","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1566135745000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 butterknife 中的黑科技","type":0,"userId":2,"visible":0,"zan":5},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                    都说程序员应该对位运算了如指掌,那么Android中有哪些地方用到了呢?<\/p>\r\n

                                    可否列举一些场景。<\/p>","envelopePic":"","fresh":false,"id":8913,"link":"https://wanandroid.com/wenda/show/8913","niceDate":"2019-08-13","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565704592000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 Android 有哪些 位运算 的例子很值得借鉴?","type":0,"userId":2,"visible":1,"zan":4},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                      \r\n
                                    1. 你有任何想问的问题<\/li>\r\n
                                    2. 任何方向<\/li>\r\n
                                    3. 关键词<\/li>\r\n<\/ol>\r\n

                                      都可以直接留言提出。<\/p>","envelopePic":"","fresh":false,"id":8857,"link":"https://www.wanandroid.com/wenda/show/8857","niceDate":"2019-08-12","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565575082000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 问答征集","type":0,"userId":2,"visible":0,"zan":10},{"apkLink":"","audit":1,"author":"xiaoyang","chapterId":440,"chapterName":"官方","collect":false,"courseId":13,"desc":"

                                      记得曾经有位同学做贴纸应用时,有RT 的需求。<\/p>\r\n

                                      默认事件分发为逆序,遍历子 View 为 (childCount ~ 0 ],有哪些方式可以修改这一策略,比如修改遍历方式为[0,childCount)?<\/p>\r\n

                                      3/3<\/p>","envelopePic":"","fresh":false,"id":8852,"link":"https://www.wanandroid.com/wenda/show/8852","niceDate":"2019-08-11","niceShareDate":"未知时间","origin":"","prefix":"","projectLink":"","publishTime":1565529502000,"selfVisible":0,"shareDate":null,"shareUser":"鸿洋","superChapterId":440,"superChapterName":"问答","tags":[{"name":"问答","url":"/article/list/0?cid=440"}],"title":"每日一问 事件分发机制大家应该都熟记于心,默认事件分发是逆序的,有哪些方法可以修改分发顺序?","type":0,"userId":2,"visible":1,"zan":12}],"offset":0,"over":false,"pageCount":3,"size":20,"total":57} */ private CoinInfoBean coinInfo; diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/presenter/WebPresenter.java b/app/src/main/java/per/goweii/wanandroid/module/main/presenter/WebPresenter.java index b962d3e7..992871b9 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/presenter/WebPresenter.java +++ b/app/src/main/java/per/goweii/wanandroid/module/main/presenter/WebPresenter.java @@ -12,6 +12,7 @@ import per.goweii.basic.utils.listener.SimpleListener; import per.goweii.rxhttp.request.base.BaseBean; import per.goweii.rxhttp.request.exception.ExceptionHandle; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.db.executor.ReadLaterExecutor; import per.goweii.wanandroid.db.executor.ReadRecordExecutor; import per.goweii.wanandroid.db.model.ReadLaterModel; @@ -303,12 +304,12 @@ public void addReadLater(String link, String title) { @Override public void onResult(ReadLaterModel data) { addReadLater(data); - ToastMaker.showShort("已加入我的书签"); + ToastMaker.showShort(getContext().getString(R.string.added_to_my_bookmarks)); } }, new SimpleListener() { @Override public void onResult() { - ToastMaker.showShort("加入我的书签失败"); + ToastMaker.showShort(getContext().getString(R.string.failed_to_add_my_bookmarks)); } }); } @@ -319,12 +320,12 @@ public void deleteReadLater(String link) { @Override public void onResult() { removeReadLater(link); - ToastMaker.showShort("已移除我的书签"); + ToastMaker.showShort(getContext().getString(R.string.moved_out_of_my_bookmarks)); } }, new SimpleListener() { @Override public void onResult() { - ToastMaker.showShort("移出我的书签失败"); + ToastMaker.showShort(getContext().getString(R.string.failed_to_move_out_of_my_bookmarks)); } }); } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java index e4205a37..ce3e39bb 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutActivity.java @@ -144,17 +144,13 @@ protected void onClick2(View v) { break; case R.id.ll_beta: String msg = new StringBuilder() - .append("需要申请开通内测更新的小伙伴,") - .append("请加群(见关于作者)说明内测更新并注明玩友号(见个人资料)。") - .append("\n") - .append("\n") - .append("注:内测更新须提前登录并更新到最新正式版") + .append(getString(R.string.apply_for_a_closed_beta_msg)) .toString(); TipDialog.with(this) - .title("申请内测") + .title(getString(R.string.apply_for_a_closed_beta)) .message(msg) .msgCenter(false) - .yesText("知道了") + .yesText(getString(R.string.i_know)) .singleYesBtn() .show(); break; @@ -175,7 +171,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten public void updateSuccess(int code, UpdateBean data, int updateType) { if (UpdateUtils.getInstance().isNewest(data)) { tv_update.setTextColor(ResUtils.getThemeColor(getContext(), R.attr.colorTextMain)); - tv_update.setText("发现新版本" + data.getVersion_name()); + tv_update.setText(getString(R.string.discover_the_new_version_tips, data.getVersion_name())); switch (updateType) { case UPDATE_TYPE_REFRESH: break; @@ -208,14 +204,14 @@ public void updateSuccess(int code, UpdateBean data, int updateType) { @Override public void updateFailed(int code, String msg, int updateType) { tv_update.setTextColor(ResUtils.getThemeColor(getContext(), R.attr.colorTextThird)); - tv_update.setText("已是最新版"); + tv_update.setText(getString(R.string.this_is_the_latest_version)); } @Override public void betaUpdateSuccess(int code, UpdateBean data, int updateType) { if (UpdateUtils.getInstance().isNewest(data)) { tv_update.setTextColor(ResUtils.getThemeColor(getContext(), R.attr.colorTextAccent)); - tv_update.setText("发现内测版本" + data.getVersion_name()); + tv_update.setText(getString(R.string.discover_the_closed_beta_version_tips, data.getVersion_name())); switch (updateType) { case UPDATE_TYPE_REFRESH: break; @@ -229,12 +225,12 @@ public void betaUpdateSuccess(int code, UpdateBean data, int updateType) { } } else { tv_update.setTextColor(ResUtils.getThemeColor(getContext(), R.attr.colorTextThird)); - tv_update.setText("已是最新版"); + tv_update.setText(getString(R.string.this_is_the_latest_version)); switch (updateType) { case UPDATE_TYPE_REFRESH: break; case UPDATE_TYPE_NOTICE: - ToastMaker.showShort("已是最新版"); + ToastMaker.showShort(getString(R.string.this_is_the_latest_version)); break; case UPDATE_TYPE_SHARE: break; @@ -247,12 +243,12 @@ public void betaUpdateSuccess(int code, UpdateBean data, int updateType) { @Override public void betaUpdateFailed(int code, String msg, int updateType) { tv_update.setTextColor(ResUtils.getThemeColor(getContext(), R.attr.colorTextThird)); - tv_update.setText("已是最新版"); + tv_update.setText(getString(R.string.this_is_the_latest_version)); switch (updateType) { case UPDATE_TYPE_REFRESH: break; case UPDATE_TYPE_NOTICE: - ToastMaker.showShort("已是最新版"); + ToastMaker.showShort(getString(R.string.this_is_the_latest_version)); break; case UPDATE_TYPE_SHARE: break; @@ -311,7 +307,7 @@ public Unit invoke(View view) { TextView tv_version = view.findViewById(R.id.layout_app_qrcode_share_tv_version); ImageView iv_qrcode = view.findViewById(R.id.layout_app_qrcode_share_iv_qrcode); tv_name.setText(AppInfoUtils.getAppName()); - tv_version.setText(String.format("%s(%d)", data.getVersion_name(), data.getVersion_code())); + tv_version.setText(getString(R.string.app_version_name_code, data.getVersion_name(), data.getVersion_code())); new CodeEncoder(new ZXingEncodeQRCodeProcessor()) .encode(data.getUrl(), new Function1() { @Override diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java index 2f7b1b76..cd5ddeb5 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/AboutMeActivity.java @@ -122,12 +122,12 @@ protected void initView() { @Override public void onClick(View v) { StringBuilder s = new StringBuilder(); - s.append("【玩口令】你的好友给你订了一份双人咖啡,户制泽条消息"); - s.append(String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_ABOUTME, RandomUtils.randomLetter(10))); - s.append("打開最美玩安卓客户端即可领取品尝"); + String content = getString(R.string.your_friend_orders_you_a_coffee_for_two); + String key = String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_ABOUTME, RandomUtils.randomLetter(10)); + s.append(String.format(content, key)); LogUtils.d("UserPageActivity", s); CopyUtils.copyText(s.toString()); - ToastMaker.showShort("口令已复制"); + ToastMaker.showShort(getString(R.string.copied)); } }); changeVisible(View.INVISIBLE, civ_icon, tv_name, tv_sign); diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java index b1da41fc..18366aaf 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/CollectionActivity.java @@ -70,7 +70,7 @@ public void onClick(View v) { } }); mAdapter = new FixedFragmentPagerAdapter(getSupportFragmentManager()); - mAdapter.setTitles("文章", "网址"); + mAdapter.setTitles(getString(R.string.article), getString(R.string.website)); mAdapter.setFragmentList( CollectionArticleFragment.create(), CollectionLinkFragment.create() diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java index 13210f36..8af7e257 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/HostInterruptActivity.java @@ -70,7 +70,7 @@ public void onClick(View v) { } }); mAdapter = new FixedFragmentPagerAdapter(getSupportFragmentManager()); - mAdapter.setTitles("白名单", "黑名单"); + mAdapter.setTitles(getString(R.string.whitelist), getString(R.string.blacklist)); mAdapter.setFragmentList( HostWhiteFragment.create(), HostBlackFragment.create() diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt index dbc8f34f..780b1440 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/MessageActivity.kt @@ -49,7 +49,7 @@ class MessageActivity : BaseActivity, ActivityMessageBin } } val adapter = FixedFragmentPagerAdapter(supportFragmentManager) - adapter.setTitles("新消息", "历史消息") + adapter.setTitles(getString(R.string.new_messages),getString(R.string.historical_messages)) adapter.setFragmentList( MessageUnreadFragment.create(), MessageReadedFragment.create() diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java index 466a35ab..de3398c2 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadLaterActivity.java @@ -101,7 +101,7 @@ protected void initView() { @Override public void onClick(View v) { TipDialog.with(getContext()) - .message("确定要全部删除吗?") + .message(R.string.are_you_sure_you_want_to_delete_them_all) .onYes(new SimpleCallback() { @Override public void onResult(Void data) { @@ -149,11 +149,11 @@ public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) break; case R.id.tv_copy: CopyUtils.copyText(item.getLink()); - ToastMaker.showShort("复制成功"); + ToastMaker.showShort(getString(R.string.copied)); break; case R.id.tv_open: if (TextUtils.isEmpty(item.getLink())) { - ToastMaker.showShort("链接为空"); + ToastMaker.showShort(getString(R.string.the_link_is_empty)); break; } if (getContext() != null) { @@ -244,7 +244,7 @@ public void removeReadLaterSuccess(String link) { @Override public void removeReadLaterFailed() { - ToastMaker.showShort("删除失败"); + ToastMaker.showShort(getString(R.string.deletion_failed)); } @Override @@ -256,6 +256,6 @@ public void removeAllReadLaterSuccess() { @Override public void removeAllReadLaterFailed() { - ToastMaker.showShort("删除失败"); + ToastMaker.showShort(getString(R.string.deletion_failed)); } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java index 35568007..f5fbf079 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/ReadRecordActivity.java @@ -133,7 +133,7 @@ protected void initView() { @Override public void onClick(View v) { TipDialog.with(getContext()) - .message("确定要全部删除吗?") + .message(getString(R.string.are_you_sure_you_want_to_delete_them_all)) .onYes(new SimpleCallback() { @Override public void onResult(Void data) { @@ -181,11 +181,11 @@ public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) break; case R.id.tv_copy: CopyUtils.copyText(item.getLink()); - ToastMaker.showShort("复制成功"); + ToastMaker.showShort(getString(R.string.copied)); break; case R.id.tv_open: if (TextUtils.isEmpty(item.getLink())) { - ToastMaker.showShort("链接为空"); + ToastMaker.showShort(getString(R.string.the_link_is_empty)); break; } if (getContext() != null) { @@ -279,7 +279,7 @@ public void removeReadRecordSuccess(String link) { @Override public void removeReadRecordFailed() { - ToastMaker.showShort("删除失败"); + ToastMaker.showShort(getString(R.string.deletion_failed)); } @Override @@ -291,6 +291,6 @@ public void removeAllReadRecordSuccess() { @Override public void removeAllReadRecordFailed() { - ToastMaker.showShort("删除失败"); + ToastMaker.showShort(getString(R.string.deletion_failed)); } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index 225aeeca..e28cdc00 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -139,13 +139,13 @@ private void updateThemeModeUI() { final SettingUtils.ThemeMode themeMode = SettingUtils.getInstance().getThemeMode(); switch (themeMode) { case FOLLOW_SYSTEM: - tv_theme_mode.setText("跟随系统"); + tv_theme_mode.setText(getString(R.string.follow_the_system)); break; case LIGHT: - tv_theme_mode.setText("亮色"); + tv_theme_mode.setText(getString(R.string.light_mode)); break; case DARK: - tv_theme_mode.setText("暗色"); + tv_theme_mode.setText(getString(R.string.dark_mode)); break; } } @@ -210,13 +210,13 @@ protected void onClick2(View v) { for (SettingUtils.ThemeMode themeMode : themeModes) { switch (themeMode) { case FOLLOW_SYSTEM: - nameList.add("跟随系统"); + nameList.add(getString(R.string.follow_the_system)); break; case LIGHT: - nameList.add("亮色"); + nameList.add(getString(R.string.light_mode)); break; case DARK: - nameList.add("暗色"); + nameList.add(getString(R.string.dark_mode)); break; } } @@ -225,7 +225,7 @@ protected void onClick2(View v) { ListDialog.with(getContext()) .cancelable(true) - .title("主题模式") + .title(getString(R.string.theme_mode)) .datas(nameList) .currSelectPos(selectedPos) .listener(new ListDialog.OnItemSelectedListener() { @@ -251,7 +251,7 @@ public void run() { case R.id.rl_intercept_host: ListDialog.with(getContext()) .cancelable(true) - .title("网页拦截") + .title(getString(R.string.web_blocking)) .datas(HostInterceptUtils.getName(HostInterceptUtils.TYPE_NOTHING), HostInterceptUtils.getName(HostInterceptUtils.TYPE_ONLY_WHITE), HostInterceptUtils.getName(HostInterceptUtils.TYPE_INTERCEPT_BLACK)) @@ -267,7 +267,7 @@ public void onSelect(String data, int pos) { break; case R.id.ll_cache: TipDialog.with(getContext()) - .message("确定要清除缓存吗?") + .message(R.string.are_you_sure_you_want_to_clear_your_cache) .onYes(new SimpleCallback() { @Override public void onResult(Void data) { @@ -286,7 +286,7 @@ public void onResult(Void data) { break; case R.id.ll_logout: TipDialog.with(getContext()) - .message("确定要退出登录吗?") + .message(R.string.are_you_sure_you_want_to_log_out) .onYes(new SimpleCallback() { @Override public void onResult(Void data) { diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java index 14ee3b11..fd70ab2e 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/CollectionLinkFragment.java @@ -138,11 +138,11 @@ public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) break; case R.id.tv_copy: CopyUtils.copyText(item.getLink()); - ToastMaker.showShort("复制成功"); + ToastMaker.showShort(getString(R.string.copied)); break; case R.id.tv_open: if (TextUtils.isEmpty(item.getLink())) { - ToastMaker.showShort("链接为空"); + ToastMaker.showShort(getString(R.string.the_link_is_empty)); break; } if (getContext() != null) { diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java index 6bca71a6..c8e13d87 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/fragment/MineFragment.java @@ -244,7 +244,7 @@ private void refreshUserInfo() { } else { civ_user_icon.setImageDrawable(new ColorDrawable(Color.TRANSPARENT)); iv_blur.setImageDrawable(new ColorDrawable(Color.TRANSPARENT)); - tv_user_name.setText("去登录"); + tv_user_name.setText(getString(R.string.go_to_sign_in)); ll_user_level_ranking.setVisibility(View.INVISIBLE); tv_user_level.setText("--"); tv_user_ranking.setText("--"); diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/presenter/AboutMePresenter.java b/app/src/main/java/per/goweii/wanandroid/module/mine/presenter/AboutMePresenter.java index eee2cbb0..b0042935 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/presenter/AboutMePresenter.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/presenter/AboutMePresenter.java @@ -11,6 +11,7 @@ import per.goweii.basic.utils.CopyUtils; import per.goweii.basic.utils.bitmap.BitmapUtils; import per.goweii.basic.utils.listener.SimpleCallback; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.http.RequestCallback; import per.goweii.wanandroid.module.mine.model.AboutMeBean; import per.goweii.wanandroid.module.mine.model.MineRequest; @@ -54,7 +55,7 @@ public void openQQChat() { } } CopyUtils.copyText(mAboutMeBean.getQq()); - ToastMaker.showShort("QQ已复制"); + ToastMaker.showShort(getContext().getString(R.string.copied)); } public void openQQGroup() { @@ -69,7 +70,7 @@ public void openQQGroup() { } } CopyUtils.copyText(mAboutMeBean.getQq_group()); - ToastMaker.showShort("QQ群已复制"); + ToastMaker.showShort(getContext().getString(R.string.copied)); } public void saveQQQrcode() { @@ -83,10 +84,10 @@ public void saveQQQrcode() { @Override public void onResult(Bitmap data) { if (BitmapUtils.saveGallery(data, mAboutMeBean.getName() + "_qq_qrcode_" + System.currentTimeMillis())) { - ToastMaker.showShort("保存成功"); + ToastMaker.showShort(getContext().getString(R.string.save_successful)); AppOpenUtils.openQQ(getContext()); } else { - ToastMaker.showShort("保存失败"); + ToastMaker.showShort(getContext().getString(R.string.save_failed)); } } }); @@ -103,10 +104,10 @@ public void saveZFBQrcode() { @Override public void onResult(Bitmap data) { if (BitmapUtils.saveGallery(data, mAboutMeBean.getName() + "_qq_qrcode_" + System.currentTimeMillis())) { - ToastMaker.showShort("保存成功"); + ToastMaker.showShort(getContext().getString(R.string.save_successful)); AppOpenUtils.openZFBScan(getContext()); } else { - ToastMaker.showShort("保存失败"); + ToastMaker.showShort(getContext().getString(R.string.save_failed)); } } }); @@ -123,10 +124,10 @@ public void saveWXQrcode() { @Override public void onResult(Bitmap data) { if (BitmapUtils.saveGallery(data, mAboutMeBean.getName() + "_wx_qrcode_" + System.currentTimeMillis())) { - ToastMaker.showShort("保存成功"); + ToastMaker.showShort(getContext().getString(R.string.save_successful)); AppOpenUtils.openWechatQRCode(getContext()); } else { - ToastMaker.showShort("保存失败"); + ToastMaker.showShort(getContext().getString(R.string.save_failed)); } } }); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/MultiStateUtils.kt b/app/src/main/java/per/goweii/wanandroid/utils/MultiStateUtils.kt index 0ab76ca5..54ac9559 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/MultiStateUtils.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/MultiStateUtils.kt @@ -32,7 +32,7 @@ class MultiStateUtils { @JvmStatic @JvmOverloads - fun toEmpty(view: MultiStateView, force: Boolean = false, icon: Int? = R.drawable.ic_empty, text: String? = "什么都木有~") { + fun toEmpty(view: MultiStateView, force: Boolean = false, icon: Int? = R.drawable.ic_empty, text: String? = view.context.getString(R.string.nothing)) { if (force || view.viewState != MultiStateView.VIEW_STATE_CONTENT) { view.viewState = MultiStateView.VIEW_STATE_EMPTY } @@ -58,7 +58,7 @@ class MultiStateUtils { @JvmStatic @JvmOverloads - fun toError(view: MultiStateView, force: Boolean = false, icon: Int? = R.drawable.ic_error, text: String? = "怎么又出错~\n小场面,问题不大") { + fun toError(view: MultiStateView, force: Boolean = false, icon: Int? = R.drawable.ic_error, text: String? = view.context.getString(R.string.how_did_it_go_wrong_again)) { if (force || view.viewState != MultiStateView.VIEW_STATE_CONTENT) { view.viewState = MultiStateView.VIEW_STATE_ERROR } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/PredefinedTaskQueen.kt b/app/src/main/java/per/goweii/wanandroid/utils/PredefinedTaskQueen.kt index 82fa2562..d415a4d1 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/PredefinedTaskQueen.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/PredefinedTaskQueen.kt @@ -13,7 +13,7 @@ class PredefinedTaskQueen { fun append(task: Task) { tasks.forEach { if (it.name == task.name) { - throw IllegalArgumentException("任务名不能重复") + throw IllegalArgumentException("The task name cannot be duplicated") } } tasks.add(task) @@ -22,7 +22,7 @@ class PredefinedTaskQueen { fun get(name: String): Task { return tasks.find { it.name == name - } ?: throw NullPointerException("任务未添加") + } ?: throw NullPointerException("The task is not added") } fun start() { diff --git a/app/src/main/java/per/goweii/wanandroid/utils/RvConfigUtils.java b/app/src/main/java/per/goweii/wanandroid/utils/RvConfigUtils.java index 1dccd508..7de91aac 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/RvConfigUtils.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/RvConfigUtils.java @@ -3,6 +3,8 @@ import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.widget.BravhLoadMoreView; /** @@ -10,6 +12,7 @@ * @date 2019/5/20 * GitHub: https://github.com/goweii */ +@Deprecated public class RvConfigUtils { public static class RvAnim { @@ -27,22 +30,22 @@ public static String getName(int anim) { default: break; case RvAnim.NONE: - name = "无"; + name = ResUtils.getString(R.string.rv_anim_none); break; case RvAnim.ALPHAIN: - name = "渐显"; + name = ResUtils.getString(R.string.rv_anim_alpha_in); break; case RvAnim.SCALEIN: - name = "缩放"; + name = ResUtils.getString(R.string.rv_anim_zoom); break; case RvAnim.SLIDEIN_BOTTOM: - name = "底部滑入"; + name = ResUtils.getString(R.string.rv_anim_slide_in_bottom); break; case RvAnim.SLIDEIN_LEFT: - name = "左侧滑入"; + name = ResUtils.getString(R.string.rv_anim_slide_in_left); break; case RvAnim.SLIDEIN_RIGHT: - name = "右侧滑入"; + name = ResUtils.getString(R.string.rv_anim_slide_in_right); break; } return name; diff --git a/app/src/main/java/per/goweii/wanandroid/utils/biometric/BiometricHelper.kt b/app/src/main/java/per/goweii/wanandroid/utils/biometric/BiometricHelper.kt index d7993291..d5e234a1 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/biometric/BiometricHelper.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/biometric/BiometricHelper.kt @@ -5,6 +5,7 @@ import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.fragment.app.FragmentActivity +import per.goweii.wanandroid.R import javax.crypto.Cipher class BiometricHelper( @@ -26,8 +27,8 @@ class BiometricHelper( @RequiresApi(Build.VERSION_CODES.M) fun authForEncode( - title: String = "开启生物认证登录", - cancelBtn: String = "取消" + title: String = activity.getString(R.string.turn_on_biometric_authentication_to_sign_in), + cancelBtn: String = activity.getString(R.string.cancel) ) { val promptInfo = BiometricPrompt.PromptInfo.Builder().apply { setTitle(title) @@ -43,8 +44,8 @@ class BiometricHelper( @RequiresApi(Build.VERSION_CODES.M) fun authForDecode( iv: ByteArray, - title: String = "使用生物认证登录", - cancelBtn: String = "取消" + title: String = activity.getString(R.string.sign_in_with_biometric_authentication), + cancelBtn: String = activity.getString(R.string.cancel) ) { val promptInfo = BiometricPrompt.PromptInfo.Builder().apply { setTitle(title) diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/AboutMeWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/AboutMeWanPwd.java index 90fb34b4..19c18702 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/AboutMeWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/AboutMeWanPwd.java @@ -2,6 +2,8 @@ import androidx.annotation.Nullable; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.router.RouterMap; /** @@ -23,11 +25,11 @@ public void run() { @Override public String getShowText() { - return "请开发小哥哥喝杯咖啡吧!\n一个完全免费的APP!\n一个这么好用还完全免费的APP!\n一个这么好看又好用还完全免费的APP!\n不请我喝杯咖啡提提神?\n我都快没精力继续维护了!"; + return ResUtils.getString(R.string.let_s_have_a_cup_of_coffee); } @Override public String getBtnText() { - return "去请客"; + return ResUtils.getString(R.string.go_for_a_treat); } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CDKeyWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CDKeyWanPwd.java index c6b93165..23091485 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CDKeyWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CDKeyWanPwd.java @@ -3,6 +3,8 @@ import androidx.annotation.Nullable; import per.goweii.basic.ui.toast.ToastMaker; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.UserUtils; import per.goweii.wanandroid.utils.cdkey.CDKeyUtils; @@ -20,15 +22,15 @@ public CDKeyWanPwd(String content) { @Override public void run() { if (!UserUtils.getInstance().isLogin()) { - ToastMaker.showShort("请先登录"); + ToastMaker.showShort(ResUtils.getString(R.string.please_sign_in_first)); return; } int id = UserUtils.getInstance().getWanId(); if (CDKeyUtils.getInstance().check(String.valueOf(id), content)) { CDKeyUtils.getInstance().set(content); - ToastMaker.showShort("激活成功,重启APP后生效"); + ToastMaker.showShort(ResUtils.getString(R.string.the_activation_was_successful)); } else { - ToastMaker.showShort("激活码无效"); + ToastMaker.showShort(ResUtils.getString(R.string.the_activation_code_is_invalid)); } } }; @@ -42,11 +44,11 @@ public Runnable getRunnable() { @Override public String getShowText() { - return "你发现了一个激活码!\n激活码仅与当前登录账户绑定,更换设备或账户后需重新激活,成功激活后将会去除所有广告,是否立即激活?"; + return ResUtils.getString(R.string.you_ve_found_an_activation_code); } @Override public String getBtnText() { - return "激活"; + return ResUtils.getString(R.string.activate); } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CreateCDKeyWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CreateCDKeyWanPwd.java index 7827ba1c..ce3b5a4d 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CreateCDKeyWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/CreateCDKeyWanPwd.java @@ -6,7 +6,9 @@ import per.goweii.basic.ui.toast.ToastMaker; import per.goweii.basic.utils.CopyUtils; +import per.goweii.basic.utils.ResUtils; import per.goweii.wanandroid.BuildConfig; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.UserUtils; import per.goweii.wanandroid.utils.cdkey.CDKeyUtils; @@ -25,21 +27,21 @@ public CreateCDKeyWanPwd(String content) { @Override public void run() { if (!UserUtils.getInstance().isLogin()) { - ToastMaker.showShort("请登录后使用该功能"); + ToastMaker.showShort(ResUtils.getString(R.string.please_sign_in_to_use_this_feature)); return; } int id = UserUtils.getInstance().getWanId(); if (!TextUtils.equals(String.valueOf(id), BuildConfig.DEVELOPER_ID)) { - ToastMaker.showShort("该功能仅限开发者账号使用"); + ToastMaker.showShort(ResUtils.getString(R.string.this_feature_is_only_available_to_developer_accounts)); return; } String cdkey = CDKeyUtils.getInstance().create(content); StringBuilder s = new StringBuilder(); - s.append("【玩口令】这是一个激活码口令,仅限特定账号使用,户制泽条消息"); + s.append(ResUtils.getString(R.string.this_is_an_activation_code_passcode)); s.append(String.format(BuildConfig.WANPWD_FORMAT, BuildConfig.WANPWD_TYPE_CDKEY, cdkey)); - s.append("打開最美玩安卓客户端激活"); + s.append(ResUtils.getString(R.string.open_the_most_beautiful_android_client_to_activate)); CopyUtils.copyText(s.toString()); - ToastMaker.showShort("口令已复制"); + ToastMaker.showShort(ResUtils.getString(R.string.copied)); } }; } @@ -52,11 +54,11 @@ public Runnable getRunnable() { @Override public String getShowText() { - return "###激活码生成###\n\n!!!警告!!!\n\n该功能仅限开发者使用"; + return ResUtils.getString(R.string.activation_code_generation_warning); } @Override public String getBtnText() { - return "复制"; + return ResUtils.getString(R.string.copy); } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/FestivalWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/FestivalWanPwd.java deleted file mode 100644 index b3ed579d..00000000 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/FestivalWanPwd.java +++ /dev/null @@ -1,131 +0,0 @@ -package per.goweii.wanandroid.utils.wanpwd; - -import androidx.annotation.Nullable; - -import per.goweii.wanandroid.utils.router.Router; - -/** - * @author CuiZhen - * @date 2019/12/28 - * GitHub: https://github.com/goweii - */ -public class FestivalWanPwd implements IWanPwd { - - private final String content; - private String mShowText; - private String mBtnText; - private Runnable mRunnable; - - public FestivalWanPwd(String content) { - this.content = content; - parse(); - } - - @Nullable - @Override - public Runnable getRunnable() { - return mRunnable; - } - - @Override - public String getShowText() { - return mShowText; - } - - @Override - public String getBtnText() { - return mBtnText; - } - - private void parse() { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < content.length(); i++) { - char c = content.charAt(i); - if (c >= '0' && c <= '9') { - stringBuilder.append(c); - } - } - if (stringBuilder.length() != 8) { - return; - } - try { - String s = stringBuilder.toString(); - int y = Integer.parseInt(s.substring(0, 4)); - int m = Integer.parseInt(s.substring(4, 6)); - int d = Integer.parseInt(s.substring(6, 8)); - StringBuilder sbShowText = new StringBuilder("8大传统节日你还记得哪些?\n"); - if (m == 12 && d == 30) { - sbShowText.append("【除夕·农历十二月三十】\n\n"); - sbShowText.append("乾坤空落落,岁月去堂堂;\n"); - sbShowText.append("末路惊风雨,穷边饱雪霜。\n"); - sbShowText.append("命随年欲尽,身与世俱忘;\n"); - sbShowText.append("无复屠苏梦,挑灯夜未央。\n"); - } else if (m == 1 && d == 1) { - sbShowText.append("【春节·农历正月初一】\n\n"); - sbShowText.append("爆竹声中一岁除,\n"); - sbShowText.append("春风送暖入屠苏。\n"); - sbShowText.append("千门万户曈曈日,\n"); - sbShowText.append("总把新桃换旧符。\n"); - } else if (m == 1 && d == 15) { - sbShowText.append("【元宵节·农历正月十五】\n\n"); - sbShowText.append("去年元夜时,花市灯如昼。\n"); - sbShowText.append("月到柳梢头,人约黄昏后。\n"); - sbShowText.append("今年元夜时,月与灯依旧。\n"); - sbShowText.append("不见去年人,泪湿春衫袖。\n"); - } else if (m == 3 && d == 3) { - sbShowText.append("【上巳节·农历三月初三】\n\n"); - sbShowText.append("巳日帝城春,倾都祓禊晨。\n"); - sbShowText.append("停车须傍水,奏乐要惊尘。\n"); - sbShowText.append("弱柳障行骑,浮桥拥看人。\n"); - sbShowText.append("犹言日尚早,更向九龙津。\n"); - } else if (m == 5 && d == 5) { - sbShowText.append("【端午节·农历五月初五】\n\n"); - sbShowText.append("节分端午自谁言,\n"); - sbShowText.append("万古传闻为屈原;\n"); - sbShowText.append("堪笑楚江空渺渺,\n"); - sbShowText.append("不能洗得直臣冤。\n"); - } else if (m == 7 && d == 7) { - sbShowText.append("【七夕节·农历七月初七】\n\n"); - sbShowText.append("络角星河菡萏天,\n"); - sbShowText.append("一家欢笑设红筵。\n"); - sbShowText.append("应倾谢女珠玑箧,\n"); - sbShowText.append("尽写檀郎锦绣篇。\n"); - sbShowText.append("香帐簇成排窈窕,\n"); - sbShowText.append("金针穿罢拜婵娟。\n"); - sbShowText.append("铜壶漏报天将晓,\n"); - sbShowText.append("惆怅佳期又一年。\n"); - } else if (m == 8 && d == 15) { - sbShowText.append("【中秋节·农历八月十五】\n\n"); - sbShowText.append("暮云收尽溢清寒,\n"); - sbShowText.append("银汉无声转玉盘。\n"); - sbShowText.append("此生此夜不长好,\n"); - sbShowText.append("明月明年何处看。\n"); - } else if (m == 9 && d == 9) { - sbShowText.append("【重阳节·农历九月初九】\n\n"); - sbShowText.append("独在异乡为异客,\n"); - sbShowText.append("每逢佳节倍思亲。\n"); - sbShowText.append("遥知兄弟登高处,\n"); - sbShowText.append("遍插茱萸少一人。\n"); - } else { - mShowText = "你发现了一个节日口令!\n但是我不知道这是什么节日!\n" - + "【农历" + m + "月" + d + "日】"; - mBtnText = "我去查查"; - mRunnable = new Runnable() { - @Override - public void run() { - Router.routeTo("https://www.baidu.com/s?wd=" + "农历" + m + "月" + d + "日"); - } - }; - } - if (mShowText == null && mBtnText == null) { - mShowText = sbShowText - .append("\n祝你快乐每一天!") - .toString(); - mBtnText = "我知道了"; - } - } catch (Exception ignore) { - mShowText = "你发现了一个节日口令,但是好像没有这个节日!"; - mBtnText = "关闭"; - } - } -} diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/QQWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/QQWanPwd.java index 53d1bf26..bc39990a 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/QQWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/QQWanPwd.java @@ -4,7 +4,9 @@ import per.goweii.basic.utils.AppInfoUtils; import per.goweii.basic.utils.AppOpenUtils; +import per.goweii.basic.utils.ResUtils; import per.goweii.basic.utils.Utils; +import per.goweii.wanandroid.R; /** * @author CuiZhen @@ -34,12 +36,12 @@ public void run() { @Override public String getShowText() { - return "你发现了一个QQ号码!\n" + getQQ() + "\n是否立即启动QQ加个好友?"; + return String.format(ResUtils.getString(R.string.you_have_found_a_qq_number), getQQ()); } @Override public String getBtnText() { - return "加好友"; + return ResUtils.getString(R.string.add_friends); } private String getQQ() { diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UnknownWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UnknownWanPwd.java index 90b31a30..e2105d26 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UnknownWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UnknownWanPwd.java @@ -2,6 +2,8 @@ import androidx.annotation.Nullable; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.router.RouterMap; /** @@ -23,11 +25,11 @@ public void run() { @Override public String getShowText() { - return "你发现了一个神秘口令!\n可惜当前版本不支持,快去设置中更新版本再试试吧!"; + return ResUtils.getString(R.string.you_ve_discovered_a_mysterious_password); } @Override public String getBtnText() { - return "去更新"; + return ResUtils.getString(R.string.go_to_update); } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UserPageWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UserPageWanPwd.java index f721acf0..b0163fd6 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UserPageWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/UserPageWanPwd.java @@ -2,6 +2,8 @@ import androidx.annotation.Nullable; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.router.Param; import per.goweii.wanandroid.utils.router.RouterMap; @@ -51,8 +53,8 @@ private void parse() { userId = Integer.parseInt(stringBuilder.toString()); } catch (Exception ignore) { } - mShowText = "你发现了一个神秘用户!\n要不要去他主页看一下?"; - mBtnText = "去主页"; + mShowText = ResUtils.getString(R.string.you_ve_discovered_a_mystery_user); + mBtnText = ResUtils.getString(R.string.go_to_the_homepage); int finalUserId = userId; mRunnable = new Runnable() { @Override diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WanPwdParser.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WanPwdParser.java index 803c739f..df3c7a7a 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WanPwdParser.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WanPwdParser.java @@ -38,9 +38,6 @@ private WanPwdParser(Pwd pwd) { case QQ: mWanPwd = new QQWanPwd(mPwd.content); break; - case FESTIVAL: - mWanPwd = new FestivalWanPwd(mPwd.content); - break; case USERPAGE: mWanPwd = new UserPageWanPwd(mPwd.content); break; @@ -139,7 +136,6 @@ public int hashCode() { public enum Type { UNKNOWN(""), QQ(BuildConfig.WANPWD_TYPE_QQ), - FESTIVAL(BuildConfig.WANPWD_TYPE_FESTIVAL), USERPAGE(BuildConfig.WANPWD_TYPE_USERPAGE), CDKEY(BuildConfig.WANPWD_TYPE_CDKEY), WEB(BuildConfig.WANPWD_TYPE_WEB), diff --git a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WebWanPwd.java b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WebWanPwd.java index f34ed5f6..a8fd92a8 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WebWanPwd.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/wanpwd/WebWanPwd.java @@ -4,6 +4,8 @@ import java.net.URLDecoder; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.utils.router.Router; /** @@ -40,8 +42,8 @@ public String getBtnText() { } private void parse() { - mShowText = "你发现了一个网页链接!\n要不要去打开看一下?"; - mBtnText = "打开"; + mShowText = ResUtils.getString(R.string.you_ve_found_a_link_to_a_web_page); + mBtnText = ResUtils.getString(R.string.open); final String url = URLDecoder.decode(content); mRunnable = new Runnable() { @Override diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/HostInterceptUtils.java b/app/src/main/java/per/goweii/wanandroid/utils/web/HostInterceptUtils.java index 1f84f3df..780c94f5 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/HostInterceptUtils.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/HostInterceptUtils.java @@ -4,6 +4,8 @@ import java.util.List; +import per.goweii.basic.utils.ResUtils; +import per.goweii.wanandroid.R; import per.goweii.wanandroid.module.mine.model.HostEntity; import per.goweii.wanandroid.utils.SettingUtils; @@ -24,13 +26,13 @@ public static String getName(int type) { default: break; case TYPE_NOTHING: - name = "不拦截"; + name = ResUtils.getString(R.string.do_not_intercept); break; case TYPE_ONLY_WHITE: - name = "仅白名单"; + name = ResUtils.getString(R.string.whitelist_only); break; case TYPE_INTERCEPT_BLACK: - name = "拦截黑名单"; + name = ResUtils.getString(R.string.block_blacklists); break; } return name; diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java index 33f458bc..7793fe7f 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java @@ -702,8 +702,8 @@ private boolean shouldOverrideUrlLoading(WebView view, Uri uri) { String originalUrl = view.getOriginalUrl(); WebView.HitTestResult hit = view.getHitTestResult(); if (hit.getType() == WebView.HitTestResult.UNKNOWN_TYPE || TextUtils.isEmpty(hit.getExtra())) { - LogUtils.i(TAG, "重定向:url=" + url); - LogUtils.i(TAG, "重定向:originalUrl=" + originalUrl); + LogUtils.i(TAG, "Redirect:url=" + url); + LogUtils.i(TAG, "Redirect:originalUrl=" + originalUrl); if (!allowRedirect) { if (!TextUtils.isEmpty(originalUrl) && (originalUrl.startsWith("http://") || originalUrl.startsWith("https://"))) { return true; diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt index 590b3695..bee99466 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt @@ -77,7 +77,7 @@ object WebScrollableUtils { l.lock() try { directions = Integer.parseInt(s.trim()) - LogUtils.d("WebScrollableUtils", "可滚动方向: $directions") + LogUtils.d("WebScrollableUtils", "Scrollable direction: $directions") c.signalAll() } catch (e: NumberFormatException) { LogUtils.e("WebScrollableUtils", "Failed to parse directions: $s") diff --git a/app/src/main/java/per/goweii/wanandroid/widget/AccountInputView.java b/app/src/main/java/per/goweii/wanandroid/widget/AccountInputView.java index c06ad303..52b78b51 100644 --- a/app/src/main/java/per/goweii/wanandroid/widget/AccountInputView.java +++ b/app/src/main/java/per/goweii/wanandroid/widget/AccountInputView.java @@ -35,7 +35,7 @@ public AccountInputView(Context context, AttributeSet attrs, int defStyleAttr) { @Override protected void initViews(AttributeSet attrs) { super.initViews(attrs); - getEditText().setHint("请输入用户名"); + getEditText().setHint(R.string.please_enter_your_username); changeFocusMode(false); } diff --git a/app/src/main/java/per/goweii/wanandroid/widget/EmailInputView.java b/app/src/main/java/per/goweii/wanandroid/widget/EmailInputView.java index 7d3c2030..6305dc90 100644 --- a/app/src/main/java/per/goweii/wanandroid/widget/EmailInputView.java +++ b/app/src/main/java/per/goweii/wanandroid/widget/EmailInputView.java @@ -35,7 +35,7 @@ public EmailInputView(Context context, AttributeSet attrs, int defStyleAttr) { @Override protected void initViews(AttributeSet attrs) { super.initViews(attrs); - getEditText().setHint("请输入邮箱"); + getEditText().setHint(R.string.please_enter_your_email_address); changeFocusMode(false); } diff --git a/app/src/main/java/per/goweii/wanandroid/widget/PasswordInputView.java b/app/src/main/java/per/goweii/wanandroid/widget/PasswordInputView.java index ed35dd65..33b97da6 100644 --- a/app/src/main/java/per/goweii/wanandroid/widget/PasswordInputView.java +++ b/app/src/main/java/per/goweii/wanandroid/widget/PasswordInputView.java @@ -46,7 +46,7 @@ public void setOnPwdFocusChangedListener(OnPwdFocusChangedListener onPwdFocusCha @Override protected void initViews(AttributeSet attrs) { super.initViews(attrs); - getEditText().setHint("请输入密码"); + getEditText().setHint(R.string.please_enter_your_password); changeFocusMode(false); changePwdHideMode(true); } diff --git a/app/src/main/java/per/goweii/wanandroid/widget/refresh/ShiciRefreshHeader.java b/app/src/main/java/per/goweii/wanandroid/widget/refresh/ShiciRefreshHeader.java index c2cecc2c..3b9f1064 100644 --- a/app/src/main/java/per/goweii/wanandroid/widget/refresh/ShiciRefreshHeader.java +++ b/app/src/main/java/per/goweii/wanandroid/widget/refresh/ShiciRefreshHeader.java @@ -24,11 +24,6 @@ import per.goweii.wanandroid.R; public class ShiciRefreshHeader extends SimpleComponent implements RefreshHeader { - public static String REFRESH_HEADER_PULLING = "下拉刷新"; - public static String REFRESH_HEADER_REFRESHING = "正在刷新"; - public static String REFRESH_HEADER_RELEASE = "释放刷新"; - public static String REFRESH_HEADER_FINISH = "刷新完成"; - public static String REFRESH_HEADER_FAILED = "刷新失败"; private final ImageView imageView; private final TextView textView; private int color; @@ -46,31 +41,31 @@ public class ShiciRefreshHeader extends SimpleComponent implements RefreshHeader private String textPulling() { String shici = ShiciRefreshHolder.instance().get(); if (!TextUtils.isEmpty(shici)) return shici; - return REFRESH_HEADER_PULLING; + return textView.getContext().getString(R.string.pull_down_to_refresh); } private String textRefreshing() { String shici = ShiciRefreshHolder.instance().get(); if (!TextUtils.isEmpty(shici)) return shici; - return REFRESH_HEADER_REFRESHING; + return textView.getContext().getString(R.string.refreshing); } private String textRelease() { String shici = ShiciRefreshHolder.instance().get(); if (!TextUtils.isEmpty(shici)) return shici; - return REFRESH_HEADER_RELEASE; + return textView.getContext().getString(R.string.release_to_refresh); } private String textFinish() { String shici = ShiciRefreshHolder.instance().get(); if (!TextUtils.isEmpty(shici)) return shici; - return REFRESH_HEADER_FINISH; + return textView.getContext().getString(R.string.refresh_completed); } private String textFailed() { String shici = ShiciRefreshHolder.instance().get(); if (!TextUtils.isEmpty(shici)) return shici; - return REFRESH_HEADER_FAILED; + return textView.getContext().getString(R.string.refresh_failed); } public ShiciRefreshHeader(Context context) { diff --git a/app/src/main/res/layout/action_bar_search.xml b/app/src/main/res/layout/action_bar_search.xml index b48b321d..4bbce1a7 100644 --- a/app/src/main/res/layout/action_bar_search.xml +++ b/app/src/main/res/layout/action_bar_search.xml @@ -34,7 +34,7 @@ android:ellipsize="end" android:singleLine="true" android:maxLines="1" - android:hint="用空格隔开多个关键词" + android:hint="@string/use_spaces_to_separate_multiple_keywords" android:imeOptions="actionSearch" android:lines="1" android:textColor="?colorOnMainOrSurface" diff --git a/app/src/main/res/layout/action_bar_web.xml b/app/src/main/res/layout/action_bar_web.xml index f6e62123..2a552083 100644 --- a/app/src/main/res/layout/action_bar_web.xml +++ b/app/src/main/res/layout/action_bar_web.xml @@ -28,7 +28,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - tools:hint="请输入网址" + tools:hint="@string/please_enter_the_url" android:lines="1" android:imeOptions="actionGo" android:singleLine="true" diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index a8ffa6c3..c3fd899b 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -10,7 +10,7 @@ android:id="@+id/abc" style="@style/ActionBar.Common.Back" app:abc_rightIconRes="@drawable/ic_share" - app:abc_titleText="关于我们" /> + app:abc_titleText="@string/about_us" /> @@ -110,7 +110,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="官方网站" + android:text="@string/official_website" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -143,7 +143,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="网站内容" + android:text="@string/website_content" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -176,7 +176,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="项目仓库" + android:text="@string/project_repository" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -209,7 +209,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="申请内测" + android:text="@string/apply_for_a_closed_beta" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -229,7 +229,7 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="16dp" - android:text="本APP由Goweii独立开发" + android:text="@string/this_app_is_independently_developed_by_goweii" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/activity_about_me.xml b/app/src/main/res/layout/activity_about_me.xml index 7d18b915..e39f1214 100644 --- a/app/src/main/res/layout/activity_about_me.xml +++ b/app/src/main/res/layout/activity_about_me.xml @@ -34,7 +34,7 @@ android:id="@+id/abc" style="@style/ActionBar.Common.Back" android:background="?colorTransparent" - app:abc_rightText="玩口令" - app:abc_titleText="关于作者" /> + app:abc_rightText="@string/wan_watchword" + app:abc_titleText="@string/about_the_author" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_article_float_btn.xml b/app/src/main/res/layout/activity_article_float_btn.xml index 4cfacd7a..478cd730 100644 --- a/app/src/main/res/layout/activity_article_float_btn.xml +++ b/app/src/main/res/layout/activity_article_float_btn.xml @@ -33,7 +33,7 @@ android:paddingTop="@dimen/margin_thin" android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin" - android:text="分享" + android:text="@string/share" android:textColor="?colorTextSurfaceAlpha" android:textSize="@dimen/text_notes" android:visibility="invisible" @@ -92,7 +92,7 @@ android:paddingTop="@dimen/margin_thin" android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin" - android:text="打开" + android:text="@string/open" android:textColor="?colorTextSurfaceAlpha" android:textSize="@dimen/text_notes" android:visibility="invisible" @@ -152,7 +152,7 @@ android:paddingTop="@dimen/margin_thin" android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin" - android:text="书签" + android:text="@string/bookmark" android:textColor="?colorTextSurfaceAlpha" android:textSize="@dimen/text_notes" android:visibility="invisible" @@ -211,7 +211,7 @@ android:paddingTop="@dimen/margin_thin" android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin" - android:text="收藏" + android:text="@string/collect" android:textColor="?colorTextSurfaceAlpha" android:textSize="@dimen/text_notes" android:visibility="invisible" diff --git a/app/src/main/res/layout/activity_article_list.xml b/app/src/main/res/layout/activity_article_list.xml index bb42b7f4..d697e84c 100644 --- a/app/src/main/res/layout/activity_article_list.xml +++ b/app/src/main/res/layout/activity_article_list.xml @@ -9,7 +9,7 @@ + app:abc_titleText="@string/list_of_articles" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/full_names" /> + tools:text="@tools:sample/lorem/random" /> @@ -128,7 +128,7 @@ android:lines="1" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_notes" - tools:text="知识共享 署名-相同方式共享 3.0协议" /> + tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/activity_coin.xml b/app/src/main/res/layout/activity_coin.xml index a6f3f657..fcf5178b 100644 --- a/app/src/main/res/layout/activity_coin.xml +++ b/app/src/main/res/layout/activity_coin.xml @@ -24,7 +24,7 @@ android:id="@+id/abc" style="@style/ActionBar.Super.Back" android:background="?colorTransparent" - app:absuper_titleText="我的积分" + app:absuper_titleText="@string/my_points" app:absuper_right1Icon="@drawable/ic_rule" app:absuper_right2Icon="@drawable/ic_rank" /> diff --git a/app/src/main/res/layout/activity_coin_rank.xml b/app/src/main/res/layout/activity_coin_rank.xml index 3602a6cc..3f56de85 100644 --- a/app/src/main/res/layout/activity_coin_rank.xml +++ b/app/src/main/res/layout/activity_coin_rank.xml @@ -10,7 +10,7 @@ + app:abc_titleText="@string/leaderboard" /> @@ -36,7 +36,7 @@ android:paddingTop="5dp" android:paddingBottom="5dp" android:layout_marginBottom="10dp" - android:text="复制日志" + android:text="@string/copy_the_logs" android:textColor="?colorTextMain" android:textSize="15sp" android:typeface="monospace" /> @@ -76,7 +76,7 @@ android:layout_weight="1" android:background="@drawable/bg_crash_exit" android:gravity="center" - android:text="关闭" + android:text="@string/close" android:textColor="?colorTextInvert" /> diff --git a/app/src/main/res/layout/activity_knowledge_article.xml b/app/src/main/res/layout/activity_knowledge_article.xml index a66611cd..e70c06e6 100644 --- a/app/src/main/res/layout/activity_knowledge_article.xml +++ b/app/src/main/res/layout/activity_knowledge_article.xml @@ -9,7 +9,7 @@ + app:abc_titleText="@string/body_of_knowledge" /> + app:abc_titleText="@string/my_sharing" /> + app:abc_titleText="@string/open_source_projects" /> + app:abc_titleText="@string/my_bookmarks" + app:abc_rightText="@string/clear" /> + app:abc_titleText="@string/reading_history" + app:abc_rightText="@string/clear" /> + tools:text="@string/didn_t_get_permission_to_get_the_camera" /> + tools:text="@string/click_try_again" /> + tools:text="@string/return_to_scan_the_code" /> diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index a6b0cda6..387b501a 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -9,7 +9,7 @@ + app:abc_titleText="@string/settings" /> @@ -57,7 +57,7 @@ android:text="" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" - tools:text="跟随系统" /> + tools:text="@string/follow_the_system" /> @@ -96,7 +96,7 @@ android:layout_marginTop="5dp" android:layout_marginRight="80dp" android:layout_toLeftOf="@+id/sc_show_read_later_notification" - android:text="打开应用时以通知方式提醒最新添加书签" + android:text="@string/bookmark_reminders_desc" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> @@ -123,7 +123,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" - android:text="显示轮播" + android:text="@string/show_carousel" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -136,7 +136,7 @@ android:layout_marginTop="5dp" android:layout_marginRight="80dp" android:layout_toLeftOf="@+id/sc_show_banner" - android:text="开启后首页显示轮播图" + android:text="@string/show_carousel_desc" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> @@ -163,7 +163,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" - android:text="显示置顶" + android:text="@string/show_pinned" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -176,7 +176,7 @@ android:layout_marginTop="5dp" android:layout_marginRight="80dp" android:layout_toLeftOf="@+id/sc_show_top" - android:text="开启后首页显示置顶文章" + android:text="@string/show_pinned_desc" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> @@ -205,7 +205,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" - android:text="网页拦截" + android:text="@string/web_blocking" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -217,7 +217,7 @@ android:layout_alignParentLeft="true" android:layout_marginTop="5dp" android:layout_marginRight="80dp" - android:text="长按可自定义拦截列表" + android:text="@string/long_press_to_customize_the_block_list" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> @@ -232,7 +232,7 @@ android:text="" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" - tools:text="不拦截" /> + tools:text="@string/do_not_intercept" /> @@ -304,7 +304,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="关于我们" + android:text="@string/about_us" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -345,7 +345,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="隐私政策" + android:text="@string/privacy_policy" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -375,7 +375,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="退出登录" + android:text="@string/sign_out" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/activity_share_article.xml b/app/src/main/res/layout/activity_share_article.xml index 07a73128..6c8594e5 100644 --- a/app/src/main/res/layout/activity_share_article.xml +++ b/app/src/main/res/layout/activity_share_article.xml @@ -14,7 +14,7 @@ + app:abc_titleText="@string/share_the_article" /> @@ -36,7 +36,7 @@ android:layout_height="wrap_content" android:layout_alignTop="@+id/tv_title" android:layout_alignParentRight="true" - android:text="刷新标题" + android:text="@string/refresh_the_title" android:textColor="?colorTextMain" android:textSize="@dimen/text_notes" /> @@ -48,7 +48,7 @@ android:layout_marginTop="10dp" android:background="?colorTransparent" android:gravity="top" - android:hint="100字以内" + android:hint="@string/up_to_100_characters" android:maxLines="5" android:minLines="2" android:textColor="?colorTextSurface" @@ -61,7 +61,7 @@ android:layout_height="wrap_content" android:layout_below="@+id/et_title" android:layout_marginTop="16dp" - android:text="文章链接" + android:text="@string/link_to_article" android:textColor="?colorTextSecond" android:textSize="@dimen/text_notes" /> @@ -71,7 +71,7 @@ android:layout_height="wrap_content" android:layout_alignTop="@+id/tv_link" android:layout_alignParentRight="true" - android:text="打开链接" + android:text="@string/open_the_link" android:textColor="?colorTextMain" android:textSize="@dimen/text_notes" /> @@ -83,7 +83,7 @@ android:layout_marginTop="10dp" android:background="?colorTransparent" android:gravity="top" - android:hint="如:https://www.wanandroid.com/blog/show/2577" + android:hint="@string/article_link_input_hint" android:maxLines="5" android:minLines="2" android:textColor="?colorTextSurface" @@ -98,7 +98,7 @@ android:layout_marginTop="@dimen/margin_def" android:layout_marginLeft="@dimen/margin_big" android:layout_marginRight="@dimen/margin_big" - android:text="分享" /> + android:text="@string/share" /> @@ -109,7 +109,7 @@ android:layout_alignParentBottom="true" android:lineSpacingExtra="6sp" android:padding="16dp" - android:text="1. 只要是任何好文都可以分享哈,并不一定要是原创!投递的文章会进入广场 tab;\n2. CSDN,掘金,简书等官方博客站点会直接通过,不需要审核;\n3. 其他个人站点会进入审核阶段,不要投递任何无效链接,否则可能会对你的账号产生一定影响;\n4. 如果你发现错误,可以提交日志,让我们一起使网站变得更好。\n5. 由于本站为个人开发与维护,会尽力保证24小时内审核,当然有可能哪天太累,会延期,请保持佛系..." + android:text="@string/share_article_tips" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index 5f2c12d5..5d4ae1d7 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -18,7 +18,7 @@ android:id="@+id/abc" style="@style/ActionBar.Common.Back" android:background="?colorTransparent" - app:abc_titleText="个人资料" /> + app:abc_titleText="@string/personal_data" /> @@ -103,7 +103,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" - android:text="用户名" + android:text="@string/username" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/activity_user_page.xml b/app/src/main/res/layout/activity_user_page.xml index ba9322a3..9b63e4a9 100644 --- a/app/src/main/res/layout/activity_user_page.xml +++ b/app/src/main/res/layout/activity_user_page.xml @@ -127,7 +127,7 @@ @@ -154,7 +154,7 @@ @@ -209,6 +209,6 @@ android:id="@+id/abc" style="@style/ActionBar.Common.Back" android:background="?colorTransparent" - app:abc_rightText="玩口令" /> + app:abc_rightText="@string/wan_watchword" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_host.xml b/app/src/main/res/layout/dialog_add_host.xml index 2dd0156e..61826c5c 100644 --- a/app/src/main/res/layout/dialog_add_host.xml +++ b/app/src/main/res/layout/dialog_add_host.xml @@ -24,7 +24,7 @@ @@ -39,7 +39,7 @@ android:paddingBottom="@dimen/margin_common" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - android:hint="如:www.wanandroid.com" /> + android:hint="@string/host_input_hint" /> @@ -59,7 +59,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="取消" + android:text="@string/cancel" android:textColor="?colorTextSecond" android:textSize="@dimen/text_content" /> @@ -74,7 +74,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="确定" + android:text="@string/ok" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_article_share.xml b/app/src/main/res/layout/dialog_article_share.xml index f746a961..db2f3901 100644 --- a/app/src/main/res/layout/dialog_article_share.xml +++ b/app/src/main/res/layout/dialog_article_share.xml @@ -65,7 +65,7 @@ android:textColor="@color/color_black_a93" android:textSize="@dimen/text_content" android:textStyle="bold" - tools:text="文章标题文章标题文标题文章标题文章标题文章标题文章标题文章标题文章标题文标题文章标题文章标题文章标题文章标题" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" /> @@ -213,7 +213,7 @@ android:layout_marginStart="@dimen/margin_common" android:gravity="center" android:singleLine="true" - android:text="保存相册" + android:text="@string/save_to_album" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:ignore="UseCompatTextViewDrawableXml" /> @@ -245,7 +245,7 @@ android:layout_marginStart="@dimen/margin_common" android:gravity="center" android:singleLine="true" - android:text="立即分享" + android:text="@string/share_now" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:ignore="UseCompatTextViewDrawableXml" /> diff --git a/app/src/main/res/layout/dialog_card_share.xml b/app/src/main/res/layout/dialog_card_share.xml index c65d1b1f..db2a6d52 100644 --- a/app/src/main/res/layout/dialog_card_share.xml +++ b/app/src/main/res/layout/dialog_card_share.xml @@ -79,7 +79,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="保存相册" + android:text="@string/save_to_album" android:textColor="?colorTextOnShadow" android:textSize="@dimen/text_notes" /> @@ -110,7 +110,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="立即分享" + android:text="@string/share_now" android:textColor="?colorTextOnShadow" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/dialog_copied_link.xml b/app/src/main/res/layout/dialog_copied_link.xml index 1840f641..b536f3d4 100644 --- a/app/src/main/res/layout/dialog_copied_link.xml +++ b/app/src/main/res/layout/dialog_copied_link.xml @@ -35,7 +35,7 @@ android:layout_marginLeft="@dimen/margin_small" android:layout_marginTop="@dimen/margin_def" android:layout_toRightOf="@+id/dialog_copied_link_iv_close" - android:text="打开链接" + android:text="@string/open_the_link" android:textColor="?colorTextOnMain" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_edit_collect_link.xml b/app/src/main/res/layout/dialog_edit_collect_link.xml index bc7b382a..24be818e 100644 --- a/app/src/main/res/layout/dialog_edit_collect_link.xml +++ b/app/src/main/res/layout/dialog_edit_collect_link.xml @@ -25,7 +25,7 @@ @@ -47,7 +47,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:text="网站链接" + android:text="@string/links_to_the_site" android:textColor="?colorTextSecond" android:textSize="@dimen/text_auxiliary" /> @@ -83,7 +83,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="取消" + android:text="@string/cancel" android:textColor="?colorTextSecond" android:textSize="@dimen/text_content" /> @@ -98,7 +98,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="确定" + android:text="@string/ok" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_guide_btn.xml b/app/src/main/res/layout/dialog_guide_btn.xml index 815fb6f0..49d11acf 100644 --- a/app/src/main/res/layout/dialog_guide_btn.xml +++ b/app/src/main/res/layout/dialog_guide_btn.xml @@ -18,6 +18,6 @@ android:layout_centerHorizontal="true" android:paddingLeft="50dp" android:paddingRight="50dp" - android:text="知道了" /> + android:text="@string/i_know" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_guide_tip.xml b/app/src/main/res/layout/dialog_guide_tip.xml index a7710c1a..c53e125e 100644 --- a/app/src/main/res/layout/dialog_guide_tip.xml +++ b/app/src/main/res/layout/dialog_guide_tip.xml @@ -11,7 +11,7 @@ android:layout_height="wrap_content" android:background="@drawable/bg_solid_round_color_surface_radius_max" android:padding="@dimen/margin_common" - tools:text="长按返回按钮有惊喜哦~" + tools:text="@string/long_press_the_back_button_to_have_a_surprise" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_image_menu.xml b/app/src/main/res/layout/dialog_image_menu.xml index 1dc6a9e1..71a7d25a 100644 --- a/app/src/main/res/layout/dialog_image_menu.xml +++ b/app/src/main/res/layout/dialog_image_menu.xml @@ -14,7 +14,7 @@ android:layout_height="@dimen/button_height" android:background="@drawable/bg_press_color_surface" android:gravity="center" - android:text="保存" + android:text="@string/save" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -24,7 +24,7 @@ android:layout_height="@dimen/button_height" android:background="@drawable/bg_press_color_surface" android:gravity="center" - android:text="识别图中二维码" + android:text="@string/identify_the_qr_code_in_the_picture" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_image_preview.xml b/app/src/main/res/layout/dialog_image_preview.xml index c16723a2..f16f7517 100644 --- a/app/src/main/res/layout/dialog_image_preview.xml +++ b/app/src/main/res/layout/dialog_image_preview.xml @@ -20,7 +20,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" - android:text="加载中" + android:text="@string/loading" android:textColor="#66ffffff" android:textSize="@dimen/text_content" android:visibility="gone" diff --git a/app/src/main/res/layout/dialog_info_edit.xml b/app/src/main/res/layout/dialog_info_edit.xml index 622e35a0..a1455cc8 100644 --- a/app/src/main/res/layout/dialog_info_edit.xml +++ b/app/src/main/res/layout/dialog_info_edit.xml @@ -25,7 +25,7 @@ android:id="@+id/dialog_info_edit_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="请输入" + android:text="@string/please_enter" android:textColor="?colorTextSecond" android:textSize="@dimen/text_title" /> @@ -40,7 +40,7 @@ android:paddingBottom="@dimen/margin_common" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - android:hint="请输入" /> + android:hint="@string/please_enter" /> @@ -60,7 +60,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="取消" + android:text="@string/cancel" android:textColor="?colorTextSecond" android:textSize="@dimen/text_content" /> @@ -75,7 +75,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" - android:text="确定" + android:text="@string/ok" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/dialog_password.xml b/app/src/main/res/layout/dialog_password.xml index 02316739..9fc1c5e9 100644 --- a/app/src/main/res/layout/dialog_password.xml +++ b/app/src/main/res/layout/dialog_password.xml @@ -21,7 +21,7 @@ android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" - android:text="玩口令" + android:text="@string/wan_watchword" android:textColor="?colorTextMain" android:textSize="@dimen/text_title" /> @@ -31,7 +31,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/margin_def" android:gravity="center" - android:text="我都还没有想好用这个口令来干什么,你怎么发现的?" + android:text="@string/unknown_watchword_tips" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -39,7 +39,7 @@ android:id="@+id/dialog_password_tv_open" style="@style/ButtonMain" android:layout_marginTop="@dimen/margin_middle" - android:text="忽略" /> + android:text="@string/ignore" /> diff --git a/app/src/main/res/layout/dialog_privacy_policy.xml b/app/src/main/res/layout/dialog_privacy_policy.xml index 4519ec8e..a081320d 100644 --- a/app/src/main/res/layout/dialog_privacy_policy.xml +++ b/app/src/main/res/layout/dialog_privacy_policy.xml @@ -15,7 +15,7 @@ android:gravity="center" android:textColor="?colorTextSurface" android:textSize="@dimen/text_title" - android:text="隐私政策" /> + android:text="@string/privacy_policy" /> + android:text="@string/agree" /> + android:text="@string/quit_the_app" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_web_guide.xml b/app/src/main/res/layout/dialog_web_guide.xml index 5b842e74..e9789c06 100644 --- a/app/src/main/res/layout/dialog_web_guide.xml +++ b/app/src/main/res/layout/dialog_web_guide.xml @@ -49,7 +49,7 @@ android:layout_gravity="left" android:layout_below="@+id/dialog_web_guide_iv_2" android:layout_centerHorizontal="true" - android:text="双击任意位置收藏文章" + android:text="@string/double_click_anywhere_to_favorite_an_article" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_title" /> @@ -61,7 +61,7 @@ android:layout_below="@+id/dialog_web_guide_tv_double_click" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/margin_common" - android:text="长按网页图片查看大图" + android:text="@string/long_press_the_image_on_the_webpage_to_enlarge_it" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_title" /> @@ -76,6 +76,6 @@ android:layout_marginBottom="@dimen/margin_def" android:paddingLeft="50dp" android:paddingRight="50dp" - android:text="知道了" /> + android:text="@string/i_know" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_web_menu.xml b/app/src/main/res/layout/dialog_web_menu.xml index 672fbe4a..6ca5a5e0 100644 --- a/app/src/main/res/layout/dialog_web_menu.xml +++ b/app/src/main/res/layout/dialog_web_menu.xml @@ -18,7 +18,7 @@ android:textColor="?colorTextSecond" android:textSize="@dimen/text_notes" android:visibility="gone" - tools:text="网页由wanandroid.com提供" + tools:text="@string/this_webpage_is_provided_by" tools:visibility="visible" /> @@ -81,7 +81,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="分享到广场" + android:text="@string/share_to_square" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -113,7 +113,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="收藏" + android:text="@string/collect" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -144,7 +144,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="书签" + android:text="@string/bookmark" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -181,7 +181,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="刷新" + android:text="@string/refresh" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -213,7 +213,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="回到顶部" + android:text="@string/back_to_top" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -245,7 +245,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="网页拦截" + android:text="@string/web_blocking" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -276,7 +276,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="退出" + android:text="@string/exit" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/dialog_web_quick.xml b/app/src/main/res/layout/dialog_web_quick.xml index cc25ac8a..91eb4cba 100644 --- a/app/src/main/res/layout/dialog_web_quick.xml +++ b/app/src/main/res/layout/dialog_web_quick.xml @@ -12,7 +12,7 @@ android:layout_height="@dimen/button_height" android:background="@drawable/bg_press_color_surface" android:gravity="center" - android:text="复制链接" + android:text="@string/copy_the_link" android:textColor="?colorTextThird" android:textSize="@dimen/text_auxiliary" /> @@ -23,7 +23,7 @@ android:layout_height="@dimen/button_height" android:background="@drawable/bg_press_color_surface" android:gravity="center" - android:text="浏览器打开" + android:text="@string/open_it_in_a_browser" android:textColor="?colorTextThird" android:textSize="@dimen/text_auxiliary" /> @@ -34,7 +34,7 @@ android:layout_height="@dimen/button_height" android:background="@drawable/bg_press_color_surface" android:gravity="center" - android:text="网页玩口令" + android:text="@string/wan_watchword_website" android:textColor="?colorTextThird" android:textSize="@dimen/text_auxiliary" /> diff --git a/app/src/main/res/layout/dialog_web_share.xml b/app/src/main/res/layout/dialog_web_share.xml index 3aa165ab..e3128f83 100644 --- a/app/src/main/res/layout/dialog_web_share.xml +++ b/app/src/main/res/layout/dialog_web_share.xml @@ -14,7 +14,7 @@ android:layout_marginBottom="@dimen/round_radius" android:gravity="center" android:singleLine="true" - android:text="选择分享方式" + android:text="@string/choose_how_you_want_to_share" android:textColor="?colorTextSurface" android:textSize="@dimen/text_title" /> @@ -49,7 +49,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="长图" + android:text="@string/long_picture" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> @@ -78,7 +78,7 @@ android:layout_marginTop="8dp" android:gravity="center" android:singleLine="true" - android:text="二维码" + android:text="@string/qr_code" android:textColor="?colorTextSurface" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/fragment_book.xml b/app/src/main/res/layout/fragment_book.xml index ad682cd0..5accb8b9 100644 --- a/app/src/main/res/layout/fragment_book.xml +++ b/app/src/main/res/layout/fragment_book.xml @@ -10,7 +10,7 @@ android:id="@+id/abc" style="@style/ActionBar.Common" android:background="?colorTransparent" - app:abc_titleText="书籍教程" /> + app:abc_titleText="@string/book_tutorials" /> + app:abc_titleText="@string/my_bookmarks" /> + app:abc_titleText="@string/homepage" /> + android:text="@string/go_to_sign_up"/> diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 49583751..2e95eefd 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -80,7 +80,7 @@ @@ -107,7 +107,7 @@ @@ -155,7 +155,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="我的积分" + android:text="@string/my_points" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -205,7 +205,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="我的分享" + android:text="@string/my_sharing" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -244,7 +244,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="我的收藏" + android:text="@string/my_collections" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -283,7 +283,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="我的书签" + android:text="@string/my_bookmarks" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -322,7 +322,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="阅读历史" + android:text="@string/reading_history" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -361,7 +361,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="开源项目" + android:text="@string/open_source_projects" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -400,7 +400,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="关于作者" + android:text="@string/about_the_author" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> @@ -409,7 +409,7 @@ android:layout_height="wrap_content" android:layout_marginRight="5dp" android:singleLine="true" - android:text="请他喝杯咖啡~" + android:text="@string/buy_him_a_coffee" android:textColor="?colorTextAccent" android:textSize="@dimen/text_notes" /> @@ -448,7 +448,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="系统设置" + android:text="@string/settings" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/fragment_question.xml b/app/src/main/res/layout/fragment_question.xml index 4e1fbdf7..7963def2 100644 --- a/app/src/main/res/layout/fragment_question.xml +++ b/app/src/main/res/layout/fragment_question.xml @@ -9,7 +9,7 @@ + app:abc_titleText="@string/question_answering" /> @@ -77,7 +77,7 @@ android:layout_marginLeft="60dp" android:layout_marginTop="30dp" android:layout_marginRight="60dp" - android:text="注册" + android:text="@string/sign_up" app:sv_bindEditText1="@+id/piv_register_account" app:sv_bindEditText2="@+id/piv_register_password" app:sv_bindEditText3="@+id/piv_register_password_again" /> diff --git a/app/src/main/res/layout/fragment_search_history.xml b/app/src/main/res/layout/fragment_search_history.xml index dc39f8af..20196c03 100644 --- a/app/src/main/res/layout/fragment_search_history.xml +++ b/app/src/main/res/layout/fragment_search_history.xml @@ -11,7 +11,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" - android:text="热门搜索" + android:text="@string/popular_searches" android:textColor="?colorMain" android:textSize="@dimen/text_content" /> @@ -46,7 +46,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="16dp" - android:text="历史搜索" + android:text="@string/historical_searches" android:textColor="?colorMain" android:textSize="@dimen/text_content" /> @@ -56,7 +56,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical|right" android:layout_marginRight="16dp" - android:text="完成" + android:text="@string/complete" android:visibility="gone" tools:visibility="visible" android:textColor="?colorMain" @@ -68,7 +68,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical|right" android:layout_marginRight="16dp" - android:text="清除" + android:text="@string/clear" android:textColor="?colorThird" android:textSize="@dimen/text_notes" /> diff --git a/app/src/main/res/layout/fragment_user_article.xml b/app/src/main/res/layout/fragment_user_article.xml index cab87483..8e88f42a 100644 --- a/app/src/main/res/layout/fragment_user_article.xml +++ b/app/src/main/res/layout/fragment_user_article.xml @@ -11,7 +11,7 @@ android:id="@+id/abc" style="@style/ActionBar.Common" app:abc_rightIconRes="@drawable/ic_add" - app:abc_titleText="广场" /> + app:abc_titleText="@string/square" /> @@ -115,7 +115,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="简书" + android:text="@string/jianshu" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_content" /> @@ -195,7 +195,7 @@ android:layout_marginRight="10dp" android:layout_weight="1" android:singleLine="true" - android:text="QQ群" + android:text="@string/qq_group" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_content" /> @@ -221,7 +221,7 @@ android:layout_marginRight="30dp" android:layout_marginBottom="10dp" android:gravity="center" - android:text="呦~\nAPP做得不错呀\n请你喝杯咖啡" + android:text="@string/buy_you_a_coffee" android:textColor="?colorOnMainOrSurfaceAlpha" android:textSize="@dimen/text_auxiliary" /> @@ -232,7 +232,7 @@ android:layout_above="@+id/iv_to_reward" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" - android:text="上滑" + android:text="@string/swipe_up" android:textColor="?colorOnMainOrSurfaceAlpha" android:textSize="@dimen/text_auxiliary" /> diff --git a/app/src/main/res/layout/layout_about_me_sponsor.xml b/app/src/main/res/layout/layout_about_me_sponsor.xml index 10479b66..f00e0457 100644 --- a/app/src/main/res/layout/layout_about_me_sponsor.xml +++ b/app/src/main/res/layout/layout_about_me_sponsor.xml @@ -34,7 +34,7 @@ diff --git a/app/src/main/res/layout/layout_app_qrcode_share.xml b/app/src/main/res/layout/layout_app_qrcode_share.xml index 94885fa8..88526cd8 100644 --- a/app/src/main/res/layout/layout_app_qrcode_share.xml +++ b/app/src/main/res/layout/layout_app_qrcode_share.xml @@ -46,7 +46,7 @@ android:textColor="@color/color_black_a93" android:textSize="@dimen/text_headline" android:textStyle="bold" - tools:text="玩安卓" /> + tools:text="@string/app_label" /> + android:text="@string/scan_the_code_to_download_and_install" /> diff --git a/app/src/main/res/layout/layout_article_qrcode_share.xml b/app/src/main/res/layout/layout_article_qrcode_share.xml index 89d166b9..5ccc94d5 100644 --- a/app/src/main/res/layout/layout_article_qrcode_share.xml +++ b/app/src/main/res/layout/layout_article_qrcode_share.xml @@ -34,7 +34,7 @@ android:textColor="@color/color_black_a93" android:textSize="@dimen/text_content" android:textStyle="bold" - tools:text="文章标题文章标题文标题文章标题文章标题文章标题文章标题文章标题文章标题文标题文章标题文章标题文章标题文章标题" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" /> diff --git a/app/src/main/res/layout/layout_shici_refresh_header.xml b/app/src/main/res/layout/layout_shici_refresh_header.xml index f31b35f1..6a0db6b8 100644 --- a/app/src/main/res/layout/layout_shici_refresh_header.xml +++ b/app/src/main/res/layout/layout_shici_refresh_header.xml @@ -29,6 +29,6 @@ android:maxWidth="300dp" android:textColor="?colorTextSecond" android:textSize="@dimen/text_auxiliary" - tools:text="下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新" /> + tools:text="@tools:sample/lorem/random" /> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_state_empty_center.xml b/app/src/main/res/layout/layout_state_empty_center.xml index b070a76d..1298ce85 100644 --- a/app/src/main/res/layout/layout_state_empty_center.xml +++ b/app/src/main/res/layout/layout_state_empty_center.xml @@ -27,7 +27,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/text_auxiliary" - android:text="什么都木有~~" + android:text="@string/nothing" android:textColor="?colorTextThird" /> diff --git a/app/src/main/res/layout/layout_state_empty_top.xml b/app/src/main/res/layout/layout_state_empty_top.xml index a6546d3e..380bcb55 100644 --- a/app/src/main/res/layout/layout_state_empty_top.xml +++ b/app/src/main/res/layout/layout_state_empty_top.xml @@ -28,7 +28,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/text_auxiliary" - android:text="什么都木有~~" + android:text="@string/nothing" android:textColor="?colorTextThird" /> diff --git a/app/src/main/res/layout/layout_state_error_center.xml b/app/src/main/res/layout/layout_state_error_center.xml index 312237bd..a37da6d9 100644 --- a/app/src/main/res/layout/layout_state_error_center.xml +++ b/app/src/main/res/layout/layout_state_error_center.xml @@ -27,7 +27,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_auxiliary" android:gravity="center" - android:text="怎么又出错~~" + android:text="@string/how_did_it_go_wrong_again" android:textColor="?colorTextThird" /> diff --git a/app/src/main/res/layout/layout_state_error_top.xml b/app/src/main/res/layout/layout_state_error_top.xml index 3346c6e0..c85c056a 100644 --- a/app/src/main/res/layout/layout_state_error_top.xml +++ b/app/src/main/res/layout/layout_state_error_top.xml @@ -28,7 +28,7 @@ android:layout_height="wrap_content" android:textSize="@dimen/text_auxiliary" android:gravity="center" - android:text="怎么又出错~~" + android:text="@string/how_did_it_go_wrong_again" android:textColor="?colorTextThird" /> diff --git a/app/src/main/res/layout/rv_item_article.xml b/app/src/main/res/layout/rv_item_article.xml index 524b0b47..efcda1a4 100644 --- a/app/src/main/res/layout/rv_item_article.xml +++ b/app/src/main/res/layout/rv_item_article.xml @@ -29,7 +29,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dp" - android:text="新" + android:text="@string/tag_new" android:textColor="?colorTextMain" android:textSize="@dimen/text_notes" /> @@ -43,7 +43,7 @@ android:layout_toRightOf="@+id/ll_new" android:textColor="@color/selector_text_color_article_author" android:textSize="@dimen/text_notes" - tools:text="林帅并不帅" /> + tools:text="@tools:sample/full_names" /> + tools:text="TAG" /> + tools:text="2025-06-16" /> @@ -114,7 +114,7 @@ android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:singleLine="true" - tools:text="公众号文章列表强势上线公众号文章列表强势公众号文章列表强势上线公众号文章列表强势" /> + tools:text="@tools:sample/full_names" /> @@ -150,7 +150,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dp" - android:text="置顶" + android:text="@string/tag_top" android:textColor="?colorTextAccent" android:textSize="@dimen/text_notes" /> @@ -171,7 +171,7 @@ android:layout_height="wrap_content" android:textColor="@color/selector_text_color_article_chapter" android:textSize="@dimen/text_notes" - tools:text="动画效果·Lottie" /> + tools:text="Animation·Lottie" /> diff --git a/app/src/main/res/layout/rv_item_book_chapter.xml b/app/src/main/res/layout/rv_item_book_chapter.xml index c8aa243a..48ef6fe2 100644 --- a/app/src/main/res/layout/rv_item_book_chapter.xml +++ b/app/src/main/res/layout/rv_item_book_chapter.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - tools:text="关键字关键字关键字关键字关键字关键字关键字关键字关键字关键字" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@string/learned_n_percent" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@string/check_in_points_is" /> @@ -34,7 +34,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="浏览器打开" + android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -46,7 +46,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="编辑" + android:text="@string/edit" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -58,7 +58,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="删除" + android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -81,7 +81,7 @@ android:layout_marginRight="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - tools:text="关键字关键字关键字关键字关键字关键字关键字关键字关键字关键字" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" /> diff --git a/app/src/main/res/layout/rv_item_dialog_web_menu.xml b/app/src/main/res/layout/rv_item_dialog_web_menu.xml index dca2bdde..9455e5a2 100644 --- a/app/src/main/res/layout/rv_item_dialog_web_menu.xml +++ b/app/src/main/res/layout/rv_item_dialog_web_menu.xml @@ -27,6 +27,6 @@ android:singleLine="true" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" - tools:text="浏览器打开" /> + tools:text="@string/open_it_in_a_browser" /> \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_knowledge.xml b/app/src/main/res/layout/rv_item_knowledge.xml index 6236574b..b92277cd 100644 --- a/app/src/main/res/layout/rv_item_knowledge.xml +++ b/app/src/main/res/layout/rv_item_knowledge.xml @@ -16,7 +16,7 @@ android:layout_marginRight="16dp" android:textColor="?colorTextSecond" android:textSize="@dimen/text_content" - tools:text="公众号文章列表强势上线" /> + tools:text="@tools:sample/full_names" /> \ No newline at end of file + tools:text="@tools:sample/full_names" /> \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_message_readed.xml b/app/src/main/res/layout/rv_item_message_readed.xml index a0f1f761..c495c1dc 100644 --- a/app/src/main/res/layout/rv_item_message_readed.xml +++ b/app/src/main/res/layout/rv_item_message_readed.xml @@ -21,7 +21,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="删除" + android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/rv_item_message_unread.xml b/app/src/main/res/layout/rv_item_message_unread.xml index 39940c67..f9129204 100644 --- a/app/src/main/res/layout/rv_item_message_unread.xml +++ b/app/src/main/res/layout/rv_item_message_unread.xml @@ -28,7 +28,7 @@ android:paddingRight="3dp" android:textColor="?colorTextMain" android:textSize="@dimen/text_time" - tools:text="新回答" /> + tools:text="@string/tag_new" /> + tools:text="@tools:sample/full_names" /> + tools:text="2025" /> @@ -70,7 +70,7 @@ android:lineSpacingExtra="0dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - tools:text="回答了:每日一问 | 我们常说的dalvik虚拟机是基于寄存器的,而jvm是基于栈,到底指的是什么?" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/rv_item_mine_share_article.xml b/app/src/main/res/layout/rv_item_mine_share_article.xml index a26e01dc..b7bc0b0f 100644 --- a/app/src/main/res/layout/rv_item_mine_share_article.xml +++ b/app/src/main/res/layout/rv_item_mine_share_article.xml @@ -21,7 +21,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="删除" + android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> diff --git a/app/src/main/res/layout/rv_item_open.xml b/app/src/main/res/layout/rv_item_open.xml index d8f06da5..5de3603e 100644 --- a/app/src/main/res/layout/rv_item_open.xml +++ b/app/src/main/res/layout/rv_item_open.xml @@ -24,6 +24,6 @@ android:layout_below="@+id/tv_project" android:textColor="?colorTextSecond" android:textSize="@dimen/text_auxiliary" - tools:text="高拓展高自定义性ActionBar,完美替代Android系统默认,完美替代Android系统默认,完美替代Android系统默认" /> + tools:text="@tools:sample/lorem/random" /> \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_read_later.xml b/app/src/main/res/layout/rv_item_read_later.xml index aa84ee89..eb982872 100644 --- a/app/src/main/res/layout/rv_item_read_later.xml +++ b/app/src/main/res/layout/rv_item_read_later.xml @@ -21,7 +21,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="复制链接" + android:text="@string/copy_the_link" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -33,7 +33,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="浏览器打开" + android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -45,7 +45,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="删除" + android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -67,7 +67,7 @@ android:layout_marginRight="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - tools:text="关键字关键字关键字关键字关键字关键字关键字关键字关键字关键字" /> + tools:text="@tools:sample/lorem/random" /> @@ -33,7 +33,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="浏览器打开" + android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -45,7 +45,7 @@ android:gravity="center" android:paddingLeft="16dp" android:paddingRight="16dp" - android:text="删除" + android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -67,7 +67,7 @@ android:layout_marginRight="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" - tools:text="关键字关键字关键字关键字关键字关键字关键字关键字关键字关键字" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" /> \ No newline at end of file + tools:text="@tools:sample/full_names" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_main.xml b/app/src/main/res/layout/tab_item_main.xml index c6532e8a..27ce6523 100644 --- a/app/src/main/res/layout/tab_item_main.xml +++ b/app/src/main/res/layout/tab_item_main.xml @@ -35,7 +35,7 @@ android:includeFontPadding="false" android:textColor="?colorTextThird" android:textSize="10dp" - tools:text="我的" /> + tools:text="@string/mine" /> + + 玩安卓 + + 网络连接失败,请检查网络设置 + 访问出错,请稍后重试 + + 确定 + 取消 + 关闭 +Ï + + 发现新版本 + 发现内测版本 + 立即更新 + 暂不更新 + + + 下载更新中... + 立即安装 + + + 暂不授权 + 去授权 + 去设置 + 未知 + 日历 + 照相机 + 通讯录 + 定位 + 麦克风 + 手机 + 短信 + 传感器 + 存储空间 + 相关 + 我们需要获取%s权限以确保应用的正常运行,请点击去授权完成权限申请。 + 您已拒绝应用使用%s权限,这将影响功能的正常运行,请前往设置打开权限。 + + + 《隐私政策》 + 感谢您使用玩安卓!\n我们依据最新的监管要求更新了《隐私政策》特向您说明如下:\n1. 为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2. 基于您的明示授权我们会获取存储权限,用于保存文章分享图,您有权拒绝或取消授权;\n3. 我们会采取安全措施保护您的信息安全;\n4. 未经您同意,我们不会从第三方处获取、共享或向其提供您的信息。 + + %d B + %d \% + "下载失败,可前往Github仓库下载:我的-系统设置-关于我们-项目仓库" + + 网页由%s提供 + 回到首页 + 分享到广场 + 收藏 + 书签 + 刷新 + 回到顶部 + 网页拦截 + 退出 + 用空格隔开多个关键词 + 请输入网址 + 关于我们 + 检查更新 + 官方网站 + 网站内容 + 项目仓库 + 申请内测 + 本APP由Goweii独立开发 + 玩口令 + 关于作者 + 欢迎使用 + 我的积分 + 积分排行榜 + 出错了 + 复制日志 + 关闭 + 重启 + 我的分享 + 开源项目 + 我的书签 + 清空 + 没有获取到相机权限 + 点击重试 + 返回扫码 + 设置 + 主题模式 + 跟随系统 + 亮色模式 + 暗色模式 + 书签提醒 + 打开应用时以通知方式提醒最新添加书签 + 显示轮播 + 开启后首页显示轮播图 + 显示置顶 + 开启后首页显示置顶文章 + 个人资料 + 玩ID + 用户名 + 积分: + 排名: + 域名 + 如:www.wanandroid.com + 取消 + 确定 + 打开链接 + 我知道了 + 保存 + 识别图中二维码 + 请输入 + 我都还没有想好用这个口令来干什么,你怎么发现的? + 忽略 + 双击任意位置收藏文章 + 长按网页图片查看大图 + 复制链接 + 用浏览器打开 + 网页玩口令 + 选择分享方式 + 长图 + 二维码 + 书籍教程 + 首页 + 去注册 + 登录 + 等级: + 我的收藏 + 问答 + + 置顶 + 删除 + 我的 + 长按返回按钮有惊喜哦~ + 分享 + 打开 + 文章列表 + 知识体系 + 阅读历史 + 长按可自定义拦截列表 + 不拦截 + 清除缓存 + 隐私政策 + 退出登录 + 分享文章 + 文章标题 + 刷新标题 + 100字以内 + 文章链接 + 如:https://www.wanandroid.com/blog/show/2577 + 1. 只要是任何好文都可以分享哈,并不一定要是原创!投递的文章会进入广场 tab;\n2. CSDN,掘金,简书等官方博客站点会直接通过,不需要审核;\n3. 其他个人站点会进入审核阶段,不要投递任何无效链接,否则可能会对你的账号产生一定影响;\n4. 如果你发现错误,可以提交日志,让我们一起使网站变得更好。\n5. 由于本站为个人开发与维护,会尽力保证24小时内审核,当然有可能哪天太累,会延期,请保持佛系... + 由玩安卓客户端生成 + 保存到相册 + 立即分享 + 网站标题 + 加载中 + 同意 + 退出应用 + 请他喝杯咖啡~ + 去登录 + 注册 + 热门搜索 + 历史的搜索 + 完成 + 广场 + 不相信自己的人没有努力的价值 + 简书 + QQ群 + 呦~\nAPP做得不错呀\n请你喝杯咖啡 + 上滑 + 点击保存到相册 + 扫码下载安装 + 什么都没有~ + 怎么又出错~ + 已学%d\% + 签到 积分%s + 编辑 + 提示 + 网站链接 + 未学习 + 已学完 + 已复制 + 释放进入书籍教程 + 确定要清除搜索历史? + 非内测用户 + 开启生物认证登录 + 使用生物认证登录 + 请开发小哥哥喝杯咖啡吧!\n一个完全免费的APP!\n一个这么好用还完全免费的APP!\n一个这么好看又好用还完全免费的APP!\n不请我喝杯咖啡提提神?\n我都快没精力继续维护了! + 去请客 + 请先登录 + 激活成功,重启APP后生效 + 激活码无效 + 你发现了一个激活码!\n激活码仅与当前登录账户绑定,更换设备或账户后需重新激活,成功激活后将会去除所有广告,是否立即激活? + 激活 + 请登录后使用该功能 + 该功能仅限开发者账号使用 + 【玩口令】这是一个激活码口令,仅限特定账号使用,户制泽条消息 + 打开最美玩安卓客户端激活 + ###激活码生成###\n\n!!!警告!!!\n\n该功能仅限开发者使用 + 【玩口令】你的好友给你分享了一个链接,户制泽条消息%s打開最美玩安卓客户端即可查看该网页或者文章 + 复制 + 去更新 + 你发现了一个神秘口令!\n可惜当前版本不支持,快去设置中更新版本再试试吧! + 你发现了一个神秘用户!\n要不要去他主页看一下? + 去主页 + 【玩口令】你的好友给你分享了一个神秘用户,户制泽条消息%s打開最美玩安卓客户端揭开他/她的神秘面纱 + 你发现了一个网页链接!\n要不要去打开看一下? + 你发现了一个QQ号码!\n%s\n是否立即启动QQ加个好友? + 加好友 + 【玩口令】你的好友给你订了一份双人咖啡,户制泽条消息%s打開最美玩安卓客户端即可领取品尝 + 仅白名单 + 拦截黑名单 + 请输入用户名 + 请输入邮箱 + 请输入密码 + 下拉刷新 + 正在刷新 + 释放刷新 + 刷新完成 + 刷新失败 + 已完成 + 扫二维码需要相机权限 + 点击申请 + 保存成功 + 保存失败 + 授权失败 + 加载成功 + 加载失败 + 加载中(%d\%) + 已收藏 + 匿名 + 已加入我的书签 + 加入我的书签失败 + 已移出我的书签 + 移出我的书签失败 + + 渐显 + 缩放 + 底部滑入 + 左侧滑入 + 右侧滑入 + 长按返回按钮有更多快捷菜单~ + 下一个 + 双击任意位置可快速收藏~ + 长按网页图片可预览大图~ + 是否继续阅读? + 拒绝相机权限将无法扫码 + 重新申请 + 相机权限已被拒绝 + 去设置 + 无法获取相机权限 + 点击获取 + 选择图片需要存储权限 + 拒绝存储权限将无法选择图片 + 存储权限已被拒绝 + 没有识别到二维码 + 打开图片失败 + 体系 + 导航 + 问答 + 需要申请开通内测更新的小伙伴,请加群(见关于作者)说明内测更新并注明玩友号(见个人资料)。\n\n注:内测更新须提前登录并更新到最新正式版 + 发现新版本%s + 发现内测版本%s + 已是最新版 + %s(%d) + 新消息 + 历史消息 + 开启快捷登录成功 + 快捷登录成功 + 快捷登录失败,请使用密码登录 + 是否开启快捷登录 + 暂不开启 + 快捷登录 + 密码登录 + 请确认2次密码一致 + 文章 + 网址 + 白名单 + 黑名单 + 确定要全部删除吗? + 链接为空 + 删除失败 + 确定要清除缓存吗? + 确定要退出登录吗? + \ No newline at end of file diff --git a/basic_l10n/src/main/res/values/strings.xml b/basic_l10n/src/main/res/values/strings.xml index 0dcc1ac5..199a3dac 100644 --- a/basic_l10n/src/main/res/values/strings.xml +++ b/basic_l10n/src/main/res/values/strings.xml @@ -1,47 +1,279 @@ - 玩安卓 - - 网络连接失败,请检查网络设置 - 访问出错,请稍后重试 - - 确定 - 取消 - 关闭 -Ï - - 发现新版本 - 发现内测版本 - 立即更新 - 暂不更新 - - - 下载更新中... - 立即安装 - - - 暂不授权 - 去授权 - 去设置 - 未知 - 日历 - 照相机 - 通讯录 - 定位 - 麦克风 - 手机 - 短信 - 传感器 - 存储空间 - 相关 - 我们需要获取%s权限以确保应用的正常运行,请点击去授权完成权限申请。 - 您已拒绝应用使用%s权限,这将影响功能的正常运行,请前往设置打开权限。 - - - 《隐私政策》 - 感谢您使用玩安卓!\n我们依据最新的监管要求更新了《隐私政策》特向您说明如下:\n1. 为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2. 基于您的明示授权我们会获取存储权限,用于保存文章分享图,您有权拒绝或取消授权;\n3. 我们会采取安全措施保护您的信息安全;\n4. 未经您同意,我们不会从第三方处获取、共享或向其提供您的信息。 + WanAndroid + + Network connection failed, please check your network settings + An error occurred, please try again later + + OK + Cancel + Close + + + New version found + Beta version found + Update now + Not now + + + Downloading update... + Install now + + + Not now + Authorize + Go to settings + Unknown + Calendar + Camera + Contacts + Location + Microphone + Phone + SMS + Sensors + Storage + Related + We need %s permission to ensure the normal operation of the app. Please click to authorize. + You have denied %s permission, which will affect the normal operation of the app. Please go to settings to enable it. + + + Privacy Policy + Thank you for using WanAndroid!\nWe have updated our Privacy Policy according to the latest regulatory requirements. Please note:\n1. We collect and use necessary information to provide you with basic transaction functions;\n2. With your explicit authorization, we will obtain storage permission to save article sharing images. You have the right to refuse or cancel authorization;\n3. We take security measures to protect your information;\n4. Without your consent, we will not obtain, share, or provide your information to third parties. %d B %d \% - "下载失败,可前往Github仓库下载:我的-系统设置-关于我们-项目仓库" + Download failed, you can download from Github: Mine - System Settings - About Us - Project Repository + + This webpage is provided by %s + Back to home page + Share to Square + Collect + Bookmark + Refresh + Back to top + Web blocking + Exit + Use spaces to separate multiple keywords + Please enter the URL + About us + Check for updates + Official website + Website content + Project repository + Apply for closed beta + This app is independently developed by Goweii + Wan password + About the author + Welcome + My points + Points leaderboard + Something went wrong + Copy logs + Close + Reboot + My sharing + Open source projects + My bookmarks + Clear + Failed to get camera permission + Click to retry + Return to scan + Settings + Theme mode + Follow system + Light mode + Dark mode + Bookmark reminders + Notify the latest added bookmarks when opening the app + Show carousel + Show carousel images on the home page after enabling + Show pinned + Show pinned articles on the home page after enabling + Personal data + Wan ID + Username + Points: + Ranking: + Domain name + e.g. www.wanandroid.com + Cancel + OK + Open link + Got it + Save + Identify QR code in the picture + Please enter + I haven\'t even decided what to do with this password yet, how did you find it? + Ignore + Double click anywhere to favorite the article + Long press the image on the webpage to view it in large size + Copy link + Open in browser + Wan password website + Choose how to share + Long image + QR code + Book tutorials + Home + Go to sign up + Sign in + Level: + My collections + Q&A + New + Top + Delete + Mine + Long press the back button for a surprise~ + Share + Open + Article list + Knowledge system + Reading history + Long press to customize the block list + Do not block + Clear cache + Privacy policy + Sign out + Share article + Article title + Refresh title + Within 100 characters + Article link + e.g. https://www.wanandroid.com/blog/show/2577 + 1. Any good article can be shared, not necessarily original! Submitted articles will enter the Square tab;\n2. Official blog sites like CSDN, Juejin, Jianshu will be approved directly, no review needed;\n3. Other personal sites will be reviewed, do not submit invalid links, otherwise it may affect your account;\n4. If you find errors, you can submit logs to help us improve the site.\n5. Since the site is developed and maintained by an individual, reviews will be done within 24 hours as much as possible, but may be delayed if too tired, please be patient... + Generated by WanAndroid client + Save to album + Share now + Website title + Loading + Agree + Quit app + Buy him a coffee~ + Go to sign in + Sign up + Popular searches + Search history + Complete + Square + Those who don\'t believe in themselves have no value in working hard + Jianshu + QQ group + Yo~\nThe app is great\nBuy you a coffee + Swipe up + Click to save to album + Scan to download and install + Nothing~ + How did it go wrong again~ + Learned %d\% + Check-in points %s + Edit + Tips + Site links + Not learned + Already learned + Copied + Release into book tutorials + Are you sure you want to clear search history? + Not a beta user + Enable biometric sign-in + Sign in with biometrics + Buy the developer a coffee!\nA completely free app!\nSuch a useful and free app!\nSuch a beautiful and useful free app!\nWon\'t you buy me a coffee?\nI\'m running out of energy to maintain it! + Go treat + Please sign in first + Activation successful, effective after restarting the app + Invalid activation code + You found an activation code!\nThe activation code is bound to the current account. You need to reactivate when changing device or account. After successful activation, all ads will be removed. Activate now? + Activate + Please sign in to use this feature + This feature is only available for developer accounts + [Wan password] This is an activation code passcode, only for specific accounts, please ignore this message + Open the most beautiful WanAndroid client to activate + ### Activation code generation ###\n\n!!! Warning !!!\n\nThis feature is for developers only + [Wan password] Your friend shared a link with you, please ignore this message %s Open the most beautiful WanAndroid client to view the webpage or article + Copy + Go to update + You discovered a mysterious password!\nUnfortunately, the current version does not support it. Please update in settings and try again! + You discovered a mysterious user!\nDo you want to visit their homepage? + Go to homepage + [Wan password] Your friend shared a mysterious user with you, please ignore this message %s Open the most beautiful WanAndroid client to unveil their mystery + You found a webpage link!\nDo you want to open it? + You found a QQ number!\n%s\nDo you want to add as a friend in QQ now? + Add friend + [Wan password] Your friend ordered a double coffee for you, please ignore this message %s Open the most beautiful WanAndroid client to claim and taste + Whitelist only + Block blacklists + Please enter username + Please enter email + Please enter password + Pull down to refresh + Refreshing + Release to refresh + Refresh completed + Refresh failed + Done + Scanning QR code requires camera permission + Click to apply + Saved successfully + Save failed + Authorization failed + Loaded successfully + Load failed + Loading (%d\%) + Collected + Anonymous + Added to my bookmarks + Failed to add to my bookmarks + Removed from my bookmarks + Failed to remove from my bookmarks + None + Fade in + Zoom + Slide in from bottom + Slide in from left + Slide in from right + Long press the back button for more shortcut menus~ + Next + Double click anywhere to quickly bookmark~ + Long press the web image to preview a larger image~ + Continue reading? + Denying camera permission will prevent scanning + Reapply + Camera permission has been denied + Go to settings + Unable to get camera permission + Click to get + Selecting an image requires storage permission + Denying storage permission will prevent image selection + Storage permission has been denied + No QR code recognized + Failed to open image + System + Navigation + Q&A + To apply for closed beta updates, please join the group (see About the Author) and mention your Wan ID (see Personal Data).\n\nNote: You must log in and update to the latest official version before applying for beta updates. + New version found %s + Beta version found %s + Already the latest version + %s(%d) + New messages + Historical messages + Quick sign-in enabled successfully + Quick sign-in successful + Quick sign-in failed, please use password sign-in + Enable quick sign-in? + Not now + Quick sign-in + Password sign-in + Please make sure the two passwords are the same + Article + Website + Whitelist + Blacklist + Are you sure you want to delete all? + The link is empty + Deletion failed + Are you sure you want to clear cache? + Are you sure you want to sign out? \ No newline at end of file diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml index fa928514..01cc7b78 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml @@ -45,7 +45,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" - tools:text="已完成" + tools:text="@string/done" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> @@ -78,7 +78,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - tools:text="共" + tools:text="Total" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml index 769c8ffe..ae4f6cb2 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_list.xml @@ -14,7 +14,7 @@ android:gravity="center" android:textColor="?colorTextSurface" android:textSize="@dimen/text_title" - tools:text="提示" /> + tools:text="@string/tips" /> + tools:text="@string/tips" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" /> diff --git a/basic_ui/src/main/res/layout/basic_ui_rv_item_dialog_list.xml b/basic_ui/src/main/res/layout/basic_ui_rv_item_dialog_list.xml index e8b674aa..824cd6d8 100644 --- a/basic_ui/src/main/res/layout/basic_ui_rv_item_dialog_list.xml +++ b/basic_ui/src/main/res/layout/basic_ui_rv_item_dialog_list.xml @@ -13,6 +13,6 @@ android:gravity="center" android:textSize="@dimen/text_content" android:textColor="?colorTextSurface" - tools:text="列表条目"/> + tools:text="List entries"/> \ No newline at end of file diff --git a/basic_ui/src/main/res/layout/basic_ui_toast.xml b/basic_ui/src/main/res/layout/basic_ui_toast.xml index 070da32a..b1c5230b 100644 --- a/basic_ui/src/main/res/layout/basic_ui_toast.xml +++ b/basic_ui/src/main/res/layout/basic_ui_toast.xml @@ -24,6 +24,6 @@ android:paddingBottom="@dimen/margin_common" android:textColor="?colorTextToast" android:textSize="@dimen/text_content" - tools:text="知道了" /> + tools:text="@string/i_know" /> \ No newline at end of file diff --git a/basic_utils/src/main/java/per/goweii/basic/utils/ResUtils.java b/basic_utils/src/main/java/per/goweii/basic/utils/ResUtils.java index 152b8edb..e8e3be02 100644 --- a/basic_utils/src/main/java/per/goweii/basic/utils/ResUtils.java +++ b/basic_utils/src/main/java/per/goweii/basic/utils/ResUtils.java @@ -30,22 +30,28 @@ * @date 2018/7/9-下午4:56 */ public class ResUtils { + public static Context getContext() { + Context context = Utils.getResumedActivity(); + if (context != null) return context; + return Utils.getAppContext(); + } public static Resources getResources() { - return Utils.getAppContext().getResources(); + return getContext().getResources(); } public static Drawable getDrawable(@DrawableRes int id) { - return ContextCompat.getDrawable(Utils.getAppContext(), id); + return ContextCompat.getDrawable(getContext(), id); } + @NonNull public static String getString(@StringRes int id) { return getResources().getString(id); } @Deprecated public static int getColor(@ColorRes int id) { - return ContextCompat.getColor(Utils.getAppContext(), id); + return ContextCompat.getColor(getContext(), id); } public static int getColor(@NonNull Context context, @ColorRes int id) { diff --git a/basic_utils/src/main/java/per/goweii/basic/utils/ShareUtils.java b/basic_utils/src/main/java/per/goweii/basic/utils/ShareUtils.java index 6a6e6681..12a615aa 100644 --- a/basic_utils/src/main/java/per/goweii/basic/utils/ShareUtils.java +++ b/basic_utils/src/main/java/per/goweii/basic/utils/ShareUtils.java @@ -26,7 +26,7 @@ public static void shareBitmap(Context context, Bitmap bitmap) { intent.setAction(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, UriUtils.getFileUri(file)); - intent = Intent.createChooser(intent, "分享到"); + intent = Intent.createChooser(intent, null); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { @@ -39,7 +39,7 @@ public static void shareLink(Context context, String url) { intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, url); intent.setType("text/plain"); - intent = Intent.createChooser(intent, "分享到"); + intent = Intent.createChooser(intent, null); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { diff --git a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java index e7e3f21f..56c4f79d 100644 --- a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java +++ b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java @@ -1,7 +1,15 @@ package per.goweii.basic.utils; import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Application; import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.lang.ref.WeakReference; /** * @author Cuizhen @@ -9,15 +17,83 @@ public class Utils { @SuppressLint("StaticFieldLeak") private static Context context = null; + private static final ActivityLifecycleCallbackImpl mActivityLifecycleCallback = new ActivityLifecycleCallbackImpl(); public static void init(Context context) { - Utils.context = context; + if (Utils.context == null) { + Utils.context = context; + registerActivityLifecycleCallbacks(); + } } + @NonNull public static Context getAppContext() { if (context == null) { - throw new RuntimeException("Utils未在Application中初始化"); + throw new RuntimeException("Not initialized"); } return context; } + + @Nullable + public static Activity getResumedActivity() { + if (context == null) { + throw new RuntimeException("Not initialized"); + } + return mActivityLifecycleCallback.getResumedActivity(); + } + + private static void registerActivityLifecycleCallbacks() { + if (context == null) { + return; + } + if (context instanceof Application) { + Application application = (Application) context; + application.registerActivityLifecycleCallbacks(mActivityLifecycleCallback); + } + } + + private static class ActivityLifecycleCallbackImpl implements Application.ActivityLifecycleCallbacks { + @Nullable + private WeakReference mResumedActivityRef = null; + + @Nullable + public Activity getResumedActivity() { + return mResumedActivityRef != null ? mResumedActivityRef.get() : null; + } + + @Override + public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { + } + + @Override + public void onActivityStarted(@NonNull Activity activity) { + } + + @Override + public void onActivityResumed(@NonNull Activity activity) { + if (mResumedActivityRef == null || mResumedActivityRef.get() != activity) { + mResumedActivityRef = new WeakReference<>(activity); + } + } + + @Override + public void onActivityPaused(@NonNull Activity activity) { + if (mResumedActivityRef != null && mResumedActivityRef.get() == activity) { + mResumedActivityRef.clear(); + mResumedActivityRef = null; + } + } + + @Override + public void onActivityStopped(@NonNull Activity activity) { + } + + @Override + public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { + } + + @Override + public void onActivityDestroyed(@NonNull Activity activity) { + } + } } From c5dfb61c523932134430d52369b46fef79f37871 Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 17:45:01 +0800 Subject: [PATCH 04/30] =?UTF-8?q?feat:=20=E7=BF=BB=E8=AF=91=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_l10n/src/main/res/values-ar/strings.xml | 279 ++++++++++++++++++ basic_l10n/src/main/res/values-es/strings.xml | 279 ++++++++++++++++++ basic_l10n/src/main/res/values-fr/strings.xml | 279 ++++++++++++++++++ basic_l10n/src/main/res/values-ru/strings.xml | 279 ++++++++++++++++++ 4 files changed, 1116 insertions(+) create mode 100644 basic_l10n/src/main/res/values-ar/strings.xml create mode 100644 basic_l10n/src/main/res/values-es/strings.xml create mode 100644 basic_l10n/src/main/res/values-fr/strings.xml create mode 100644 basic_l10n/src/main/res/values-ru/strings.xml diff --git a/basic_l10n/src/main/res/values-ar/strings.xml b/basic_l10n/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000..79b361a4 --- /dev/null +++ b/basic_l10n/src/main/res/values-ar/strings.xml @@ -0,0 +1,279 @@ + + + وان أندرويد + + فشل الاتصال بالشبكة، يرجى التحقق من إعدادات الشبكة + حدث خطأ في الوصول، يرجى المحاولة لاحقًا + + تأكيد + إلغاء + إغلاق + + + تم العثور على إصدار جديد + تم العثور على إصدار تجريبي + تحديث الآن + ليس الآن + + + جارٍ تنزيل التحديث... + تثبيت الآن + + + عدم السماح مؤقتًا + اذهب للسماح + اذهب للإعدادات + غير معروف + التقويم + الكاميرا + جهات الاتصال + الموقع + الميكروفون + الهاتف + الرسائل + المستشعرات + مساحة التخزين + ذو صلة + نحتاج إلى إذن %s لضمان التشغيل السليم للتطبيق، يرجى النقر للسماح. + لقد رفضت إذن %s، قد يؤثر ذلك على الوظائف، يرجى الذهاب للإعدادات لتمكين الإذن. + + + "سياسة الخصوصية" + شكرًا لاستخدامك وان أندرويد!\nقمنا بتحديث "سياسة الخصوصية" وفقًا لأحدث المتطلبات التنظيمية، ونوضح ما يلي:\n1. لجلب الوظائف الأساسية، سنجمع ونستخدم المعلومات الضرورية؛\n2. بناءً على إذنك الصريح، سنطلب إذن التخزين لحفظ صور مشاركة المقالات، ويمكنك رفض أو إلغاء الإذن؛\n3. سنتخذ تدابير أمنية لحماية معلوماتك؛\n4. لن نحصل أو نشارك أو نقدم معلوماتك لطرف ثالث دون إذنك. + + %d B + %d \% + "فشل التنزيل، يمكنك الذهاب إلى مستودع Github: أنا - إعدادات النظام - حولنا - مستودع المشروع" + + هذه الصفحة مقدمة من %s + العودة إلى الصفحة الرئيسية + مشاركة إلى الساحة + المفضلة + إشارة مرجعية + تحديث + العودة للأعلى + حظر الويب + خروج + استخدم المسافة للفصل بين الكلمات المفتاحية + يرجى إدخال الرابط + معلومات عنا + التحقق من التحديثات + الموقع الرسمي + محتوى الموقع + مستودع المشروع + طلب نسخة تجريبية مغلقة + تم تطوير هذا التطبيق بشكل مستقل بواسطة Goweii + كلمة مرور وان + عن المؤلف + مرحبًا بك + نقاطي + لوحة الصدارة + حدث خطأ + نسخ السجلات + إغلاق + إعادة التشغيل + مشاركاتي + مشاريع مفتوحة المصدر + إشاراتي المرجعية + مسح + لم يتم الحصول على إذن الكاميرا + انقر لإعادة المحاولة + العودة لمسح الرمز + الإعدادات + وضع السمة + اتبع النظام + وضع النهار + الوضع الليلي + تذكير الإشارات المرجعية + عند فتح التطبيق سيتم تذكيرك بأحدث الإشارات المرجعية + عرض السلايدر + عند التفعيل، سيتم عرض السلايدر في الصفحة الرئيسية + عرض المثبت + عند التفعيل، سيتم عرض المقالات المثبتة في الصفحة الرئيسية + البيانات الشخصية + معرف وان + اسم المستخدم + النقاط: + الترتيب: + اسم النطاق + مثال: www.wanandroid.com + إلغاء + تأكيد + فتح الرابط + فهمت + حفظ + التعرف على رمز QR في الصورة + يرجى الإدخال + لم أقرر بعد ماذا أفعل بهذه الكلمة، كيف اكتشفتها؟ + تجاهل + انقر مرتين في أي مكان لإضافة المقالة للمفضلة + اضغط مطولًا على صورة الويب لعرضها بالحجم الكامل + نسخ الرابط + فتح في المتصفح + كلمة مرور وان للويب + اختر طريقة المشاركة + صورة طويلة + رمز QR + دروس الكتب + الصفحة الرئيسية + اذهب للتسجيل + تسجيل الدخول + المستوى: + مجموعاتي + الأسئلة والأجوبة + جديد + مثبت + حذف + خاصتي + اضغط مطولًا على زر الرجوع لمفاجأة! + مشاركة + فتح + قائمة المقالات + نظام المعرفة + سجل القراءة + اضغط مطولًا لتخصيص قائمة الحظر + لا تحظر + مسح ذاكرة التخزين المؤقت + سياسة الخصوصية + تسجيل الخروج + مشاركة المقال + عنوان المقال + تحديث العنوان + حتى 100 حرف + رابط المقال + مثال: https://www.wanandroid.com/blog/show/2577 + 1. يمكنك مشاركة أي مقال جيد، ليس بالضرورة أن يكون أصليًا! سيتم إدراج المقالات المقدمة في علامة التبويب الساحة;\n2. سيتم قبول مدونات المواقع الرسمية مثل CSDN، Juejin، Jiashu مباشرة دون مراجعة;\n3. سيتم مراجعة المواقع الشخصية الأخرى، لا ترسل روابط غير صالحة حتى لا يؤثر ذلك على حسابك;\n4. إذا وجدت خطأ، يمكنك إرسال سجل الأخطاء لمساعدتنا في تحسين الموقع.\n5. نظرًا لأن الموقع مطور ومدار بشكل فردي، سنحاول مراجعة المقالات خلال 24 ساعة، ولكن قد يتأخر أحيانًا، يرجى التحلي بالصبر... + تم الإنشاء بواسطة تطبيق وان أندرويد + حفظ في الألبوم + شارك الآن + عنوان الموقع + جارٍ التحميل + موافق + الخروج من التطبيق + اشتر له كوب قهوة~ + اذهب لتسجيل الدخول + تسجيل + عمليات البحث الشائعة + عمليات البحث السابقة + إكمال + الساحة + من لا يثق بنفسه لا قيمة لجهده + جيانشو + مجموعة QQ + يو~\nالتطبيق رائع\nاشترِ لك كوب قهوة + اسحب للأعلى + انقر للحفظ في الألبوم + امسح الرمز لتنزيل وتثبيت التطبيق + لا يوجد شيء~ + كيف حدث الخطأ مرة أخرى~ + تم التعلم %d\% + تسجيل الدخول النقاط %s + تعديل + نصيحة + روابط الموقع + لم يتم التعلم + تم التعلم + تم النسخ + إفلات في دروس الكتب + هل أنت متأكد من مسح سجل البحث؟ + ليس مستخدمًا تجريبيًا + تفعيل تسجيل الدخول البيومتري + تسجيل الدخول باستخدام المصادقة البيومترية + اشترِ للمطور كوب قهوة!\nتطبيق مجاني بالكامل!\nتطبيق جميل وسهل الاستخدام ومجاني بالكامل!\nألا تشتري لي كوب قهوة؟\nلم يعد لدي طاقة للاستمرار في الصيانة! + اذهب للضيافة + يرجى تسجيل الدخول أولاً + تم التفعيل بنجاح، سيسري بعد إعادة تشغيل التطبيق + رمز التفعيل غير صالح + لقد وجدت رمز تفعيل!\nرمز التفعيل مرتبط بالحساب الحالي فقط، إذا غيرت الجهاز أو الحساب يجب إعادة التفعيل، بعد التفعيل سيتم إزالة جميع الإعلانات، هل تريد التفعيل الآن؟ + تفعيل + يرجى تسجيل الدخول لاستخدام هذه الميزة + هذه الميزة متاحة فقط لحسابات المطورين + [كلمة مرور وان] هذا رمز تفعيل، متاح فقط لحسابات معينة، يرجى تجاهل هذه الرسالة + افتح أجمل تطبيق وان أندرويد للتفعيل + ###توليد رمز التفعيل###\n\n!!!تحذير!!!\n\nهذه الميزة متاحة فقط للمطورين + [كلمة مرور وان] صديقك شارك معك رابطًا، يرجى تجاهل هذه الرسالة %s وافتح أجمل تطبيق وان أندرويد لعرض الصفحة أو المقالة + نسخ + اذهب للتحديث + لقد اكتشفت كلمة مرور غامضة!\nللأسف الإصدار الحالي لا يدعمها، يرجى التحديث من الإعدادات والمحاولة مرة أخرى! + لقد اكتشفت مستخدمًا غامضًا!\nهل تريد زيارة صفحته الرئيسية؟ + اذهب للصفحة الرئيسية + [كلمة مرور وان] صديقك شارك معك مستخدمًا غامضًا، يرجى تجاهل هذه الرسالة %s وافتح أجمل تطبيق وان أندرويد لكشف الغموض + لقد وجدت رابط صفحة ويب!\nهل تريد فتحه؟ + لقد وجدت رقم QQ!\n%s\nهل تريد فتح QQ وإضافة صديق؟ + إضافة صديق + [كلمة مرور وان] صديقك طلب لك قهوة لشخصين، يرجى تجاهل هذه الرسالة %s وافتح أجمل تطبيق وان أندرويد للاستلام + القائمة البيضاء فقط + حظر القائمة السوداء + يرجى إدخال اسم المستخدم + يرجى إدخال البريد الإلكتروني + يرجى إدخال كلمة المرور + اسحب للأسفل للتحديث + جارٍ التحديث + حرر للتحديث + تم التحديث + فشل التحديث + تم + مسح رمز QR يتطلب إذن الكاميرا + انقر للتقديم + تم الحفظ بنجاح + فشل الحفظ + فشل التفويض + تم التحميل بنجاح + فشل التحميل + جارٍ التحميل (%d\%) + تمت الإضافة للمفضلة + مجهول + تمت الإضافة إلى إشاراتي المرجعية + فشل الإضافة إلى إشاراتي المرجعية + تمت الإزالة من إشاراتي المرجعية + فشل الإزالة من إشاراتي المرجعية + بدون + تلاشي + تكبير + انزلاق من الأسفل + انزلاق من اليسار + انزلاق من اليمين + اضغط مطولًا على زر الرجوع لمزيد من القوائم المختصرة~ + التالي + انقر مرتين في أي مكان للإضافة السريعة للمفضلة~ + اضغط مطولًا على صورة الويب لمعاينة صورة أكبر~ + هل تريد المتابعة في القراءة؟ + رفض إذن الكاميرا سيمنع المسح + إعادة التقديم + تم رفض إذن الكاميرا + اذهب للإعدادات + غير قادر على الحصول على إذن الكاميرا + انقر للحصول عليه + اختيار صورة يتطلب إذن التخزين + رفض إذن التخزين سيمنع اختيار الصور + تم رفض إذن التخزين + لم يتم التعرف على رمز QR + فشل فتح الصورة + النظام + التنقل + الأسئلة والأجوبة + للحصول على تحديثات النسخة التجريبية، يرجى الانضمام إلى المجموعة (انظر حول المؤلف) وذكر رقم وان (انظر البيانات الشخصية).\n\nملاحظة: يجب تسجيل الدخول وتحديث التطبيق إلى أحدث إصدار رسمي قبل التقديم للنسخة التجريبية + تم العثور على إصدار جديد %s + تم العثور على إصدار تجريبي %s + هذا هو أحدث إصدار + %s(%d) + رسائل جديدة + رسائل سابقة + تم تفعيل تسجيل الدخول السريع بنجاح + تم تسجيل الدخول السريع بنجاح + فشل تسجيل الدخول السريع، يرجى استخدام كلمة المرور + هل تريد تفعيل تسجيل الدخول السريع؟ + ليس الآن + تسجيل الدخول السريع + تسجيل الدخول بكلمة المرور + يرجى التأكد من تطابق كلمة المرور مرتين + مقال + موقع + القائمة البيضاء + القائمة السوداء + هل أنت متأكد من حذف الكل؟ + الرابط فارغ + فشل الحذف + هل أنت متأكد من مسح ذاكرة التخزين المؤقت؟ + هل أنت متأكد من تسجيل الخروج؟ + \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-es/strings.xml b/basic_l10n/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..58d6bc8f --- /dev/null +++ b/basic_l10n/src/main/res/values-es/strings.xml @@ -0,0 +1,279 @@ + + + WanAndroid + + Conexión de red fallida, por favor verifica la configuración de red + Error de acceso, inténtalo de nuevo más tarde + + Aceptar + Cancelar + Cerrar + + + Nueva versión encontrada + Versión beta encontrada + Actualizar ahora + No actualizar por ahora + + + Descargando actualización... + Instalar ahora + + + No autorizar por ahora + Autorizar + Ir a configuración + Desconocido + Calendario + Cámara + Contactos + Ubicación + Micrófono + Teléfono + SMS + Sensores + Almacenamiento + Relacionado + Necesitamos el permiso de %s para garantizar el funcionamiento normal de la aplicación. Haz clic para autorizar. + Has denegado el permiso de %s, lo que afectará el funcionamiento normal. Ve a configuración para habilitarlo. + + + "Política de Privacidad" + ¡Gracias por usar WanAndroid!\nHemos actualizado nuestra Política de Privacidad según los últimos requisitos regulatorios:\n1. Para proporcionarte funciones básicas de transacción, recopilaremos y usaremos la información necesaria;\n2. Con tu autorización explícita, obtendremos permiso de almacenamiento para guardar imágenes compartidas de artículos. Puedes rechazar o cancelar la autorización;\n3. Tomaremos medidas de seguridad para proteger tu información;\n4. Sin tu consentimiento, no obtendremos, compartiremos ni proporcionaremos tu información a terceros. + + %d B + %d \% + Descarga fallida, puedes descargar desde el repositorio de Github: Yo - Configuración del sistema - Sobre nosotros - Repositorio del proyecto + + Página proporcionada por %s + Volver a la página principal + Compartir en la plaza + Favorito + Marcador + Actualizar + Volver arriba + Bloqueo de página web + Salir + Usa espacios para separar varias palabras clave + Por favor, introduce la URL + Sobre nosotros + Buscar actualizaciones + Sitio web oficial + Contenido del sitio web + Repositorio del proyecto + Solicitar beta cerrada + Esta APP está desarrollada independientemente por Goweii + Contraseña Wan + Sobre el autor + Bienvenido + Mis puntos + Tabla de clasificación + Ocurrió un error + Copiar registros + Cerrar + Reiniciar + Mis compartidos + Proyectos de código abierto + Mis marcadores + Limpiar + No se obtuvo permiso de cámara + Haz clic para reintentar + Volver a escanear + Configuración + Modo de tema + Seguir el sistema + Modo claro + Modo oscuro + Recordatorio de marcadores + Recibir notificación de los últimos marcadores al abrir la app + Mostrar carrusel + Mostrar carrusel en la página principal + Mostrar fijados + Mostrar artículos fijados en la página principal + Datos personales + ID Wan + Nombre de usuario + Puntos: + Ranking: + Dominio + Ej: www.wanandroid.com + Cancelar + Aceptar + Abrir enlace + Entendido + Guardar + Identificar código QR en la imagen + Por favor, introduce + Ni siquiera he pensado para qué usar esta contraseña, ¿cómo la encontraste? + Ignorar + Haz doble clic en cualquier lugar para marcar como favorito + Mantén presionada la imagen para verla en grande + Copiar enlace + Abrir en el navegador + Contraseña Wan en la web + Elige cómo compartir + Imagen larga + Código QR + Tutoriales de libros + Inicio + Registrarse + Iniciar sesión + Nivel: + Mis colecciones + Preguntas y respuestas + Nuevo + Fijado + Eliminar + Mío + Mantén presionado el botón de retroceso para una sorpresa~ + Compartir + Abrir + Lista de artículos + Sistema de conocimiento + Historial de lectura + Mantén presionado para personalizar la lista de bloqueo + No bloquear + Limpiar caché + Política de privacidad + Cerrar sesión + Compartir artículo + Título del artículo + Actualizar título + Hasta 100 caracteres + Enlace al artículo + Ej: https://www.wanandroid.com/blog/show/2577 + 1. ¡Puedes compartir cualquier buen artículo, no tiene que ser original! Los artículos enviados aparecerán en la pestaña Plaza;\n2. Los blogs oficiales como CSDN, Juejin, JianShu se aprobarán automáticamente;\n3. Otros sitios personales requerirán revisión. No envíes enlaces inválidos o tu cuenta podría verse afectada;\n4. Si encuentras errores, puedes enviar registros para mejorar el sitio juntos.\n5. El sitio es desarrollado y mantenido por una sola persona, se intentará revisar en 24 horas, pero puede haber retrasos. ¡Gracias por tu paciencia! + Generado por el cliente WanAndroid + Guardar en el álbum + Compartir ahora + Título del sitio web + Cargando + Aceptar + Salir de la aplicación + Invítale un café~ + Iniciar sesión + Registrarse + Búsquedas populares + Búsquedas históricas + Completar + Plaza + Quien no cree en sí mismo no tiene valor para esforzarse + JianShu + Grupo QQ + ¡Vaya!\nLa APP está muy bien hecha\nTe invito un café + Deslizar hacia arriba + Haz clic para guardar en el álbum + Escanea el código para descargar e instalar + Nada aquí~ + ¿Por qué falló de nuevo~? + %d\% aprendido + Check-in Puntos %s + Editar + Consejos + Enlaces del sitio + No aprendido + Completado + Copiado + Soltar en tutoriales de libros + ¿Seguro que quieres borrar el historial de búsqueda? + No eres usuario beta + Activar inicio de sesión biométrico + Iniciar sesión con biometría + ¡Invita al desarrollador a un café!\n¡Una APP completamente gratuita!\n¡Una APP tan útil y gratuita!\n¡Tan bonita, útil y gratuita!\n¿No me invitas un café para animarme?\n¡Ya casi no tengo energía para seguir manteniéndola! + Invitar + Por favor, inicia sesión primero + Activación exitosa, será efectiva tras reiniciar la APP + Código de activación inválido + ¡Has encontrado un código de activación!\nEl código solo está vinculado a la cuenta actual. Si cambias de dispositivo o cuenta, deberás activarlo de nuevo. Tras la activación, se eliminarán todos los anuncios. ¿Activar ahora? + Activar + Inicia sesión para usar esta función + Esta función solo está disponible para cuentas de desarrollador + [Contraseña Wan] Este es un código de activación, solo para cuentas específicas + Abre el cliente WanAndroid para activar + ###Generación de código de activación###\n\n¡¡¡Advertencia!!!\n\nSolo para desarrolladores + [Contraseña Wan] Tu amigo te compartió un enlace, abre el cliente WanAndroid para verlo + Copiar + Actualizar + ¡Has encontrado una contraseña misteriosa!\nLamentablemente, la versión actual no la soporta. Actualiza la app en configuración e inténtalo de nuevo. + ¡Has encontrado un usuario misterioso!\n¿Quieres visitar su perfil? + Ir al perfil + [Contraseña Wan] Tu amigo te compartió un usuario misterioso, abre el cliente WanAndroid para descubrirlo + ¡Has encontrado un enlace web!\n¿Quieres abrirlo? + ¡Has encontrado un número QQ!\n%s\n¿Abrir QQ para agregar como amigo? + Agregar amigo + [Contraseña Wan] Tu amigo te ha pedido un café doble, abre el cliente WanAndroid para recibirlo + Solo lista blanca + Bloquear lista negra + Por favor, introduce tu nombre de usuario + Por favor, introduce tu correo electrónico + Por favor, introduce tu contraseña + Desliza hacia abajo para actualizar + Actualizando + Suelta para actualizar + Actualización completada + Actualización fallida + Hecho + Escanear código QR requiere permiso de cámara + Haz clic para solicitar + Guardado exitosamente + Error al guardar + Autorización fallida + Cargado exitosamente + Error al cargar + Cargando (%d\%) + Favorito + Anónimo + Añadido a mis marcadores + Error al añadir a mis marcadores + Eliminado de mis marcadores + Error al eliminar de mis marcadores + Ninguno + Aparecer + Zoom + Deslizar desde abajo + Deslizar desde la izquierda + Deslizar desde la derecha + Mantén presionado el botón de retroceso para más accesos directos~ + Siguiente + Haz doble clic en cualquier lugar para marcar rápidamente~ + Mantén presionada la imagen para previsualizar en grande~ + ¿Continuar leyendo? + Sin permiso de cámara no se puede escanear + Solicitar de nuevo + Permiso de cámara denegado + Ir a configuración + No se pudo obtener permiso de cámara + Haz clic para obtener + Seleccionar imagen requiere permiso de almacenamiento + Sin permiso de almacenamiento no se puede seleccionar imagen + Permiso de almacenamiento denegado + No se reconoció ningún código QR + Error al abrir la imagen + Sistema + Navegación + Preguntas y respuestas + Para solicitar acceso a la beta cerrada, únete al grupo (ver Sobre el autor) e indica tu número de usuario (ver perfil).\n\nNota: Debes iniciar sesión y actualizar a la última versión oficial antes de solicitar la beta. + Nueva versión encontrada %s + Versión beta encontrada %s + Ya tienes la última versión + %s(%d) + Nuevos mensajes + Mensajes históricos + Inicio de sesión rápido habilitado + Inicio de sesión rápido exitoso + Error en inicio de sesión rápido, usa la contraseña + ¿Habilitar inicio de sesión rápido? + No habilitar por ahora + Inicio de sesión rápido + Inicio de sesión con contraseña + Asegúrate de que ambas contraseñas coincidan + Artículo + Sitio web + Lista blanca + Lista negra + ¿Seguro que quieres eliminar todo? + El enlace está vacío + Error al eliminar + ¿Seguro que quieres limpiar la caché? + ¿Seguro que quieres cerrar sesión? + \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-fr/strings.xml b/basic_l10n/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..1794f8b1 --- /dev/null +++ b/basic_l10n/src/main/res/values-fr/strings.xml @@ -0,0 +1,279 @@ + + + WanAndroid + + Échec de la connexion réseau, veuillez vérifier les paramètres réseau + Erreur d\'accès, veuillez réessayer plus tard + + Confirmer + Annuler + Fermer + + + Nouvelle version trouvée + Version bêta trouvée + Mettre à jour maintenant + Pas maintenant + + + Téléchargement de la mise à jour... + Installer maintenant + + + Pas maintenant + Autoriser + Aller aux paramètres + Inconnu + Calendrier + Appareil photo + Contacts + Localisation + Microphone + Téléphone + SMS + Capteurs + Stockage + Concerné + Nous avons besoin de la permission %s pour assurer le bon fonctionnement de l\'application. Veuillez cliquer pour autoriser. + Vous avez refusé la permission %s, cela peut affecter le fonctionnement. Veuillez l\'activer dans les paramètres. + + + « Politique de confidentialité » + Merci d\'utiliser WanAndroid !\nNous avons mis à jour notre politique de confidentialité conformément aux dernières exigences réglementaires :\n1. Pour vous fournir les fonctions de base, nous collectons et utilisons les informations nécessaires ;\n2. Avec votre autorisation explicite, nous accédons au stockage pour enregistrer les images partagées. Vous pouvez refuser ou annuler ;\n3. Nous prenons des mesures de sécurité pour protéger vos informations ;\n4. Sans votre consentement, nous ne collecterons, partagerons ni fournirons vos informations à des tiers. + + %d B + %d \% + "Échec du téléchargement, vous pouvez télécharger depuis le dépôt Github : Moi - Paramètres système - À propos de nous - Dépôt du projet" + + Page fournie par %s + Retour à l\'accueil + Partager sur la place + Favoris + Signet + Rafraîchir + Retour en haut + Blocage de page + Quitter + Séparez plusieurs mots-clés par des espaces + Veuillez saisir l\'URL + À propos de nous + Vérifier les mises à jour + Site officiel + Contenu du site + Dépôt du projet + Demander la bêta fermée + Cette application est développée indépendamment par Goweii + Mot de passe Wan + À propos de l\'auteur + Bienvenue + Mes points + Classement des points + Une erreur s\'est produite + Copier les journaux + Fermer + Redémarrer + Mes partages + Projets open source + Mes signets + Effacer + Permission appareil photo non obtenue + Cliquez pour réessayer + Retour au scan + Paramètres + Mode thème + Suivre le système + Mode clair + Mode sombre + Rappel de signet + Notifier les nouveaux signets à l\'ouverture de l\'application + Afficher le carrousel + Afficher le carrousel sur la page d\'accueil + Afficher épinglé + Afficher les articles épinglés sur la page d\'accueil + Profil + WanID + Nom d\'utilisateur + Points : + Classement : + Nom de domaine + ex : www.wanandroid.com + Annuler + OK + Ouvrir le lien + Je comprends + Enregistrer + Reconnaître le QR code dans l\'image + Veuillez saisir + Je n\'ai même pas encore décidé à quoi sert ce mot de passe, comment l\'avez-vous trouvé ? + Ignorer + Double-cliquez n\'importe où pour ajouter aux favoris + Appuyez longuement sur l\'image pour l\'agrandir + Copier le lien + Ouvrir dans le navigateur + Mot de passe Wan Web + Choisissez le mode de partage + Image longue + QR code + Tutoriels de livres + Accueil + S\'inscrire + Connexion + Niveau : + Mes collections + Questions/Réponses + Nouveau + Épinglé + Supprimer + Mon + Appuyez longuement sur retour pour une surprise~ + Partager + Ouvrir + Liste des articles + Système de connaissances + Historique de lecture + Appuyez longuement pour personnaliser la liste de blocage + Ne pas bloquer + Vider le cache + Politique de confidentialité + Déconnexion + Partager l\'article + Titre de l\'article + Rafraîchir le titre + Jusqu\'à 100 caractères + Lien de l\'article + ex : https://www.wanandroid.com/blog/show/2577 + 1. Vous pouvez partager tout bon article, pas seulement les originaux ! Les articles soumis apparaîtront dans l\'onglet Place ;\n2. Les blogs officiels comme CSDN, Juejin, JianShu sont automatiquement approuvés ;\n3. Les sites personnels nécessitent une vérification ; n\'envoyez pas de liens invalides, cela pourrait affecter votre compte ;\n4. Si vous trouvez une erreur, envoyez un journal pour améliorer le site.\n5. Ce site est maintenu par une seule personne, l\'approbation se fait sous 24h, sauf imprévu. + Généré par le client WanAndroid + Enregistrer dans l\'album + Partager maintenant + Titre du site + Chargement + Accepter + Quitter l\'application + Offrez-lui un café~ + Se connecter + S\'inscrire + Recherches populaires + Recherches historiques + Terminer + Place + Celui qui ne croit pas en lui-même n\'a aucune valeur à s\'efforcer + JianShu + Groupe QQ + Yo~\nL\'application est super !\nOffrez-vous un café + Glisser vers le haut + Cliquez pour enregistrer dans l\'album + Scanner pour télécharger et installer + Rien~ + Encore une erreur~ + %d \% appris + Enregistrement Points %s + Éditer + Conseil + Liens du site + Non appris + Déjà appris + Copié + Relâcher dans le tutoriel de livre + Êtes-vous sûr de vouloir effacer l\'historique de recherche ? + Pas un utilisateur bêta + Activer la connexion biométrique + Se connecter avec la biométrie + Offrez un café au développeur !\nUne application totalement gratuite !\nUne application aussi pratique et gratuite !\nAussi belle, aussi pratique et gratuite !\nPas de café pour moi ?\nJe n\'ai plus d\'énergie pour continuer ! + Offrir + Veuillez vous connecter d\'abord + Activation réussie, effective après redémarrage + Code d\'activation invalide + Vous avez trouvé un code d\'activation !\nLe code est lié au compte actuel. Après changement d\'appareil ou de compte, il faut réactiver. Après activation, toutes les pubs seront supprimées. Activer maintenant ? + Activer + Veuillez vous connecter pour utiliser cette fonction + Cette fonction est réservée aux comptes développeur + [Wan Watchword] Ceci est un code d\'activation, réservé à certains comptes + Ouvrez le plus beau client WanAndroid pour activer + ###Génération de code d\'activation###\n\n!!! Attention !!!\n\nCette fonction est réservée aux développeurs + [Wan Watchword] Votre ami vous a partagé un lien, ouvrez le client WanAndroid pour le voir : %s + Copier + Mettre à jour + Vous avez trouvé un mot de passe mystérieux !\nMalheureusement, cette version ne le prend pas en charge. Mettez à jour dans les paramètres et réessayez ! + Vous avez trouvé un utilisateur mystérieux !\nVoulez-vous visiter sa page ? + Aller à la page d\'accueil + [Wan Watchword] Votre ami vous a partagé un utilisateur mystérieux, ouvrez le client WanAndroid pour le découvrir : %s + Vous avez trouvé un lien web !\nVoulez-vous l\'ouvrir ? + Vous avez trouvé un numéro QQ !\n%s\nVoulez-vous ouvrir QQ pour ajouter un ami ? + Ajouter un ami + [Wan Watchword] Votre ami vous a commandé un café pour deux, ouvrez le client WanAndroid pour le recevoir : %s + Liste blanche uniquement + Bloquer la liste noire + Veuillez saisir votre nom d\'utilisateur + Veuillez saisir votre e-mail + Veuillez saisir votre mot de passe + Tirer pour rafraîchir + Rafraîchissement + Relâcher pour rafraîchir + Rafraîchissement terminé + Échec du rafraîchissement + Terminé + Scanner le QR code nécessite la permission appareil photo + Cliquez pour demander + Enregistrement réussi + Échec de l\'enregistrement + Échec de l\'autorisation + Chargé avec succès + Échec du chargement + Chargement (%d \%) + Ajouté aux favoris + Anonyme + Ajouté à mes signets + Échec de l\'ajout aux signets + Retiré de mes signets + Échec du retrait des signets + Aucun + Fondu + Zoom + Glisser du bas + Glisser de la gauche + Glisser de la droite + Appuyez longuement sur retour pour plus de raccourcis~ + Suivant + Double-cliquez n\'importe où pour ajouter rapidement aux favoris~ + Appuyez longuement sur l\'image pour la prévisualiser en grand~ + Continuer la lecture ? + Refuser la permission appareil photo empêche le scan + Redemander + Permission appareil photo refusée + Aller aux paramètres + Impossible d\'obtenir la permission appareil photo + Cliquez pour obtenir + Sélectionner une image nécessite la permission stockage + Refuser la permission stockage empêche la sélection d\'image + Permission stockage refusée + Aucun QR code reconnu + Échec de l\'ouverture de l\'image + Système + Navigation + Questions/Réponses + Pour demander l\'accès à la bêta, rejoignez le groupe (voir À propos de l\'auteur) et indiquez votre numéro Wan (voir profil).\n\nNote : la bêta nécessite d\'être connecté et à jour. + Nouvelle version trouvée : %s + Version bêta trouvée : %s + Déjà à jour + %s(%d) + Nouveaux messages + Messages historiques + Connexion rapide activée + Connexion rapide réussie + Échec de la connexion rapide, veuillez utiliser le mot de passe + Activer la connexion rapide ? + Pas maintenant + Connexion rapide + Connexion par mot de passe + Veuillez confirmer que les deux mots de passe sont identiques + Article + Site web + Liste blanche + Liste noire + Voulez-vous tout supprimer ? + Lien vide + Échec de la suppression + Voulez-vous vider le cache ? + Voulez-vous vous déconnecter ? + \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-ru/strings.xml b/basic_l10n/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..1bafc8bd --- /dev/null +++ b/basic_l10n/src/main/res/values-ru/strings.xml @@ -0,0 +1,279 @@ + + + WanAndroid + + Не удалось подключиться к сети, пожалуйста, проверьте настройки сети + Ошибка доступа, попробуйте позже + + ОК + Отмена + Закрыть + + + Обнаружена новая версия + Обнаружена бета-версия + Обновить сейчас + Пока не обновлять + + + Загрузка обновления... + Установить сейчас + + + Не разрешать + Разрешить + Перейти к настройкам + Неизвестно + Календарь + Камера + Контакты + Местоположение + Микрофон + Телефон + SMS + Датчики + Хранилище + Связанные + Нам нужно разрешение %s для корректной работы приложения. Пожалуйста, нажмите "Разрешить". + Вы запретили разрешение %s, это повлияет на работу функций. Пожалуйста, включите разрешение в настройках. + + + «Политика конфиденциальности» + Спасибо за использование WanAndroid!\nМы обновили «Политику конфиденциальности» в соответствии с последними требованиями:\n1. Для предоставления основных функций мы собираем и используем необходимую информацию;\n2. С вашего разрешения мы получаем доступ к хранилищу для сохранения изображений, вы можете отказаться;\n3. Мы принимаем меры для защиты вашей информации;\n4. Без вашего согласия мы не получаем, не делимся и не передаем вашу информацию третьим лицам. + + %d B + %d \% + "Не удалось загрузить, скачайте с Github: Мое - Настройки системы - О нас - Репозиторий проекта" + + Страница предоставлена %s + Вернуться на главную + Поделиться на площадке + Избранное + Закладка + Обновить + Наверх + Блокировка страниц + Выйти + Используйте пробел для разделения ключевых слов + Пожалуйста, введите URL + О нас + Проверить обновления + Официальный сайт + Содержимое сайта + Репозиторий проекта + Подать заявку на бета-тест + Это приложение разработано Goweii + Кодовое слово Wan + Об авторе + Добро пожаловать + Мои баллы + Таблица лидеров + Что-то пошло не так + Скопировать логи + Закрыть + Перезагрузить + Мои публикации + Проекты с открытым исходным кодом + Мои закладки + Очистить + Нет разрешения на камеру + Нажмите, чтобы попробовать снова + Вернуться к сканированию + Настройки + Тема + Следовать системе + Светлая тема + Темная тема + Напоминания о закладках + Уведомлять о новых закладках при запуске приложения + Показать карусель + Показывать карусель на главной странице + Показать закрепленные + Показывать закрепленные статьи на главной + Личные данные + Wan ID + Имя пользователя + Баллы: + Рейтинг: + Домен + например: www.wanandroid.com + Отмена + ОК + Открыть ссылку + Понятно + Сохранить + Распознать QR-код на изображении + Пожалуйста, введите + Я еще не придумал, что делать с этим кодовым словом. Как ты его нашел? + Игнорировать + Двойной клик для добавления статьи в избранное + Долгое нажатие для увеличения изображения + Скопировать ссылку + Открыть в браузере + Кодовое слово на сайте + Выберите способ поделиться + Длинное изображение + QR-код + Учебники + Главная + Зарегистрироваться + Войти + Уровень: + Мои коллекции + Вопросы и ответы + Новое + Закреплено + Удалить + Мое + Долгое нажатие на кнопку "Назад" — сюрприз! + Поделиться + Открыть + Список статей + Система знаний + История чтения + Долгое нажатие для настройки списка блокировки + Не блокировать + Очистить кэш + Политика конфиденциальности + Выйти из аккаунта + Поделиться статьей + Заголовок статьи + Обновить заголовок + До 100 символов + Ссылка на статью + например: https://www.wanandroid.com/blog/show/2577 + 1. Можно делиться любыми хорошими статьями, не обязательно авторскими! Публикации попадают во вкладку "Площадка";\n2. CSDN, Juejin, JianShu и другие официальные блоги проходят без модерации;\n3. Другие сайты проходят модерацию. Не отправляйте невалидные ссылки, это может повлиять на ваш аккаунт;\n4. Если вы нашли ошибку, отправьте лог, чтобы мы сделали сайт лучше.\n5. Сайт поддерживается одним человеком, модерация обычно в течение 24 часов, но иногда может быть задержка. + Сгенерировано клиентом WanAndroid + Сохранить в альбом + Поделиться сейчас + Заголовок сайта + Загрузка + Согласен + Выйти из приложения + Купите ему кофе~ + Войти + Регистрация + Популярные запросы + История поиска + Готово + Площадка + Тот, кто не верит в себя, не достоин усилий + JianShu + Группа QQ + О, приложение классное!\nУгостить тебя кофе? + Проведите вверх + Нажмите, чтобы сохранить в альбом + Сканируйте для загрузки и установки + Ничего нет~ + Опять что-то не так~ + Изучено %d\% + Регистрация Баллы %s + Редактировать + Подсказка + Ссылки на сайт + Не изучено + Изучено + Скопировано + Перетащите в учебник + Очистить историю поиска? + Не бета-пользователь + Включить вход по биометрии + Войти с помощью биометрии + Пожалуйста, угостите разработчика кофе!\nЭто полностью бесплатное приложение!\nТакое классное и бесплатное приложение!\nТакое красивое, удобное и бесплатное приложение!\nНе угостите меня кофе для бодрости?\nУ меня почти не осталось сил поддерживать проект! + Угостить + Пожалуйста, войдите + Активация успешна, вступит в силу после перезапуска + Недействительный код активации + Вы нашли код активации!\nКод привязан к текущему аккаунту, при смене устройства или аккаунта потребуется повторная активация. После активации реклама будет отключена. Активировать сейчас? + Активировать + Войдите, чтобы использовать эту функцию + Эта функция доступна только для аккаунтов разработчиков + [Кодовое слово Wan] Это код активации, только для определенных аккаунтов + Откройте лучший клиент WanAndroid для активации + ###Генерация кода активации###\n\n!!! ВНИМАНИЕ !!!\n\nТолько для разработчиков + [Кодовое слово Wan] Ваш друг поделился ссылкой, откройте лучший клиент WanAndroid для просмотра + Копировать + Обновить + Вы нашли загадочное кодовое слово!\nК сожалению, текущая версия не поддерживает его. Обновите приложение в настройках и попробуйте снова! + Вы нашли загадочного пользователя!\nХотите посмотреть его профиль? + Перейти на главную + [Кодовое слово Wan] Ваш друг поделился загадочным пользователем, откройте лучший клиент WanAndroid для просмотра + Вы нашли ссылку на страницу!\nХотите открыть? + Вы нашли номер QQ!\n%s\nОткрыть QQ и добавить в друзья? + Добавить в друзья + [Кодовое слово Wan] Ваш друг заказал двойной кофе, откройте лучший клиент WanAndroid для получения + Только белый список + Блокировать черный список + Пожалуйста, введите имя пользователя + Пожалуйста, введите email + Пожалуйста, введите пароль + Потяните вниз для обновления + Обновление... + Отпустите для обновления + Обновление завершено + Не удалось обновить + Готово + Для сканирования QR-кода требуется разрешение на камеру + Нажмите для запроса + Сохранено успешно + Не удалось сохранить + Не удалось получить разрешение + Загружено успешно + Не удалось загрузить + Загрузка (%d\%) + В избранном + Аноним + Добавлено в закладки + Не удалось добавить в закладки + Удалено из закладок + Не удалось удалить из закладок + Нет + Появление + Масштаб + Снизу + Слева + Справа + Долгое нажатие на "Назад" — больше быстрых меню + Далее + Двойной клик для быстрого добавления в избранное + Долгое нажатие для предпросмотра изображения + Продолжить чтение? + Без разрешения на камеру невозможно сканировать + Запросить снова + Разрешение на камеру отклонено + Перейти к настройкам + Не удалось получить разрешение на камеру + Нажмите, чтобы получить + Для выбора изображения требуется разрешение на хранилище + Без разрешения на хранилище невозможно выбрать изображение + Разрешение на хранилище отклонено + QR-код не распознан + Не удалось открыть изображение + Система + Навигация + Вопросы и ответы + Для доступа к бета-обновлениям присоединяйтесь к группе (см. "Об авторе") и укажите свой Wan ID (см. профиль).\n\nПримечание: для бета-обновлений требуется вход и последняя версия приложения + Обнаружена новая версия %s + Обнаружена бета-версия %s + Установлена последняя версия + %s(%d) + Новые сообщения + История сообщений + Быстрый вход включен + Быстрый вход выполнен + Не удалось выполнить быстрый вход, используйте пароль + Включить быстрый вход? + Пока не включать + Быстрый вход + Вход по паролю + Убедитесь, что пароли совпадают + Статья + Сайт + Белый список + Черный список + Удалить все? + Ссылка пуста + Не удалось удалить + Очистить кэш? + Выйти из аккаунта? + \ No newline at end of file From d38aee392978d8e3bf019e88fd59406be81b3560 Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 17:50:38 +0800 Subject: [PATCH 05/30] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8Drtl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_about.xml | 32 +++---- app/src/main/res/layout/activity_article.xml | 8 +- app/src/main/res/layout/activity_auth.xml | 8 +- app/src/main/res/layout/activity_setting.xml | 86 +++++++++---------- .../res/layout/activity_share_article.xml | 8 +- .../main/res/layout/activity_user_info.xml | 16 ++-- app/src/main/res/layout/dialog_add_host.xml | 4 +- .../main/res/layout/dialog_article_share.xml | 8 +- .../main/res/layout/dialog_copied_link.xml | 6 +- app/src/main/res/layout/dialog_download.xml | 20 ++--- .../res/layout/dialog_edit_collect_link.xml | 4 +- app/src/main/res/layout/dialog_guide_btn.xml | 4 +- app/src/main/res/layout/dialog_info_edit.xml | 4 +- app/src/main/res/layout/dialog_password.xml | 8 +- .../layout/dialog_read_later_notification.xml | 4 +- app/src/main/res/layout/dialog_web.xml | 12 +-- app/src/main/res/layout/dialog_web_guide.xml | 12 +-- .../main/res/layout/dialog_web_vp_item.xml | 4 +- app/src/main/res/layout/fragment_login.xml | 16 ++-- app/src/main/res/layout/fragment_mine.xml | 68 +++++++-------- app/src/main/res/layout/fragment_register.xml | 20 ++--- .../res/layout/fragment_search_history.xml | 20 ++--- .../main/res/layout/layout_about_me_info.xml | 40 ++++----- .../res/layout/layout_about_me_sponsor.xml | 4 +- .../layout/layout_article_qrcode_share.xml | 8 +- .../res/layout/layout_brvah_load_more.xml | 2 +- app/src/main/res/layout/rv_item_article.xml | 22 ++--- app/src/main/res/layout/rv_item_bookmark.xml | 8 +- app/src/main/res/layout/rv_item_coin_rank.xml | 6 +- .../main/res/layout/rv_item_coin_record.xml | 2 +- .../res/layout/rv_item_collection_link.xml | 26 +++--- .../res/layout/rv_item_host_interrupt.xml | 10 +-- .../layout/rv_item_host_interrupt_footer.xml | 4 +- app/src/main/res/layout/rv_item_knowledge.xml | 8 +- .../res/layout/rv_item_knowledge_child.xml | 4 +- .../res/layout/rv_item_message_readed.xml | 6 +- .../res/layout/rv_item_message_unread.xml | 8 +- .../res/layout/rv_item_mine_share_article.xml | 6 +- .../main/res/layout/rv_item_read_later.xml | 20 ++--- .../main/res/layout/rv_item_read_record.xml | 20 ++--- .../res/layout/rv_item_search_history.xml | 4 +- .../main/res/layout/rv_item_search_hot.xml | 4 +- app/src/main/res/values/styles.xml | 6 +- .../res/layout/basic_ui_dialog_download.xml | 6 +- .../res/layout/basic_ui_dialog_permission.xml | 16 ++-- .../main/res/layout/basic_ui_dialog_tip.xml | 4 +- .../res/layout/basic_ui_dialog_update.xml | 6 +- .../src/main/res/layout/basic_ui_toast.xml | 4 +- 48 files changed, 313 insertions(+), 313 deletions(-) diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index c3fd899b..1f9fb568 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -57,13 +57,13 @@ android:background="@drawable/bg_press_color_surface" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> @@ -59,9 +59,9 @@ android:id="@+id/iv_footer_image" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/margin_def" + android:layout_marginStart="@dimen/margin_def" android:layout_marginTop="@dimen/margin_small" - android:layout_marginRight="@dimen/margin_def" + android:layout_marginEnd="@dimen/margin_def" android:layout_marginBottom="@dimen/margin_small" android:adjustViewBounds="true" android:background="?colorSurfaceMask" diff --git a/app/src/main/res/layout/activity_auth.xml b/app/src/main/res/layout/activity_auth.xml index e594739c..7215dadd 100644 --- a/app/src/main/res/layout/activity_auth.xml +++ b/app/src/main/res/layout/activity_auth.xml @@ -16,9 +16,9 @@ android:id="@+id/iv_circle_1" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginLeft="-170dp" + android:layout_marginStart="-170dp" android:layout_marginTop="170dp" - android:layout_marginRight="-170dp" + android:layout_marginEnd="-170dp" android:alpha="0.8" android:background="@drawable/bg_solid_round_color_surface_radius_max" app:layout_parallaxDeviationX="-40dp" @@ -30,9 +30,9 @@ android:id="@+id/iv_circle_2" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginLeft="-170dp" + android:layout_marginStart="-170dp" android:layout_marginTop="170dp" - android:layout_marginRight="-170dp" + android:layout_marginEnd="-170dp" android:alpha="0.8" android:background="@drawable/bg_solid_round_color_surface_radius_max" app:layout_parallaxDeviationX="40dp" diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 387b501a..7b33b214 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -35,13 +35,13 @@ android:background="@drawable/bg_press_color_surface" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> @@ -104,7 +104,7 @@ android:id="@+id/sc_show_read_later_notification" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" /> @@ -113,9 +113,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_press_color_surface" - android:paddingLeft="16dp" + android:paddingStart="16dp" android:paddingTop="14dp" - android:paddingRight="16dp" + android:paddingEnd="16dp" android:paddingBottom="14dp"> @@ -144,7 +144,7 @@ android:id="@+id/sc_show_banner" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" /> @@ -153,9 +153,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_press_color_surface" - android:paddingLeft="16dp" + android:paddingStart="16dp" android:paddingTop="14dp" - android:paddingRight="16dp" + android:paddingEnd="16dp" android:paddingBottom="14dp"> @@ -184,7 +184,7 @@ android:id="@+id/sc_show_top" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" /> @@ -195,9 +195,9 @@ android:layout_height="wrap_content" android:background="@drawable/bg_press_color_surface" android:orientation="horizontal" - android:paddingLeft="16dp" + android:paddingStart="16dp" android:paddingTop="14dp" - android:paddingRight="16dp" + android:paddingEnd="16dp" android:paddingBottom="14dp"> @@ -226,8 +226,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginRight="5dp" - android:layout_toLeftOf="@+id/iv_intercept_host_next" + android:layout_marginEnd="5dp" + android:layout_toStartOf="@+id/iv_intercept_host_next" android:singleLine="true" android:text="" android:textColor="?colorTextThird" @@ -238,7 +238,7 @@ android:id="@+id/iv_intercept_host_next" android:layout_width="16dp" android:layout_height="16dp" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:scaleType="fitCenter" android:src="@drawable/ic_enter" @@ -254,13 +254,13 @@ android:background="@drawable/bg_press_color_surface" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> @@ -70,7 +70,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/tv_link" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:text="@string/open_the_link" android:textColor="?colorTextMain" android:textSize="@dimen/text_notes" /> @@ -96,8 +96,8 @@ android:id="@+id/tv_share" style="@style/ButtonMain" android:layout_marginTop="@dimen/margin_def" - android:layout_marginLeft="@dimen/margin_big" - android:layout_marginRight="@dimen/margin_big" + android:layout_marginStart="@dimen/margin_big" + android:layout_marginEnd="@dimen/margin_big" android:text="@string/share" /> diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index 5d4ae1d7..72c87557 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -63,8 +63,8 @@ android:background="@drawable/bg_press_color_surface" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> diff --git a/app/src/main/res/layout/dialog_article_share.xml b/app/src/main/res/layout/dialog_article_share.xml index db2f3901..e77ecb91 100644 --- a/app/src/main/res/layout/dialog_article_share.xml +++ b/app/src/main/res/layout/dialog_article_share.xml @@ -113,9 +113,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/dialog_article_share_ll_article" - android:paddingLeft="@dimen/margin_def" + android:paddingStart="@dimen/margin_def" android:paddingTop="@dimen/margin_thin" - android:paddingRight="@dimen/margin_def" + android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin"> diff --git a/app/src/main/res/layout/dialog_copied_link.xml b/app/src/main/res/layout/dialog_copied_link.xml index b536f3d4..318a65d2 100644 --- a/app/src/main/res/layout/dialog_copied_link.xml +++ b/app/src/main/res/layout/dialog_copied_link.xml @@ -32,9 +32,9 @@ android:id="@+id/dialog_copied_link_tv_open" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/margin_small" + android:layout_marginStart="@dimen/margin_small" android:layout_marginTop="@dimen/margin_def" - android:layout_toRightOf="@+id/dialog_copied_link_iv_close" + android:layout_toEndOf="@+id/dialog_copied_link_iv_close" android:text="@string/open_the_link" android:textColor="?colorTextOnMain" android:textSize="@dimen/text_content" /> @@ -44,7 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/dialog_copied_link_tv_open" - android:layout_alignLeft="@+id/dialog_copied_link_tv_open" + android:layout_alignStart="@+id/dialog_copied_link_tv_open" android:layout_marginBottom="@dimen/margin_def" android:maxWidth="200dp" android:textColor="?colorTextOnMain" diff --git a/app/src/main/res/layout/dialog_download.xml b/app/src/main/res/layout/dialog_download.xml index 7c2004b1..fb31ce34 100644 --- a/app/src/main/res/layout/dialog_download.xml +++ b/app/src/main/res/layout/dialog_download.xml @@ -10,7 +10,7 @@ @@ -35,9 +35,9 @@ android:layout_width="match_parent" android:layout_height="15dp" android:layout_below="@+id/tv_dialog_download_state" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="15dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:max="100" android:progress="0" android:progressDrawable="@drawable/basic_ui_dialog_download_progress_bg" @@ -47,9 +47,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/pb_dialog_download" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="15dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:layout_marginBottom="15dp"> diff --git a/app/src/main/res/layout/dialog_edit_collect_link.xml b/app/src/main/res/layout/dialog_edit_collect_link.xml index 24be818e..a70bd329 100644 --- a/app/src/main/res/layout/dialog_edit_collect_link.xml +++ b/app/src/main/res/layout/dialog_edit_collect_link.xml @@ -16,9 +16,9 @@ diff --git a/app/src/main/res/layout/dialog_guide_btn.xml b/app/src/main/res/layout/dialog_guide_btn.xml index 49d11acf..48c4651e 100644 --- a/app/src/main/res/layout/dialog_guide_btn.xml +++ b/app/src/main/res/layout/dialog_guide_btn.xml @@ -16,8 +16,8 @@ style="@style/ButtonMain" android:layout_width="wrap_content" android:layout_centerHorizontal="true" - android:paddingLeft="50dp" - android:paddingRight="50dp" + android:paddingStart="50dp" + android:paddingEnd="50dp" android:text="@string/i_know" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_info_edit.xml b/app/src/main/res/layout/dialog_info_edit.xml index a1455cc8..c95bca1d 100644 --- a/app/src/main/res/layout/dialog_info_edit.xml +++ b/app/src/main/res/layout/dialog_info_edit.xml @@ -15,9 +15,9 @@ diff --git a/app/src/main/res/layout/dialog_password.xml b/app/src/main/res/layout/dialog_password.xml index 9fc1c5e9..27cb7de8 100644 --- a/app/src/main/res/layout/dialog_password.xml +++ b/app/src/main/res/layout/dialog_password.xml @@ -66,15 +66,15 @@ diff --git a/app/src/main/res/layout/dialog_read_later_notification.xml b/app/src/main/res/layout/dialog_read_later_notification.xml index 7ce0cfce..f0a04a86 100644 --- a/app/src/main/res/layout/dialog_read_later_notification.xml +++ b/app/src/main/res/layout/dialog_read_later_notification.xml @@ -26,9 +26,9 @@ android:layout_height="wrap_content" android:background="@drawable/bg_notification" android:orientation="vertical" - android:paddingLeft="15dp" + android:paddingStart="15dp" android:paddingTop="15dp" - android:paddingRight="15dp" + android:paddingEnd="15dp" android:paddingBottom="15dp"> @@ -27,8 +27,8 @@ android:id="@+id/dialog_web_iv_read_later" android:layout_width="44dp" android:layout_height="44dp" - android:layout_marginRight="@dimen/margin_middle" - android:layout_toLeftOf="@+id/dialog_web_iv_close" + android:layout_marginEnd="@dimen/margin_middle" + android:layout_toStartOf="@+id/dialog_web_iv_close" android:padding="13dp" android:src="@drawable/ic_read_later_added" android:tint="?colorOnMainOrSurface" @@ -49,8 +49,8 @@ android:id="@+id/dialog_web_cv_collect" android:layout_width="44dp" android:layout_height="44dp" - android:layout_marginLeft="@dimen/margin_middle" - android:layout_toRightOf="@+id/dialog_web_iv_close" + android:layout_marginStart="@dimen/margin_middle" + android:layout_toEndOf="@+id/dialog_web_iv_close" android:padding="12dp" /> diff --git a/app/src/main/res/layout/dialog_web_guide.xml b/app/src/main/res/layout/dialog_web_guide.xml index e9789c06..5e18f68f 100644 --- a/app/src/main/res/layout/dialog_web_guide.xml +++ b/app/src/main/res/layout/dialog_web_guide.xml @@ -33,9 +33,9 @@ android:id="@+id/dialog_web_guide_iv_2" android:layout_width="30dp" android:layout_height="30dp" - android:layout_alignLeft="@+id/dialog_web_guide_iv_1" + android:layout_alignStart="@+id/dialog_web_guide_iv_1" android:layout_alignTop="@+id/dialog_web_guide_iv_1" - android:layout_marginLeft="5dp" + android:layout_marginStart="5dp" android:layout_marginTop="5dp" android:alpha="0.7" android:src="@drawable/bg_solid_round_color_main_radius_max" /> @@ -46,7 +46,7 @@ android:id="@+id/dialog_web_guide_tv_double_click" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="left" + android:layout_gravity="start" android:layout_below="@+id/dialog_web_guide_iv_2" android:layout_centerHorizontal="true" android:text="@string/double_click_anywhere_to_favorite_an_article" @@ -57,7 +57,7 @@ android:id="@+id/dialog_web_guide_tv_long_click_img" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="left" + android:layout_gravity="start" android:layout_below="@+id/dialog_web_guide_tv_double_click" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/margin_common" @@ -74,8 +74,8 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="@dimen/margin_def" - android:paddingLeft="50dp" - android:paddingRight="50dp" + android:paddingStart="50dp" + android:paddingEnd="50dp" android:text="@string/i_know" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_web_vp_item.xml b/app/src/main/res/layout/dialog_web_vp_item.xml index d04bb707..a76f3e0e 100644 --- a/app/src/main/res/layout/dialog_web_vp_item.xml +++ b/app/src/main/res/layout/dialog_web_vp_item.xml @@ -11,8 +11,8 @@ android:layout_height="match_parent" android:layout_marginTop="76dp" android:layout_marginBottom="76dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" app:cardBackgroundColor="?colorSurface" app:cardCornerRadius="@dimen/round_radius" app:cardElevation="0dp" diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index 681e1a7a..bb884dec 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -27,8 +27,8 @@ @@ -48,26 +48,26 @@ android:id="@+id/piv_login_account" android:layout_width="match_parent" android:layout_height="44dp" - android:layout_marginLeft="60dp" + android:layout_marginStart="60dp" android:layout_marginTop="100dp" - android:layout_marginRight="60dp" /> + android:layout_marginEnd="60dp" /> + android:layout_marginEnd="60dp" /> diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 2e95eefd..0688f07e 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -137,8 +137,8 @@ android:background="@drawable/bg_press_color_surface" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> @@ -48,35 +48,35 @@ android:id="@+id/piv_register_account" android:layout_width="match_parent" android:layout_height="44dp" - android:layout_marginLeft="60dp" + android:layout_marginStart="60dp" android:layout_marginTop="100dp" - android:layout_marginRight="60dp" /> + android:layout_marginEnd="60dp" /> + android:layout_marginEnd="60dp" /> + android:layout_marginEnd="60dp" /> @@ -54,8 +54,8 @@ android:id="@+id/tv_down" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical|right" - android:layout_marginRight="16dp" + android:layout_gravity="center_vertical|end" + android:layout_marginEnd="16dp" android:text="@string/complete" android:visibility="gone" tools:visibility="visible" @@ -66,8 +66,8 @@ android:id="@+id/tv_clean" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical|right" - android:layout_marginRight="16dp" + android:layout_gravity="center_vertical|end" + android:layout_marginEnd="16dp" android:text="@string/clear" android:textColor="?colorThird" android:textSize="@dimen/text_notes" /> @@ -80,8 +80,8 @@ android:layout_height="match_parent" android:layout_marginTop="5dp" android:overScrollMode="never" - android:paddingLeft="11dp" - android:paddingRight="11dp" + android:paddingStart="11dp" + android:paddingEnd="11dp" android:scrollbars="none" tools:itemCount="9" tools:layoutManager="GridLayoutManager" diff --git a/app/src/main/res/layout/layout_about_me_info.xml b/app/src/main/res/layout/layout_about_me_info.xml index 5ffdb4e1..bfd175de 100644 --- a/app/src/main/res/layout/layout_about_me_info.xml +++ b/app/src/main/res/layout/layout_about_me_info.xml @@ -36,8 +36,8 @@ android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:gravity="center" - android:paddingLeft="30dp" - android:paddingRight="30dp" + android:paddingStart="30dp" + android:paddingEnd="30dp" android:text="@string/my_signature" android:textColor="?colorOnMainOrSurface" android:textSize="@dimen/text_auxiliary" /> @@ -57,8 +57,8 @@ android:background="@drawable/bg_press_color_transparent" android:gravity="center" android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> diff --git a/app/src/main/res/layout/layout_article_qrcode_share.xml b/app/src/main/res/layout/layout_article_qrcode_share.xml index 5ccc94d5..0d1ab24f 100644 --- a/app/src/main/res/layout/layout_article_qrcode_share.xml +++ b/app/src/main/res/layout/layout_article_qrcode_share.xml @@ -83,9 +83,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/dialog_qrcode_share_ll_article" - android:paddingLeft="@dimen/margin_def" + android:paddingStart="@dimen/margin_def" android:paddingTop="@dimen/margin_thin" - android:paddingRight="@dimen/margin_def" + android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_thin"> diff --git a/app/src/main/res/layout/layout_brvah_load_more.xml b/app/src/main/res/layout/layout_brvah_load_more.xml index 6beb238f..87effc3b 100644 --- a/app/src/main/res/layout/layout_brvah_load_more.xml +++ b/app/src/main/res/layout/layout_brvah_load_more.xml @@ -15,7 +15,7 @@ style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginRight="@dimen/margin_thin" /> + android:layout_marginEnd="@dimen/margin_thin" /> @@ -40,7 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_toRightOf="@+id/ll_new" + android:layout_toEndOf="@+id/ll_new" android:textColor="@color/selector_text_color_article_author" android:textSize="@dimen/text_notes" tools:text="@tools:sample/full_names" /> @@ -52,12 +52,12 @@ android:layout_alignTop="@+id/tv_author" android:layout_alignBottom="@+id/tv_author" android:layout_centerVertical="true" - android:layout_marginLeft="5dp" - android:layout_toRightOf="@+id/tv_author" + android:layout_marginStart="5dp" + android:layout_toEndOf="@+id/tv_author" android:background="@drawable/selector_article_tag_bg" android:gravity="center" - android:paddingLeft="3dp" - android:paddingRight="3dp" + android:paddingStart="3dp" + android:paddingEnd="3dp" android:textColor="@color/selector_text_color_article_tag" android:textSize="@dimen/text_time" tools:text="TAG" /> @@ -68,7 +68,7 @@ android:layout_height="0dp" android:layout_alignTop="@+id/tv_author" android:layout_alignBottom="@+id/tv_author" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" @@ -88,7 +88,7 @@ android:id="@+id/iv_img" android:layout_width="120dp" android:layout_height="80dp" - android:layout_marginRight="10dp" + android:layout_marginEnd="10dp" android:background="?colorBackground" android:scaleType="centerCrop" android:visibility="gone" @@ -149,7 +149,7 @@ android:id="@+id/tv_top" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginRight="5dp" + android:layout_marginEnd="5dp" android:text="@string/tag_top" android:textColor="?colorTextAccent" android:textSize="@dimen/text_notes" /> @@ -161,7 +161,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll_middle" - android:layout_toRightOf="@+id/ll_top" + android:layout_toEndOf="@+id/ll_top" android:layout_marginTop="10dp" android:orientation="horizontal"> @@ -181,6 +181,6 @@ android:layout_height="20dp" tools:rl_checked="false" android:layout_alignBottom="@+id/ll_chapter" - android:layout_alignParentRight="true" /> + android:layout_alignParentEnd="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_bookmark.xml b/app/src/main/res/layout/rv_item_bookmark.xml index f14a92d6..295a8b13 100644 --- a/app/src/main/res/layout/rv_item_bookmark.xml +++ b/app/src/main/res/layout/rv_item_bookmark.xml @@ -24,8 +24,8 @@ android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:text="@tools:sample/lorem/random" /> @@ -35,9 +35,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="5dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:ellipsize="end" android:singleLine="true" android:textColor="?colorTextSecond" diff --git a/app/src/main/res/layout/rv_item_coin_rank.xml b/app/src/main/res/layout/rv_item_coin_rank.xml index ecf55026..9caef4f6 100644 --- a/app/src/main/res/layout/rv_item_coin_rank.xml +++ b/app/src/main/res/layout/rv_item_coin_rank.xml @@ -53,8 +53,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginLeft="10dp" - android:layout_toRightOf="@+id/fl_index" + android:layout_marginStart="10dp" + android:layout_toEndOf="@+id/fl_index" android:includeFontPadding="false" android:lineSpacingExtra="0dp" android:textColor="?colorTextSurface" @@ -65,7 +65,7 @@ android:id="@+id/tv_coin_count" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:includeFontPadding="false" android:textColor="?colorTextMain" diff --git a/app/src/main/res/layout/rv_item_coin_record.xml b/app/src/main/res/layout/rv_item_coin_record.xml index 30b30a10..3922ac92 100644 --- a/app/src/main/res/layout/rv_item_coin_record.xml +++ b/app/src/main/res/layout/rv_item_coin_record.xml @@ -12,7 +12,7 @@ android:layout_height="wrap_content" android:includeFontPadding="false" android:layout_centerVertical="true" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:textColor="?colorTextMain" android:textSize="@dimen/text_content" tools:text="+31" /> diff --git a/app/src/main/res/layout/rv_item_collection_link.xml b/app/src/main/res/layout/rv_item_collection_link.xml index dd785b7f..93cb5965 100644 --- a/app/src/main/res/layout/rv_item_collection_link.xml +++ b/app/src/main/res/layout/rv_item_collection_link.xml @@ -11,7 +11,7 @@ @@ -32,8 +32,8 @@ android:layout_height="match_parent" android:background="?colorAssist" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -44,8 +44,8 @@ android:layout_height="match_parent" android:background="?colorMain" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/edit" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -56,8 +56,8 @@ android:layout_height="match_parent" android:background="?colorStriking" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -77,8 +77,8 @@ android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:text="@tools:sample/lorem/random" /> @@ -88,9 +88,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="5dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:ellipsize="end" android:singleLine="true" android:textColor="?colorTextSecond" diff --git a/app/src/main/res/layout/rv_item_host_interrupt.xml b/app/src/main/res/layout/rv_item_host_interrupt.xml index e34f1825..22b2f077 100644 --- a/app/src/main/res/layout/rv_item_host_interrupt.xml +++ b/app/src/main/res/layout/rv_item_host_interrupt.xml @@ -4,8 +4,8 @@ android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/bg_press_color_surface" - android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> + android:paddingStart="16dp" + android:paddingEnd="16dp"> @@ -22,9 +22,9 @@ android:id="@+id/fbl" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="11dp" + android:layout_marginStart="11dp" android:layout_marginTop="5dp" - android:layout_marginRight="11dp" + android:layout_marginEnd="11dp" android:layout_marginBottom="11dp" app:flexWrap="wrap" /> diff --git a/app/src/main/res/layout/rv_item_knowledge_child.xml b/app/src/main/res/layout/rv_item_knowledge_child.xml index 622f9870..d37786a1 100644 --- a/app/src/main/res/layout/rv_item_knowledge_child.xml +++ b/app/src/main/res/layout/rv_item_knowledge_child.xml @@ -6,9 +6,9 @@ android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@drawable/bg_press_color_surface_top_radius_max" - android:paddingLeft="15dp" + android:paddingStart="15dp" android:paddingTop="5dp" - android:paddingRight="15dp" + android:paddingEnd="15dp" android:paddingBottom="5dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_auxiliary" diff --git a/app/src/main/res/layout/rv_item_message_readed.xml b/app/src/main/res/layout/rv_item_message_readed.xml index c495c1dc..9f458c39 100644 --- a/app/src/main/res/layout/rv_item_message_readed.xml +++ b/app/src/main/res/layout/rv_item_message_readed.xml @@ -10,7 +10,7 @@ diff --git a/app/src/main/res/layout/rv_item_message_unread.xml b/app/src/main/res/layout/rv_item_message_unread.xml index f9129204..e326b573 100644 --- a/app/src/main/res/layout/rv_item_message_unread.xml +++ b/app/src/main/res/layout/rv_item_message_unread.xml @@ -24,8 +24,8 @@ android:layout_marginEnd="5dp" android:background="@drawable/article_tag_bg" android:gravity="center" - android:paddingLeft="3dp" - android:paddingRight="3dp" + android:paddingStart="3dp" + android:paddingEnd="3dp" android:textColor="?colorTextMain" android:textSize="@dimen/text_time" tools:text="@string/tag_new" /> @@ -35,7 +35,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_toRightOf="@+id/tv_tag" + android:layout_toEndOf="@+id/tv_tag" android:textColor="?colorTextSecond" android:textSize="@dimen/text_notes" tools:text="@tools:sample/full_names" /> @@ -46,7 +46,7 @@ android:layout_height="0dp" android:layout_alignTop="@+id/tv_user" android:layout_alignBottom="@+id/tv_user" - android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" diff --git a/app/src/main/res/layout/rv_item_mine_share_article.xml b/app/src/main/res/layout/rv_item_mine_share_article.xml index b7bc0b0f..675955fd 100644 --- a/app/src/main/res/layout/rv_item_mine_share_article.xml +++ b/app/src/main/res/layout/rv_item_mine_share_article.xml @@ -10,7 +10,7 @@ diff --git a/app/src/main/res/layout/rv_item_read_later.xml b/app/src/main/res/layout/rv_item_read_later.xml index eb982872..100adb2e 100644 --- a/app/src/main/res/layout/rv_item_read_later.xml +++ b/app/src/main/res/layout/rv_item_read_later.xml @@ -19,8 +19,8 @@ android:layout_height="match_parent" android:background="?colorThird" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/copy_the_link" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -31,8 +31,8 @@ android:layout_height="match_parent" android:background="?colorAssist" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -43,8 +43,8 @@ android:layout_height="match_parent" android:background="?colorStriking" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -63,8 +63,8 @@ android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:text="@tools:sample/lorem/random" /> @@ -74,9 +74,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="5dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:ellipsize="end" android:singleLine="true" android:textColor="?colorTextSecond" diff --git a/app/src/main/res/layout/rv_item_read_record.xml b/app/src/main/res/layout/rv_item_read_record.xml index eb982872..100adb2e 100644 --- a/app/src/main/res/layout/rv_item_read_record.xml +++ b/app/src/main/res/layout/rv_item_read_record.xml @@ -19,8 +19,8 @@ android:layout_height="match_parent" android:background="?colorThird" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/copy_the_link" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -31,8 +31,8 @@ android:layout_height="match_parent" android:background="?colorAssist" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/open_it_in_a_browser" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -43,8 +43,8 @@ android:layout_height="match_parent" android:background="?colorStriking" android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:text="@string/delete" android:textColor="?colorTextInvert" android:textSize="@dimen/text_content" /> @@ -63,8 +63,8 @@ android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:textColor="?colorTextSurface" android:textSize="@dimen/text_content" tools:text="@tools:sample/lorem/random" /> @@ -74,9 +74,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="5dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:ellipsize="end" android:singleLine="true" android:textColor="?colorTextSecond" diff --git a/app/src/main/res/layout/rv_item_search_history.xml b/app/src/main/res/layout/rv_item_search_history.xml index 2118df1c..bc0d8c44 100644 --- a/app/src/main/res/layout/rv_item_search_history.xml +++ b/app/src/main/res/layout/rv_item_search_history.xml @@ -10,12 +10,12 @@ android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@drawable/bg_press_color_foreground_top_radius_max" - android:paddingLeft="15dp" + android:paddingStart="15dp" android:paddingTop="5dp" android:lines="1" android:maxLines="1" android:ellipsize="end" - android:paddingRight="15dp" + android:paddingEnd="15dp" android:paddingBottom="5dp" android:textColor="?colorTextThird" android:textSize="@dimen/text_auxiliary" diff --git a/app/src/main/res/layout/rv_item_search_hot.xml b/app/src/main/res/layout/rv_item_search_hot.xml index 1d6f0af1..f65335b1 100644 --- a/app/src/main/res/layout/rv_item_search_hot.xml +++ b/app/src/main/res/layout/rv_item_search_hot.xml @@ -9,9 +9,9 @@ android:ellipsize="end" android:lines="1" android:maxLines="1" - android:paddingLeft="15dp" + android:paddingStart="15dp" android:paddingTop="5dp" - android:paddingRight="15dp" + android:paddingEnd="15dp" android:paddingBottom="5dp" android:textColor="?colorTextThird" android:textSize="@dimen/text_auxiliary" diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dbfcd22d..f7d2c02d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -54,13 +54,13 @@ ?colorOnMainOrSurface ?colorOnMainOrSurface @dimen/basic_ui_action_bar_icon_padding - @dimen/basic_ui_action_bar_icon_margin - @dimen/basic_ui_action_bar_icon_margin + @dimen/basic_ui_action_bar_icon_margin + @dimen/basic_ui_action_bar_icon_margin diff --git a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml index 01cc7b78..d044cc0f 100644 --- a/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml +++ b/basic_ui/src/main/res/layout/basic_ui_dialog_download.xml @@ -6,9 +6,9 @@ android:layout_margin="@dimen/margin_big" android:background="@drawable/bg_solid_round_color_surface_radius_def" android:orientation="vertical" - android:paddingLeft="@dimen/margin_def" + android:paddingStart="@dimen/margin_def" android:paddingTop="@dimen/margin_def" - android:paddingRight="@dimen/margin_def" + android:paddingEnd="@dimen/margin_def" android:paddingBottom="@dimen/margin_def"> Date: Wed, 18 Jun 2025 19:53:39 +0800 Subject: [PATCH 06/30] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E9=80=89=E6=8B=A9=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 13 +++ .../module/mine/activity/LanguageActivity.kt | 84 ++++++++++++++++++ .../module/mine/activity/SettingActivity.java | 22 +++++ .../module/mine/adapter/LanguageAdapter.java | 51 +++++++++++ app/src/main/res/drawable-xxhdpi/ic_check.png | Bin 0 -> 612 bytes app/src/main/res/layout/activity_language.xml | 21 +++++ app/src/main/res/layout/activity_setting.xml | 41 +++++++++ app/src/main/res/layout/rv_item_language.xml | 41 +++++++++ app/src/main/res/resources.properties | 1 + basic_l10n/src/main/AndroidManifest.xml | 5 +- .../per/goweii/basic/l10n/L10nManager.java | 17 ++++ basic_l10n/src/main/res/values-ar/strings.xml | 2 + basic_l10n/src/main/res/values-es/strings.xml | 2 + basic_l10n/src/main/res/values-fr/strings.xml | 2 + basic_l10n/src/main/res/values-ru/strings.xml | 2 + .../{values-zh => values-zh-rCN}/strings.xml | 2 + basic_l10n/src/main/res/values/strings.xml | 2 + basic_l10n/src/main/res/xml/locale_config.xml | 9 ++ .../java/per/goweii/basic/utils/Utils.java | 8 +- gradle/flavor.gradle | 10 +++ 21 files changed, 333 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt create mode 100644 app/src/main/java/per/goweii/wanandroid/module/mine/adapter/LanguageAdapter.java create mode 100644 app/src/main/res/drawable-xxhdpi/ic_check.png create mode 100644 app/src/main/res/layout/activity_language.xml create mode 100644 app/src/main/res/layout/rv_item_language.xml create mode 100644 app/src/main/res/resources.properties create mode 100644 basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java rename basic_l10n/src/main/res/{values-zh => values-zh-rCN}/strings.xml (99%) create mode 100644 basic_l10n/src/main/res/xml/locale_config.xml diff --git a/app/build.gradle b/app/build.gradle index d8a74903..618e4915 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,6 +19,9 @@ android { } } resourcePrefix "" + androidResources { + generateLocaleConfig true + } applicationVariants.all { variant -> variant.outputs.each { output -> def versionName = variant.versionName diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b32707c8..17003e3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -227,6 +227,10 @@ android:name=".module.book.activity.BookDetailsActivity" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:windowSoftInputMode="adjustResize" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt new file mode 100644 index 00000000..b2ccffbd --- /dev/null +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt @@ -0,0 +1,84 @@ +package per.goweii.wanandroid.module.mine.activity + +import android.content.Context +import android.content.Intent +import android.content.res.XmlResourceParser +import android.view.LayoutInflater +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.recyclerview.widget.LinearLayoutManager +import per.goweii.basic.core.base.BaseActivity +import per.goweii.basic.core.base.BasePresenter +import per.goweii.basic.utils.ResUtils +import per.goweii.wanandroid.R +import per.goweii.wanandroid.databinding.ActivityLanguageBinding +import per.goweii.wanandroid.module.mine.adapter.LanguageAdapter +import java.util.Locale + + +class LanguageActivity : BaseActivity, ActivityLanguageBinding>() { + companion object { + @JvmStatic + fun start(context: Context) { + val intent = Intent(context, LanguageActivity::class.java) + context.startActivity(intent) + } + } + + private var adapter: LanguageAdapter? = null + + override fun initViewBinding(inflater: LayoutInflater): ActivityLanguageBinding { + return ActivityLanguageBinding.inflate(inflater) + } + + override fun initPresenter(): BasePresenter<*>? { + return null + } + + override fun initView() { + adapter = LanguageAdapter() + binding.rv.layoutManager = LinearLayoutManager(this) + binding.rv.adapter = adapter + + adapter?.setOnItemClickListener { _, _, position -> + val locale = adapter?.getItem(position) + val localeListCompat = if (locale != null) { + LocaleListCompat.create(locale) + } else { + LocaleListCompat.getEmptyLocaleList() + } + AppCompatDelegate.setApplicationLocales(localeListCompat) + } + } + + override fun loadData() { + val locales = arrayListOf() + locales.add(null) + locales.addAll(getSupportedLocales()) + adapter?.setNewData(locales) + + } + + private fun getSupportedLocales(): List { + val locales = arrayListOf() + try { + val androidNamespace = "http://schemas.android.com/apk/res/android" + resources.getXml(R.xml.locale_config).use { parser -> + var next = parser.next() + while (next != XmlResourceParser.END_DOCUMENT) { + if (parser.eventType == XmlResourceParser.START_TAG) { + if (parser.name == "locale") { + val name = parser.getAttributeValue(androidNamespace, "name") + locales.add(Locale.forLanguageTag(name)) + } + } + next = parser.next() + } + } + } catch (e: Exception) { + e.printStackTrace() + } + return locales + } + +} \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index e28cdc00..708f6562 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -11,12 +11,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.SwitchCompat; +import androidx.core.app.LocaleManagerCompat; +import androidx.core.os.LocaleListCompat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Locale; +import java.util.Objects; import butterknife.BindView; import butterknife.OnClick; @@ -101,6 +106,7 @@ protected SettingPresenter initPresenter() { @Override protected void initView() { + updateLanguage(); updateThemeModeUI(); mShowTop = SettingUtils.getInstance().isShowTop(); sc_show_top.setChecked(mShowTop); @@ -135,6 +141,18 @@ public void onCheckedChanged(CompoundButton v, boolean isChecked) { } } + private void updateLanguage() { + LocaleListCompat applicationLocales = AppCompatDelegate.getApplicationLocales(); + if (!applicationLocales.isEmpty()) { + Locale locale = applicationLocales.get(0); + Objects.requireNonNull(locale); + String displayName = locale.getDisplayLanguage(); + binding.tvLanguage.setText(displayName); + } else { + binding.tvLanguage.setText(R.string.follow_the_system); + } + } + private void updateThemeModeUI() { final SettingUtils.ThemeMode themeMode = SettingUtils.getInstance().getThemeMode(); switch (themeMode) { @@ -192,6 +210,7 @@ public boolean onLongClick(View v) { @OnClick({ + R.id.ll_language, R.id.rl_intercept_host, R.id.ll_theme_mode, R.id.ll_cache, R.id.ll_about, R.id.ll_privacy_policy, R.id.ll_logout @@ -204,6 +223,9 @@ public void onClick(View v) { @Override protected void onClick2(View v) { switch (v.getId()) { + case R.id.ll_language: + LanguageActivity.start(getContext()); + break; case R.id.ll_theme_mode: final List themeModes = Arrays.asList(SettingUtils.ThemeMode.values()); final List nameList = new ArrayList<>(themeModes.size()); diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/adapter/LanguageAdapter.java b/app/src/main/java/per/goweii/wanandroid/module/mine/adapter/LanguageAdapter.java new file mode 100644 index 00000000..b7ed83e0 --- /dev/null +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/adapter/LanguageAdapter.java @@ -0,0 +1,51 @@ +package per.goweii.wanandroid.module.mine.adapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.app.LocaleManagerCompat; +import androidx.core.os.LocaleListCompat; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; + +import java.util.Locale; + +import per.goweii.wanandroid.R; + +public class LanguageAdapter extends BaseQuickAdapter { + @Nullable + private Locale mAppLocale; + @Nullable + private Locale mSysLocale; + + public LanguageAdapter() { + super(R.layout.rv_item_language); + LocaleListCompat applicationLocales = AppCompatDelegate.getApplicationLocales(); + if (!applicationLocales.isEmpty()) { + mAppLocale = applicationLocales.get(0); + } + LocaleListCompat systemLocales = LocaleManagerCompat.getSystemLocales(mContext); + if (!systemLocales.isEmpty()) { + mSysLocale = systemLocales.get(0); + } + } + + @Override + protected void convert(@NonNull BaseViewHolder helper, @Nullable Locale item) { + if (item == null) { + helper.setText(R.id.tv_title, R.string.follow_the_system); + if (mSysLocale == null) { + helper.setVisible(R.id.tv_subtitle, false); + } else { + helper.setVisible(R.id.tv_subtitle, true); + helper.setText(R.id.tv_subtitle, mSysLocale.getDisplayLanguage(mSysLocale)); + } + helper.setVisible(R.id.iv_checked, mAppLocale == null); + } else { + helper.setText(R.id.tv_title, item.getDisplayLanguage()); + helper.setText(R.id.tv_subtitle, item.getDisplayLanguage(item)); + helper.setVisible(R.id.iv_checked, item.equals(mAppLocale)); + } + } +} diff --git a/app/src/main/res/drawable-xxhdpi/ic_check.png b/app/src/main/res/drawable-xxhdpi/ic_check.png new file mode 100644 index 0000000000000000000000000000000000000000..1785c964ecd3bfdc737c33216fcdad5c16881d21 GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVAA$;s`~Ec>6k&))M?^Ui4oA)SMdZzT7d7B5-- z)vMF=xyQw-sfUEr*&j?&!-LblFf!O!%k|5jfBrf8-!FsNXYF#$X0yjt8@^&#@aJK{ zk7K8$---8s{`to>G_-%uy3{R90hO9z)iX z?nOWL+<%{6`SR!rrUh~TxS!sSW_A;1V0>~^gGph+o(?+(rc>Q3m=!kc$q-4{8g=)_ zzsgMRstMw8jMrY9`YoT#$NYHmwG^YBx8Ih17vuP%qR+K%+R>zsQ|<2+>`!drS5#Wy zUinaZfzjsYcjQZC8EsE%{AuB#cC{8nw5#Zj=n+beDhQ0j@-Zh^+4 za(nqDizbQBWf54>S(Co>m#;>0x#?_aM>2#6AXRtQWz44$rj JF6*2UngFLA2 + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 7b33b214..fcaba38b 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -28,6 +28,47 @@ android:layout_height="wrap_content" android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties new file mode 100644 index 00000000..465ad7e1 --- /dev/null +++ b/app/src/main/res/resources.properties @@ -0,0 +1 @@ +unqualifiedResLocale=zh-CN \ No newline at end of file diff --git a/basic_l10n/src/main/AndroidManifest.xml b/basic_l10n/src/main/AndroidManifest.xml index 69fc4129..1a9db53d 100644 --- a/basic_l10n/src/main/AndroidManifest.xml +++ b/basic_l10n/src/main/AndroidManifest.xml @@ -1,3 +1,6 @@ - + + + \ No newline at end of file diff --git a/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java b/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java new file mode 100644 index 00000000..497e1c3c --- /dev/null +++ b/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java @@ -0,0 +1,17 @@ +package per.goweii.basic.l10n; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.os.LocaleListCompat; + +public class L10nManager { + public static void setApplicationLocales(@Nullable String languageCode) { + LocaleListCompat appLocale; + if (languageCode == null || languageCode.isEmpty()) { + appLocale = LocaleListCompat.getEmptyLocaleList(); + } else { + appLocale = LocaleListCompat.forLanguageTags(languageCode); + } + AppCompatDelegate.setApplicationLocales(appLocale); + } +} diff --git a/basic_l10n/src/main/res/values-ar/strings.xml b/basic_l10n/src/main/res/values-ar/strings.xml index 79b361a4..764c1b75 100644 --- a/basic_l10n/src/main/res/values-ar/strings.xml +++ b/basic_l10n/src/main/res/values-ar/strings.xml @@ -276,4 +276,6 @@ فشل الحذف هل أنت متأكد من مسح ذاكرة التخزين المؤقت؟ هل أنت متأكد من تسجيل الخروج؟ + + اللغة \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-es/strings.xml b/basic_l10n/src/main/res/values-es/strings.xml index 58d6bc8f..cf20ad6f 100644 --- a/basic_l10n/src/main/res/values-es/strings.xml +++ b/basic_l10n/src/main/res/values-es/strings.xml @@ -276,4 +276,6 @@ Error al eliminar ¿Seguro que quieres limpiar la caché? ¿Seguro que quieres cerrar sesión? + + Idioma \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-fr/strings.xml b/basic_l10n/src/main/res/values-fr/strings.xml index 1794f8b1..7bd56f94 100644 --- a/basic_l10n/src/main/res/values-fr/strings.xml +++ b/basic_l10n/src/main/res/values-fr/strings.xml @@ -276,4 +276,6 @@ Échec de la suppression Voulez-vous vider le cache ? Voulez-vous vous déconnecter ? + + Langue \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-ru/strings.xml b/basic_l10n/src/main/res/values-ru/strings.xml index 1bafc8bd..42a15596 100644 --- a/basic_l10n/src/main/res/values-ru/strings.xml +++ b/basic_l10n/src/main/res/values-ru/strings.xml @@ -276,4 +276,6 @@ Не удалось удалить Очистить кэш? Выйти из аккаунта? + + Язык \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-zh/strings.xml b/basic_l10n/src/main/res/values-zh-rCN/strings.xml similarity index 99% rename from basic_l10n/src/main/res/values-zh/strings.xml rename to basic_l10n/src/main/res/values-zh-rCN/strings.xml index 2194d60a..0e8871cd 100644 --- a/basic_l10n/src/main/res/values-zh/strings.xml +++ b/basic_l10n/src/main/res/values-zh-rCN/strings.xml @@ -276,4 +276,6 @@ 删除失败 确定要清除缓存吗? 确定要退出登录吗? + + 语言 \ No newline at end of file diff --git a/basic_l10n/src/main/res/values/strings.xml b/basic_l10n/src/main/res/values/strings.xml index 199a3dac..418bc8e7 100644 --- a/basic_l10n/src/main/res/values/strings.xml +++ b/basic_l10n/src/main/res/values/strings.xml @@ -276,4 +276,6 @@ Deletion failed Are you sure you want to clear cache? Are you sure you want to sign out? + + Language \ No newline at end of file diff --git a/basic_l10n/src/main/res/xml/locale_config.xml b/basic_l10n/src/main/res/xml/locale_config.xml new file mode 100644 index 00000000..96e15206 --- /dev/null +++ b/basic_l10n/src/main/res/xml/locale_config.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java index 56c4f79d..9f38b2ee 100644 --- a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java +++ b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java @@ -78,10 +78,6 @@ public void onActivityResumed(@NonNull Activity activity) { @Override public void onActivityPaused(@NonNull Activity activity) { - if (mResumedActivityRef != null && mResumedActivityRef.get() == activity) { - mResumedActivityRef.clear(); - mResumedActivityRef = null; - } } @Override @@ -94,6 +90,10 @@ public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bun @Override public void onActivityDestroyed(@NonNull Activity activity) { + if (mResumedActivityRef != null && mResumedActivityRef.get() == activity) { + mResumedActivityRef.clear(); + mResumedActivityRef = null; + } } } } diff --git a/gradle/flavor.gradle b/gradle/flavor.gradle index f29be36b..12d938fb 100644 --- a/gradle/flavor.gradle +++ b/gradle/flavor.gradle @@ -77,10 +77,20 @@ android { release { shrinkResources false signingConfig signingConfigs.release + bundle{ + language { + enableSplit = false + } + } } debug { shrinkResources false signingConfig signingConfigs.debug + bundle{ + language { + enableSplit = false + } + } } } flavorDimensions "applicationId" From 836864cf329eda923ceb60bcc3846171e3a852f3 Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 19:57:13 +0800 Subject: [PATCH 07/30] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_setting.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index fcaba38b..f999f308 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -135,7 +135,7 @@ android:layout_below="@+id/tv_show_read_later_notification_title" android:layout_alignParentStart="true" android:layout_marginTop="5dp" - android:layout_marginEnd="80dp" + android:layout_marginEnd="32dp" android:layout_toStartOf="@+id/sc_show_read_later_notification" android:text="@string/bookmark_reminders_desc" android:textColor="?colorTextThird" @@ -175,7 +175,7 @@ android:layout_below="@+id/tv_show_banner_title" android:layout_alignParentStart="true" android:layout_marginTop="5dp" - android:layout_marginEnd="80dp" + android:layout_marginEnd="32dp" android:layout_toStartOf="@+id/sc_show_banner" android:text="@string/show_carousel_desc" android:textColor="?colorTextThird" @@ -215,7 +215,7 @@ android:layout_below="@+id/tv_show_top_title" android:layout_alignParentStart="true" android:layout_marginTop="5dp" - android:layout_marginEnd="80dp" + android:layout_marginEnd="32dp" android:layout_toStartOf="@+id/sc_show_top" android:text="@string/show_pinned_desc" android:textColor="?colorTextThird" @@ -254,10 +254,11 @@ android:id="@+id/tv_intercept_host_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@+id/tv_intercept_host_title" android:layout_alignParentStart="true" + android:layout_below="@+id/tv_intercept_host_title" android:layout_marginTop="5dp" - android:layout_marginEnd="80dp" + android:layout_marginEnd="32dp" + android:layout_toStartOf="@+id/tv_intercept_host" android:text="@string/long_press_to_customize_the_block_list" android:textColor="?colorTextThird" android:textSize="@dimen/text_notes" /> From 1ec22f89b8dba705c4d4a4b40334514bea0d635c Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 20:00:38 +0800 Subject: [PATCH 08/30] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/rv_item_language.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/rv_item_language.xml b/app/src/main/res/layout/rv_item_language.xml index be2e4609..5a0bfb9c 100644 --- a/app/src/main/res/layout/rv_item_language.xml +++ b/app/src/main/res/layout/rv_item_language.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?colorSurface" + android:background="@drawable/bg_press_color_surface" android:padding="16dp"> Date: Wed, 18 Jun 2025 20:06:36 +0800 Subject: [PATCH 09/30] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_l10n/src/main/res/values-ar/strings.xml | 2 +- basic_l10n/src/main/res/values-es/strings.xml | 2 +- basic_l10n/src/main/res/values-fr/strings.xml | 2 +- basic_l10n/src/main/res/values-ru/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basic_l10n/src/main/res/values-ar/strings.xml b/basic_l10n/src/main/res/values-ar/strings.xml index 764c1b75..12096b66 100644 --- a/basic_l10n/src/main/res/values-ar/strings.xml +++ b/basic_l10n/src/main/res/values-ar/strings.xml @@ -251,7 +251,7 @@ فشل فتح الصورة النظام التنقل - الأسئلة والأجوبة + س&ج للحصول على تحديثات النسخة التجريبية، يرجى الانضمام إلى المجموعة (انظر حول المؤلف) وذكر رقم وان (انظر البيانات الشخصية).\n\nملاحظة: يجب تسجيل الدخول وتحديث التطبيق إلى أحدث إصدار رسمي قبل التقديم للنسخة التجريبية تم العثور على إصدار جديد %s تم العثور على إصدار تجريبي %s diff --git a/basic_l10n/src/main/res/values-es/strings.xml b/basic_l10n/src/main/res/values-es/strings.xml index cf20ad6f..86c39b01 100644 --- a/basic_l10n/src/main/res/values-es/strings.xml +++ b/basic_l10n/src/main/res/values-es/strings.xml @@ -251,7 +251,7 @@ Error al abrir la imagen Sistema Navegación - Preguntas y respuestas + P&R Para solicitar acceso a la beta cerrada, únete al grupo (ver Sobre el autor) e indica tu número de usuario (ver perfil).\n\nNota: Debes iniciar sesión y actualizar a la última versión oficial antes de solicitar la beta. Nueva versión encontrada %s Versión beta encontrada %s diff --git a/basic_l10n/src/main/res/values-fr/strings.xml b/basic_l10n/src/main/res/values-fr/strings.xml index 7bd56f94..6bb8340f 100644 --- a/basic_l10n/src/main/res/values-fr/strings.xml +++ b/basic_l10n/src/main/res/values-fr/strings.xml @@ -251,7 +251,7 @@ Échec de l\'ouverture de l\'image Système Navigation - Questions/Réponses + Q/R Pour demander l\'accès à la bêta, rejoignez le groupe (voir À propos de l\'auteur) et indiquez votre numéro Wan (voir profil).\n\nNote : la bêta nécessite d\'être connecté et à jour. Nouvelle version trouvée : %s Version bêta trouvée : %s diff --git a/basic_l10n/src/main/res/values-ru/strings.xml b/basic_l10n/src/main/res/values-ru/strings.xml index 42a15596..278e0a1f 100644 --- a/basic_l10n/src/main/res/values-ru/strings.xml +++ b/basic_l10n/src/main/res/values-ru/strings.xml @@ -251,7 +251,7 @@ Не удалось открыть изображение Система Навигация - Вопросы и ответы + Q&A Для доступа к бета-обновлениям присоединяйтесь к группе (см. "Об авторе") и укажите свой Wan ID (см. профиль).\n\nПримечание: для бета-обновлений требуется вход и последняя версия приложения Обнаружена новая версия %s Обнаружена бета-версия %s From 6d6fbf61302d4e84ae9dc87e29d8288dcaa963db Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 20:10:06 +0800 Subject: [PATCH 10/30] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC2.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ gradle/config.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9477b011..de64d306 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # 更新日志 +## 2.3.0(83) + +- 【新增】新增英/法/俄/西班牙/阿拉伯语 + ## 2.2.9(82) - 【优化】优化使用体验 diff --git a/gradle/config.gradle b/gradle/config.gradle index 4b594563..a1602ab9 100644 --- a/gradle/config.gradle +++ b/gradle/config.gradle @@ -5,8 +5,8 @@ ext { minSdkVersion : 21, targetSdkVersion : 35, buildToolsVersion: "35.0.0", - versionCode : 82, - versionName : "2.2.9", //-beta1 + versionCode : 83, + versionName : "2.3.0", //-beta1 ] compileOptions = [ From 52ee87d75d0da79cdb790f14ab0f3a61cf2e8c6b Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 20:31:15 +0800 Subject: [PATCH 11/30] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Egoogle=20play?= =?UTF-8?q?=E6=B8=A0=E9=81=93=E5=8C=85=EF=BC=8C=E5=9B=A0=E4=B8=BAper?= =?UTF-8?q?=E5=92=8Ccom=E6=B8=A0=E9=81=93=E7=9A=84=E5=8C=85=E5=90=8D?= =?UTF-8?q?=E5=9C=A8google=20play=E9=83=BD=E8=A2=AB=E5=8D=A0=E7=94=A8?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt | 2 ++ gradle/flavor.gradle | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 2d4d2be8..b3914263 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ app/release/ app/com/ app/per/ +app/googlePlay/ *.apk *.ap_ diff --git a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt index aea491e9..7494d699 100644 --- a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt +++ b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt @@ -3,6 +3,7 @@ package per.goweii.wanandroid.common import android.app.Activity import android.app.Application import android.os.Bundle +import android.text.TextUtils import com.scwang.smart.refresh.footer.ClassicsFooter import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.tencent.bugly.crashreport.CrashReport @@ -276,6 +277,7 @@ class ReadingModeTask : AsyncInitTask() { class BuglyInitTask : SyncInitTask() { override fun init(application: Application) { if (DebugUtils.isDebug()) return + if (TextUtils.isEmpty(BuildConfig.APPID_BUGLY)) return CrashReport.setIsDevelopmentDevice(application, DebugUtils.isDebug()) val strategy = UserStrategy(application) strategy.setCrashHandleCallback(object : CrashHandleCallback() { diff --git a/gradle/flavor.gradle b/gradle/flavor.gradle index 12d938fb..60e7844d 100644 --- a/gradle/flavor.gradle +++ b/gradle/flavor.gradle @@ -107,6 +107,12 @@ android { ext.buglyAppId = APPID_BUGLY_FOR_COM ext.buglyAppKey = APPKEY_BUGLY_FOR_COM } + googlePlay { + dimension "applicationId" + applicationId "com.cuizhen.wanandroid" + ext.buglyAppId = "" + ext.buglyAppKey = "" + } } productFlavors.all { flavor -> buildConfigField "String", "APPID_BUGLY", "\"${ext.buglyAppId}\"" From f8129c11700aca28574c5944b05685aab381366e Mon Sep 17 00:00:00 2001 From: goweii Date: Wed, 18 Jun 2025 22:09:04 +0800 Subject: [PATCH 12/30] =?UTF-8?q?feat:=20google=20play=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=86=85=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +++ app/src/main/AndroidManifest.xml | 9 ++++++--- .../java/per/goweii/wanandroid/utils/UpdateUtils.java | 11 +++++++++++ .../src/main/java/per/goweii/basic/utils/Utils.java | 5 +++-- gradle/config.gradle | 2 +- gradle/flavor.gradle | 11 +++++++++-- 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 618e4915..26bdccec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,6 +18,9 @@ android { } } } + lint { + disable "NullSafeMutableLiveData" + } resourcePrefix "" androidResources { generateLocaleConfig true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 17003e3d..3f5d23a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,9 @@ android:name="android.hardware.camera" android:required="false" /> - + @@ -52,7 +54,8 @@ - diff --git a/app/src/main/java/per/goweii/wanandroid/utils/UpdateUtils.java b/app/src/main/java/per/goweii/wanandroid/utils/UpdateUtils.java index 4f8ab619..b1f7fedf 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/UpdateUtils.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/UpdateUtils.java @@ -6,6 +6,7 @@ import per.goweii.basic.utils.AppInfoUtils; import per.goweii.basic.utils.SPUtils; +import per.goweii.wanandroid.BuildConfig; import per.goweii.wanandroid.module.main.model.UpdateBean; /** @@ -43,16 +44,22 @@ public static UpdateUtils getInstance() { private UpdateUtils() { } + public boolean isEnabled() { + return BuildConfig.ENABLE_IN_APP_UPDATE; + } + public void ignore(int versionCode) { mSPUtils.save(KEY_VERSION_CODE, versionCode); mSPUtils.save(KEY_TIME, System.currentTimeMillis()); } public boolean shouldUpdate(UpdateBean updateBean) { + if (!isEnabled()) return false; return shouldUpdate(updateBean.getVersion_code(), updateBean.getVersion_name()); } public boolean shouldUpdate(int versionCode, String versionName) { + if (!isEnabled()) return false; if (!isNewest(versionCode, versionName)) return false; int ignoreCode = mSPUtils.get(KEY_VERSION_CODE, 0); if (versionCode > ignoreCode) return true; @@ -63,6 +70,7 @@ public boolean shouldUpdate(int versionCode, String versionName) { } public boolean shouldForceUpdate(UpdateBean updateBean) { + if (!isEnabled()) return false; return shouldForceUpdate( updateBean.isForce(), updateBean.getVersion_code(), updateBean.getVersion_name(), @@ -75,6 +83,7 @@ public boolean shouldForceUpdate( int netCurrVersionCode, String netCurrVersionName, int netLastForceVersionCode, String netLastForceVersionName ) { + if (!isEnabled()) return false; boolean isLastForceNewest = isNewest(netLastForceVersionCode, netLastForceVersionName); if (isLastForceNewest) return true; boolean isCurrNewest = isNewest(netCurrVersionCode, netCurrVersionName); @@ -89,10 +98,12 @@ public void ignoreBeta(String versionName, int versionCode) { } public boolean shouldUpdateBeta(UpdateBean updateBean) { + if (!isEnabled()) return false; return shouldUpdateBeta(updateBean.getVersion_code(), updateBean.getVersion_name()); } public boolean shouldUpdateBeta(int versionCode, String versionName) { + if (!isEnabled()) return false; if (!isNewest(versionCode, versionName)) return false; int ignoreCode = mSPUtils.get(KEY_BETA_VERSION_CODE, 0); if (versionCode > ignoreCode) return true; diff --git a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java index 9f38b2ee..eba970cb 100644 --- a/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java +++ b/basic_utils/src/main/java/per/goweii/basic/utils/Utils.java @@ -71,9 +71,10 @@ public void onActivityStarted(@NonNull Activity activity) { @Override public void onActivityResumed(@NonNull Activity activity) { - if (mResumedActivityRef == null || mResumedActivityRef.get() != activity) { - mResumedActivityRef = new WeakReference<>(activity); + if (mResumedActivityRef != null) { + mResumedActivityRef.clear(); } + mResumedActivityRef = new WeakReference<>(activity); } @Override diff --git a/gradle/config.gradle b/gradle/config.gradle index a1602ab9..93c88fe8 100644 --- a/gradle/config.gradle +++ b/gradle/config.gradle @@ -5,7 +5,7 @@ ext { minSdkVersion : 21, targetSdkVersion : 35, buildToolsVersion: "35.0.0", - versionCode : 83, + versionCode : 84, versionName : "2.3.0", //-beta1 ] diff --git a/gradle/flavor.gradle b/gradle/flavor.gradle index 60e7844d..6b21251f 100644 --- a/gradle/flavor.gradle +++ b/gradle/flavor.gradle @@ -77,7 +77,7 @@ android { release { shrinkResources false signingConfig signingConfigs.release - bundle{ + bundle { language { enableSplit = false } @@ -86,7 +86,7 @@ android { debug { shrinkResources false signingConfig signingConfigs.debug - bundle{ + bundle { language { enableSplit = false } @@ -100,21 +100,28 @@ android { applicationId "per.goweii.wanandroid" ext.buglyAppId = APPID_BUGLY_FOR_PER ext.buglyAppKey = APPKEY_BUGLY_FOR_PER + ext.enableInAppUpdate = true } com { dimension "applicationId" applicationId "com.goweii.wanandroid" ext.buglyAppId = APPID_BUGLY_FOR_COM ext.buglyAppKey = APPKEY_BUGLY_FOR_COM + ext.enableInAppUpdate = true } googlePlay { dimension "applicationId" applicationId "com.cuizhen.wanandroid" ext.buglyAppId = "" ext.buglyAppKey = "" + ext.enableInAppUpdate = false } } productFlavors.all { flavor -> + manifestPlaceholders = [ + REQUEST_INSTALL_PACKAGES_PERMISSION: ext.enableInAppUpdate ? "android.permission.REQUEST_INSTALL_PACKAGES" : "android.permission.INTERNET", + ] + buildConfigField "boolean", "ENABLE_IN_APP_UPDATE", "${ext.enableInAppUpdate}" buildConfigField "String", "APPID_BUGLY", "\"${ext.buglyAppId}\"" buildConfigField "String", "APPKEY_BUGLY", "\"${ext.buglyAppKey}\"" buildConfigField "String", "WANPWD_FORMAT", "\"${WANPWD_FORMAT}\"" From 3d167d4ab1301efb125341e688cbc96f3719c62f Mon Sep 17 00:00:00 2001 From: goweii Date: Thu, 19 Jun 2025 12:04:31 +0800 Subject: [PATCH 13/30] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4tbs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../per/goweii/wanandroid/common/InitTasks.kt | 27 ------- .../per/goweii/wanandroid/common/WanApp.java | 1 - .../goweii/wanandroid/utils/web/HitResult.kt | 4 +- .../wanandroid/utils/web/WebHolder.java | 53 +++++--------- .../wanandroid/utils/web/WebInstance.java | 21 ++---- .../utils/web/WebScrollableUtils.kt | 10 +-- .../utils/web/cache/ImageCacheManager.kt | 2 +- .../utils/web/cache/ResCacheManager.kt | 2 +- .../interceptor/WebReadingModeInterceptor.kt | 2 +- .../web/interceptor/WebResUrlInterceptor.kt | 2 +- .../web/interceptor/WebUrlInterceptor.kt | 2 +- .../utils/web/js/BaseJsInterface.kt | 2 +- .../wanandroid/utils/web/js/JsInjector.kt | 2 +- .../{X5WebView.java => CustomWebView.java} | 72 ++++++++++++------- .../utils/web/view/WebContainer.java | 5 +- 16 files changed, 85 insertions(+), 124 deletions(-) rename app/src/main/java/per/goweii/wanandroid/utils/web/view/{X5WebView.java => CustomWebView.java} (55%) diff --git a/app/build.gradle b/app/build.gradle index 26bdccec..d9f5f920 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ dependencies { implementation rootProject.ext.dependencies.buglyCrashreport implementation rootProject.ext.dependencies.buglyNativeCrashreport implementation rootProject.ext.dependencies.heartView - implementation rootProject.ext.dependencies.tbs +// implementation rootProject.ext.dependencies.tbs implementation rootProject.ext.dependencies.webkit implementation rootProject.ext.dependencies.photoView implementation rootProject.ext.dependencies.roomRuntime diff --git a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt index 7494d699..e047f872 100644 --- a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt +++ b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt @@ -9,9 +9,6 @@ import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.tencent.bugly.crashreport.CrashReport import com.tencent.bugly.crashreport.CrashReport.CrashHandleCallback import com.tencent.bugly.crashreport.CrashReport.UserStrategy -import com.tencent.smtt.sdk.QbSdk -import com.tencent.smtt.sdk.QbSdk.PreInitCallback -import com.tencent.smtt.sdk.WebView import per.goweii.basic.core.CoreInit import per.goweii.basic.utils.AsyncInitTask import per.goweii.basic.utils.DebugUtils @@ -238,28 +235,6 @@ class CrashInitTask : SyncInitTask() { } } -class X5InitTask : AsyncInitTask() { - override fun init(application: Application) { - QbSdk.initX5Environment(application, object : PreInitCallback { - override fun onCoreInitFinished() { - LogUtils.d("x5", "initX5Environment->onCoreInitFinished") - } - - override fun onViewInitFinished(b: Boolean) { - LogUtils.d("x5", "initX5Environment->onViewInitFinished=$b") - } - }) - } - - override fun onlyMainProcess(): Boolean { - return false - } - - override fun level(): Int { - return 0 - } -} - class ReadingModeTask : AsyncInitTask() { override fun init(application: Application) { ReadingModeManager.setup() @@ -283,8 +258,6 @@ class BuglyInitTask : SyncInitTask() { strategy.setCrashHandleCallback(object : CrashHandleCallback() { override fun onCrashHandleStart(crashType: Int, errorType: String, errorMessage: String, errorStack: String): Map { val map = LinkedHashMap() - val x5CrashInfo = WebView.getCrashExtraMessage(application) - map["x5crashInfo"] = x5CrashInfo return map } diff --git a/app/src/main/java/per/goweii/wanandroid/common/WanApp.java b/app/src/main/java/per/goweii/wanandroid/common/WanApp.java index 1fa7e704..f8e18869 100644 --- a/app/src/main/java/per/goweii/wanandroid/common/WanApp.java +++ b/app/src/main/java/per/goweii/wanandroid/common/WanApp.java @@ -24,7 +24,6 @@ public void onCreate() { .add(new WanDbInitTask()) .add(new WanCacheInitTask()) .add(new BlurredInitTask()) - .add(new X5InitTask()) .add(new BuglyInitTask()) .add(new CrashInitTask()) .add(new ReadingModeTask()) diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/HitResult.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/HitResult.kt index dba1a6fa..c8516f7e 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/HitResult.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/HitResult.kt @@ -1,6 +1,6 @@ package per.goweii.wanandroid.utils.web -import com.tencent.smtt.sdk.WebView +import android.webkit.WebView /** * @author CuiZhen @@ -27,7 +27,7 @@ data class HitResult( } fun getResult(): String { - return result.extra + return result.extra ?: "" } enum class Type { diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java index 7793fe7f..9f6d10bf 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java @@ -17,6 +17,16 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; +import android.webkit.DownloadListener; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.ProgressBar; @@ -27,19 +37,6 @@ import androidx.webkit.WebSettingsCompat; import androidx.webkit.WebViewFeature; -import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient; -import com.tencent.smtt.export.external.interfaces.WebResourceRequest; -import com.tencent.smtt.export.external.interfaces.WebResourceResponse; -import com.tencent.smtt.sdk.CookieManager; -import com.tencent.smtt.sdk.CookieSyncManager; -import com.tencent.smtt.sdk.DownloadListener; -import com.tencent.smtt.sdk.QbSdk; -import com.tencent.smtt.sdk.ValueCallback; -import com.tencent.smtt.sdk.WebChromeClient; -import com.tencent.smtt.sdk.WebSettings; -import com.tencent.smtt.sdk.WebView; -import com.tencent.smtt.sdk.WebViewClient; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -148,9 +145,6 @@ private WebHolder(Activity activity, WebContainer container, ProgressBar progres int color = ResUtils.getThemeColor(mWebContainer, R.attr.colorSurface); mWebContainer.setBackgroundColor(color); if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - QbSdk.forceSysWebView(); - } else { - QbSdk.unForceSysWebView(); } if (useInstanceCache) { mWebView = WebInstance.getInstance(mActivity).obtain(); @@ -226,17 +220,13 @@ public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int mUserAgentString = webSetting.getUserAgentString(); boolean isAppDarkMode = DarkModeUtils.isDarkMode(activity); if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - View v = mWebView.getView(); - if (v instanceof android.webkit.WebView) { - android.webkit.WebView wv = (android.webkit.WebView) v; - if (isAppDarkMode) { - WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_ON); - } else { - WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); - } + WebView wv = mWebView; + if (isAppDarkMode) { + WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_ON); + } else { + WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); } } else { - mWebView.setDayOrNight(!isAppDarkMode); } jsInjector = new JsInjector(mWebView); jsInjector.attach(); @@ -258,7 +248,7 @@ public float getPercent() { if (isProgressShown) return 0f; float contentHeight = mWebView.getContentHeight() * mWebView.getScale(); if (contentHeight <= 0) return 0f; - float webViewScrollY = mWebView.getWebScrollY(); + float webViewScrollY = mWebView.getScrollY(); float webViewHeight = mWebView.getHeight(); float percent = (float) (webViewScrollY + webViewHeight) / (float) contentHeight; percent = Math.max(0F, percent); @@ -640,11 +630,11 @@ public void onAnimationRepeat(Animator animation) { } private DecorLayer mCustomViewLayer = null; - private IX5WebChromeClient.CustomViewCallback mCustomViewCallback = null; + private WebChromeClient.CustomViewCallback mCustomViewCallback = null; private int mOldActivityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @Override - public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) { + public void onShowCustomView(View view, WebChromeClient.CustomViewCallback customViewCallback) { if (mCustomViewLayer != null) { mCustomViewLayer.dismiss(); mCustomViewLayer = null; @@ -759,13 +749,6 @@ public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceReque return shouldInterceptRequest(request.getUrl(), reqHeaders, reqMethod); } - @Override - public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request, Bundle bundle) { - Map reqHeaders = request.getRequestHeaders(); - String reqMethod = request.getMethod(); - return shouldInterceptRequest(request.getUrl(), reqHeaders, reqMethod); - } - @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return shouldOverrideUrlLoading(view, Uri.parse(url)); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java index fdce958e..ea0cc8d9 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java @@ -6,22 +6,18 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Build; -import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.webkit.CookieManager; +import android.webkit.WebSettings; +import android.webkit.WebView; import androidx.annotation.NonNull; -import com.tencent.smtt.export.external.extension.interfaces.IX5WebSettingsExtension; -import com.tencent.smtt.export.external.interfaces.IX5WebSettings; -import com.tencent.smtt.sdk.CookieManager; -import com.tencent.smtt.sdk.WebSettings; -import com.tencent.smtt.sdk.WebView; - import java.util.ArrayList; import java.util.List; -import per.goweii.wanandroid.utils.web.view.X5WebView; +import per.goweii.wanandroid.utils.web.view.CustomWebView; public class WebInstance { private static WebInstance sInstance = null; @@ -96,12 +92,11 @@ public void destroy(@NonNull WebView webView) { @SuppressLint("SetJavaScriptEnabled") public WebView create() { - WebView webView = new X5WebView(mApplication); + WebView webView = new CustomWebView(mApplication); webView.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); webView.setBackgroundColor(0); webView.getBackground().setAlpha(0); webView.setOverScrollMode(WebView.OVER_SCROLL_NEVER); - webView.getView().setOverScrollMode(View.OVER_SCROLL_NEVER); WebSettings webSetting = webView.getSettings(); webSetting.setJavaScriptEnabled(true); webSetting.setJavaScriptCanOpenWindowsAutomatically(false); @@ -111,19 +106,13 @@ public WebView create() { webSetting.setBuiltInZoomControls(false); webSetting.setUseWideViewPort(true); webSetting.setLoadWithOverviewMode(true); - webSetting.setAppCacheEnabled(true); webSetting.setDomStorageEnabled(true); webSetting.setGeolocationEnabled(true); - webSetting.setAppCacheMaxSize(Long.MAX_VALUE); webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND); webSetting.setCacheMode(WebSettings.LOAD_DEFAULT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSetting.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } - IX5WebSettingsExtension ext = webView.getSettingsExtension(); - if (ext != null) { - ext.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY); - } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true); } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt index bee99466..f5dfd58a 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt @@ -1,8 +1,8 @@ package per.goweii.wanandroid.utils.web -import com.tencent.smtt.sdk.ValueCallback +import android.webkit.ValueCallback import per.goweii.basic.utils.LogUtils -import per.goweii.wanandroid.utils.web.view.X5WebView +import per.goweii.wanandroid.utils.web.view.CustomWebView import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock @@ -12,12 +12,12 @@ object WebScrollableUtils { const val DIRECTION_LEFT = 4 const val DIRECTION_RIGHT = 8 - fun getScrollableDirections(webView: X5WebView, x: Float, y: Float): Int { + fun getScrollableDirections(webView: CustomWebView, x: Float, y: Float): Int { if (true) return 0 val density: Float = webView.resources.displayMetrics.density - val wx: Float = (x + webView.webScrollX) / density - val wy: Float = (y + webView.webScrollY) / density + val wx: Float = (x + webView.scrollX) / density + val wy: Float = (y + webView.scrollY) / density val js = """javascript:( function getScrollableDirections() { let touchX = $wx; diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ImageCacheManager.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ImageCacheManager.kt index 7315b3bb..e22589db 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ImageCacheManager.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ImageCacheManager.kt @@ -1,10 +1,10 @@ package per.goweii.wanandroid.utils.web.cache import android.net.Uri +import android.webkit.WebResourceResponse import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions -import com.tencent.smtt.export.external.interfaces.WebResourceResponse import per.goweii.basic.utils.Utils import java.io.InputStream diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ResCacheManager.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ResCacheManager.kt index ddfdd21a..0c826fb9 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ResCacheManager.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/cache/ResCacheManager.kt @@ -2,8 +2,8 @@ package per.goweii.wanandroid.utils.web.cache import android.net.Uri import android.util.LruCache +import android.webkit.WebResourceResponse import com.jakewharton.disklrucache.DiskLruCache -import com.tencent.smtt.export.external.interfaces.WebResourceResponse import per.goweii.basic.utils.coder.MD5Coder import per.goweii.basic.utils.file.CacheUtils import per.goweii.wanandroid.utils.web.interceptor.WebHttpClient diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebReadingModeInterceptor.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebReadingModeInterceptor.kt index 7fa18b15..226051d5 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebReadingModeInterceptor.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebReadingModeInterceptor.kt @@ -1,7 +1,7 @@ package per.goweii.wanandroid.utils.web.interceptor import android.net.Uri -import com.tencent.smtt.export.external.interfaces.WebResourceResponse +import android.webkit.WebResourceResponse import per.goweii.wanandroid.utils.web.cache.HtmlCacheManager import per.goweii.wanandroid.utils.web.cache.ReadingModeManager import per.goweii.wanandroid.utils.web.css.CssStyleManager diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebResUrlInterceptor.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebResUrlInterceptor.kt index b69ef200..404978e9 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebResUrlInterceptor.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebResUrlInterceptor.kt @@ -1,7 +1,7 @@ package per.goweii.wanandroid.utils.web.interceptor import android.net.Uri -import com.tencent.smtt.export.external.interfaces.WebResourceResponse +import android.webkit.WebResourceResponse import per.goweii.wanandroid.utils.web.cache.ImageCacheManager import per.goweii.wanandroid.utils.web.cache.ResCacheManager diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebUrlInterceptor.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebUrlInterceptor.kt index be0546d3..489d41aa 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebUrlInterceptor.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/interceptor/WebUrlInterceptor.kt @@ -1,7 +1,7 @@ package per.goweii.wanandroid.utils.web.interceptor import android.net.Uri -import com.tencent.smtt.export.external.interfaces.WebResourceResponse +import android.webkit.WebResourceResponse /** * @author CuiZhen diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/js/BaseJsInterface.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/js/BaseJsInterface.kt index b840480a..d8f61f6b 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/js/BaseJsInterface.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/js/BaseJsInterface.kt @@ -1,6 +1,6 @@ package per.goweii.wanandroid.utils.web.js -import com.tencent.smtt.sdk.WebView +import android.webkit.WebView import per.goweii.basic.utils.DebugUtils import per.goweii.basic.utils.Utils diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/js/JsInjector.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/js/JsInjector.kt index 212b1e7b..2a2a94f5 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/js/JsInjector.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/js/JsInjector.kt @@ -3,7 +3,7 @@ package per.goweii.wanandroid.utils.web.js import android.os.Handler import android.os.Message import android.webkit.JavascriptInterface -import com.tencent.smtt.sdk.WebView +import android.webkit.WebView /** * @author CuiZhen diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/view/X5WebView.java b/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java similarity index 55% rename from app/src/main/java/per/goweii/wanandroid/utils/web/view/X5WebView.java rename to app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java index 567b53c5..79e76f2a 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/view/X5WebView.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java @@ -1,24 +1,14 @@ package per.goweii.wanandroid.utils.web.view; import android.content.Context; -import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; +import android.webkit.WebView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.view.ScrollingView; -import com.tencent.smtt.sdk.ValueCallback; -import com.tencent.smtt.sdk.WebView; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import per.goweii.basic.utils.LogUtils; import per.goweii.wanandroid.utils.web.WebScrollableUtils; /** @@ -26,28 +16,28 @@ * @date 2019/11/30 * GitHub: https://github.com/goweii */ -public class X5WebView extends WebView implements ScrollingView { +public class CustomWebView extends WebView implements ScrollingView { private Float touchX = null; private Float touchY = null; - public X5WebView(Context context) { + public CustomWebView(@NonNull Context context) { super(context); } - public X5WebView(Context context, AttributeSet attributeSet) { - super(context, attributeSet); + public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); } - public X5WebView(Context context, AttributeSet attributeSet, int i) { - super(context, attributeSet, i); + public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); } - public X5WebView(Context context, AttributeSet attributeSet, int i, boolean b) { - super(context, attributeSet, i, b); + public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); } - public X5WebView(Context context, AttributeSet attributeSet, int i, Map map, boolean b) { - super(context, attributeSet, i, map, b); + public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) { + super(context, attrs, defStyleAttr, privateBrowsing); } @Override @@ -69,12 +59,12 @@ public boolean dispatchTouchEvent(MotionEvent ev) { @Override public void scrollBy(int x, int y) { - getView().scrollBy(x, y); + super.scrollBy(x, y); } @Override public boolean canScrollHorizontally(int direction) { - if (getView().canScrollHorizontally(direction)) { + if (super.canScrollHorizontally(direction)) { return true; } if (touchX == null || touchY == null) { @@ -92,7 +82,7 @@ public boolean canScrollHorizontally(int direction) { @Override public boolean canScrollVertically(int direction) { - if (getView().canScrollVertically(direction)) { + if (super.canScrollVertically(direction)) { return true; } if (touchX == null || touchY == null) { @@ -107,4 +97,34 @@ public boolean canScrollVertically(int direction) { } return false; } + + @Override + public int computeHorizontalScrollRange() { + return super.computeHorizontalScrollRange(); + } + + @Override + public int computeHorizontalScrollOffset() { + return super.computeHorizontalScrollOffset(); + } + + @Override + public int computeHorizontalScrollExtent() { + return super.computeHorizontalScrollExtent(); + } + + @Override + public int computeVerticalScrollRange() { + return super.computeVerticalScrollRange(); + } + + @Override + public int computeVerticalScrollOffset() { + return super.computeVerticalScrollOffset(); + } + + @Override + public int computeVerticalScrollExtent() { + return super.computeVerticalScrollExtent(); + } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java b/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java index 160c8add..939207de 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java @@ -21,7 +21,6 @@ import com.donkingliang.consecutivescroller.IConsecutiveScroller; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; @@ -384,8 +383,6 @@ public View getCurrentScrollerView() { View child = getChildAt(i); if (child instanceof WebView) { return child; - } else if (child instanceof X5WebView) { - return ((X5WebView) child).getView(); } } return null; @@ -407,7 +404,7 @@ public View getCurrentWebView() { View child = getChildAt(i); if (child instanceof WebView) { return child; - } else if (child instanceof X5WebView) { + } else if (child instanceof CustomWebView) { return child; } } From fa093289ca108e1178baeb106bbc132c38692962 Mon Sep 17 00:00:00 2001 From: goweii Date: Thu, 19 Jun 2025 12:25:43 +0800 Subject: [PATCH 14/30] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D%=E8=BD=AC?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/adapter/BookChapterAdapter.java | 3 +- basic_l10n/src/main/res/values-ar/strings.xml | 6 +- basic_l10n/src/main/res/values-es/strings.xml | 6 +- basic_l10n/src/main/res/values-fr/strings.xml | 66 +++++++++---------- basic_l10n/src/main/res/values-ru/strings.xml | 6 +- .../src/main/res/values-zh-rCN/strings.xml | 6 +- basic_l10n/src/main/res/values/strings.xml | 6 +- gradle/config.gradle | 2 +- 8 files changed, 51 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java b/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java index 1368b7b5..6d3b8f12 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java +++ b/app/src/main/java/per/goweii/wanandroid/module/book/adapter/BookChapterAdapter.java @@ -54,7 +54,8 @@ protected void convert(@NonNull BaseViewHolder helper, @NonNull BookChapterBean pb_percent.setVisibility(View.INVISIBLE); } else { ll_state.setVisibility(View.VISIBLE); - tv_state.setText(mContext.getString(R.string.learned_n_percent, (int) (item.getPercent() * 100))); + int p = (int) (item.getPercent() * 100); + tv_state.setText(mContext.getString(R.string.learned_n_percent, p)); tv_state.setTextColor(ResUtils.getThemeColor(tv_state, R.attr.colorTextMain)); pb_percent.setVisibility(View.VISIBLE); } diff --git a/basic_l10n/src/main/res/values-ar/strings.xml b/basic_l10n/src/main/res/values-ar/strings.xml index 12096b66..b43db763 100644 --- a/basic_l10n/src/main/res/values-ar/strings.xml +++ b/basic_l10n/src/main/res/values-ar/strings.xml @@ -42,7 +42,7 @@ شكرًا لاستخدامك وان أندرويد!\nقمنا بتحديث "سياسة الخصوصية" وفقًا لأحدث المتطلبات التنظيمية، ونوضح ما يلي:\n1. لجلب الوظائف الأساسية، سنجمع ونستخدم المعلومات الضرورية؛\n2. بناءً على إذنك الصريح، سنطلب إذن التخزين لحفظ صور مشاركة المقالات، ويمكنك رفض أو إلغاء الإذن؛\n3. سنتخذ تدابير أمنية لحماية معلوماتك؛\n4. لن نحصل أو نشارك أو نقدم معلوماتك لطرف ثالث دون إذنك. %d B - %d \% + %d %% "فشل التنزيل، يمكنك الذهاب إلى مستودع Github: أنا - إعدادات النظام - حولنا - مستودع المشروع" هذه الصفحة مقدمة من %s @@ -166,7 +166,7 @@ امسح الرمز لتنزيل وتثبيت التطبيق لا يوجد شيء~ كيف حدث الخطأ مرة أخرى~ - تم التعلم %d\% + تم التعلم %d%% تسجيل الدخول النقاط %s تعديل نصيحة @@ -220,7 +220,7 @@ فشل التفويض تم التحميل بنجاح فشل التحميل - جارٍ التحميل (%d\%) + جارٍ التحميل (%d%%) تمت الإضافة للمفضلة مجهول تمت الإضافة إلى إشاراتي المرجعية diff --git a/basic_l10n/src/main/res/values-es/strings.xml b/basic_l10n/src/main/res/values-es/strings.xml index 86c39b01..ce407900 100644 --- a/basic_l10n/src/main/res/values-es/strings.xml +++ b/basic_l10n/src/main/res/values-es/strings.xml @@ -42,7 +42,7 @@ ¡Gracias por usar WanAndroid!\nHemos actualizado nuestra Política de Privacidad según los últimos requisitos regulatorios:\n1. Para proporcionarte funciones básicas de transacción, recopilaremos y usaremos la información necesaria;\n2. Con tu autorización explícita, obtendremos permiso de almacenamiento para guardar imágenes compartidas de artículos. Puedes rechazar o cancelar la autorización;\n3. Tomaremos medidas de seguridad para proteger tu información;\n4. Sin tu consentimiento, no obtendremos, compartiremos ni proporcionaremos tu información a terceros. %d B - %d \% + %d %% Descarga fallida, puedes descargar desde el repositorio de Github: Yo - Configuración del sistema - Sobre nosotros - Repositorio del proyecto Página proporcionada por %s @@ -166,7 +166,7 @@ Escanea el código para descargar e instalar Nada aquí~ ¿Por qué falló de nuevo~? - %d\% aprendido + %d%% aprendido Check-in Puntos %s Editar Consejos @@ -220,7 +220,7 @@ Autorización fallida Cargado exitosamente Error al cargar - Cargando (%d\%) + Cargando (%d%%) Favorito Anónimo Añadido a mis marcadores diff --git a/basic_l10n/src/main/res/values-fr/strings.xml b/basic_l10n/src/main/res/values-fr/strings.xml index 6bb8340f..4138a849 100644 --- a/basic_l10n/src/main/res/values-fr/strings.xml +++ b/basic_l10n/src/main/res/values-fr/strings.xml @@ -39,11 +39,11 @@ « Politique de confidentialité » - Merci d\'utiliser WanAndroid !\nNous avons mis à jour notre politique de confidentialité conformément aux dernières exigences réglementaires :\n1. Pour vous fournir les fonctions de base, nous collectons et utilisons les informations nécessaires ;\n2. Avec votre autorisation explicite, nous accédons au stockage pour enregistrer les images partagées. Vous pouvez refuser ou annuler ;\n3. Nous prenons des mesures de sécurité pour protéger vos informations ;\n4. Sans votre consentement, nous ne collecterons, partagerons ni fournirons vos informations à des tiers. + Merci d\'utiliser WanAndroid !\nNous avons mis à jour notre politique de confidentialité conformément aux dernières exigences réglementaires :\n1. Pour vous fournir les fonctions de base, nous collectons et utilisons les informations nécessaires ;\n2. Avec votre autorisation explicite, nous accédons au stockage pour enregistrer les images partagées. Vous pouvez refuser ou annuler ;\n3. Nous prenons des mesures de sécurité pour protéger vos informations ;\n4. Sans votre consentement, nous ne collecterons, partagerons ni fournirons vos informations à des tiers. - %d B - %d \% - "Échec du téléchargement, vous pouvez télécharger depuis le dépôt Github : Moi - Paramètres système - À propos de nous - Dépôt du projet" + %d B + %d %% + "Échec du téléchargement, vous pouvez télécharger depuis le dépôt Github : Moi - Paramètres système - À propos de nous - Dépôt du projet" Page fournie par %s Retour à l\'accueil @@ -93,10 +93,10 @@ Profil WanID Nom d\'utilisateur - Points : - Classement : + Points : + Classement : Nom de domaine - ex : www.wanandroid.com + ex : www.wanandroid.com Annuler OK Ouvrir le lien @@ -104,7 +104,7 @@ Enregistrer Reconnaître le QR code dans l\'image Veuillez saisir - Je n\'ai même pas encore décidé à quoi sert ce mot de passe, comment l\'avez-vous trouvé ? + Je n\'ai même pas encore décidé à quoi sert ce mot de passe, comment l\'avez-vous trouvé ? Ignorer Double-cliquez n\'importe où pour ajouter aux favoris Appuyez longuement sur l\'image pour l\'agrandir @@ -118,7 +118,7 @@ Accueil S\'inscrire Connexion - Niveau : + Niveau : Mes collections Questions/Réponses Nouveau @@ -141,8 +141,8 @@ Rafraîchir le titre Jusqu\'à 100 caractères Lien de l\'article - ex : https://www.wanandroid.com/blog/show/2577 - 1. Vous pouvez partager tout bon article, pas seulement les originaux ! Les articles soumis apparaîtront dans l\'onglet Place ;\n2. Les blogs officiels comme CSDN, Juejin, JianShu sont automatiquement approuvés ;\n3. Les sites personnels nécessitent une vérification ; n\'envoyez pas de liens invalides, cela pourrait affecter votre compte ;\n4. Si vous trouvez une erreur, envoyez un journal pour améliorer le site.\n5. Ce site est maintenu par une seule personne, l\'approbation se fait sous 24h, sauf imprévu. + ex : https://www.wanandroid.com/blog/show/2577 + 1. Vous pouvez partager tout bon article, pas seulement les originaux ! Les articles soumis apparaîtront dans l\'onglet Place ;\n2. Les blogs officiels comme CSDN, Juejin, JianShu sont automatiquement approuvés ;\n3. Les sites personnels nécessitent une vérification ; n\'envoyez pas de liens invalides, cela pourrait affecter votre compte ;\n4. Si vous trouvez une erreur, envoyez un journal pour améliorer le site.\n5. Ce site est maintenu par une seule personne, l\'approbation se fait sous 24h, sauf imprévu. Généré par le client WanAndroid Enregistrer dans l\'album Partager maintenant @@ -160,14 +160,14 @@ Celui qui ne croit pas en lui-même n\'a aucune valeur à s\'efforcer JianShu Groupe QQ - Yo~\nL\'application est super !\nOffrez-vous un café + Yo~\nL\'application est super !\nOffrez-vous un café Glisser vers le haut Cliquez pour enregistrer dans l\'album Scanner pour télécharger et installer Rien~ Encore une erreur~ - %d \% appris - Enregistrement Points %s + %d %% appris + Enregistrement Points %s Éditer Conseil Liens du site @@ -175,33 +175,33 @@ Déjà appris Copié Relâcher dans le tutoriel de livre - Êtes-vous sûr de vouloir effacer l\'historique de recherche ? + Êtes-vous sûr de vouloir effacer l\'historique de recherche ? Pas un utilisateur bêta Activer la connexion biométrique Se connecter avec la biométrie - Offrez un café au développeur !\nUne application totalement gratuite !\nUne application aussi pratique et gratuite !\nAussi belle, aussi pratique et gratuite !\nPas de café pour moi ?\nJe n\'ai plus d\'énergie pour continuer ! + Offrez un café au développeur !\nUne application totalement gratuite !\nUne application aussi pratique et gratuite !\nAussi belle, aussi pratique et gratuite !\nPas de café pour moi ?\nJe n\'ai plus d\'énergie pour continuer ! Offrir Veuillez vous connecter d\'abord Activation réussie, effective après redémarrage Code d\'activation invalide - Vous avez trouvé un code d\'activation !\nLe code est lié au compte actuel. Après changement d\'appareil ou de compte, il faut réactiver. Après activation, toutes les pubs seront supprimées. Activer maintenant ? + Vous avez trouvé un code d\'activation !\nLe code est lié au compte actuel. Après changement d\'appareil ou de compte, il faut réactiver. Après activation, toutes les pubs seront supprimées. Activer maintenant ? Activer Veuillez vous connecter pour utiliser cette fonction Cette fonction est réservée aux comptes développeur [Wan Watchword] Ceci est un code d\'activation, réservé à certains comptes Ouvrez le plus beau client WanAndroid pour activer ###Génération de code d\'activation###\n\n!!! Attention !!!\n\nCette fonction est réservée aux développeurs - [Wan Watchword] Votre ami vous a partagé un lien, ouvrez le client WanAndroid pour le voir : %s + [Wan Watchword] Votre ami vous a partagé un lien, ouvrez le client WanAndroid pour le voir : %s Copier Mettre à jour - Vous avez trouvé un mot de passe mystérieux !\nMalheureusement, cette version ne le prend pas en charge. Mettez à jour dans les paramètres et réessayez ! - Vous avez trouvé un utilisateur mystérieux !\nVoulez-vous visiter sa page ? + Vous avez trouvé un mot de passe mystérieux !\nMalheureusement, cette version ne le prend pas en charge. Mettez à jour dans les paramètres et réessayez ! + Vous avez trouvé un utilisateur mystérieux !\nVoulez-vous visiter sa page ? Aller à la page d\'accueil - [Wan Watchword] Votre ami vous a partagé un utilisateur mystérieux, ouvrez le client WanAndroid pour le découvrir : %s - Vous avez trouvé un lien web !\nVoulez-vous l\'ouvrir ? - Vous avez trouvé un numéro QQ !\n%s\nVoulez-vous ouvrir QQ pour ajouter un ami ? + [Wan Watchword] Votre ami vous a partagé un utilisateur mystérieux, ouvrez le client WanAndroid pour le découvrir : %s + Vous avez trouvé un lien web !\nVoulez-vous l\'ouvrir ? + Vous avez trouvé un numéro QQ !\n%s\nVoulez-vous ouvrir QQ pour ajouter un ami ? Ajouter un ami - [Wan Watchword] Votre ami vous a commandé un café pour deux, ouvrez le client WanAndroid pour le recevoir : %s + [Wan Watchword] Votre ami vous a commandé un café pour deux, ouvrez le client WanAndroid pour le recevoir : %s Liste blanche uniquement Bloquer la liste noire Veuillez saisir votre nom d\'utilisateur @@ -220,7 +220,7 @@ Échec de l\'autorisation Chargé avec succès Échec du chargement - Chargement (%d \%) + Chargement (%d %%) Ajouté aux favoris Anonyme Ajouté à mes signets @@ -237,7 +237,7 @@ Suivant Double-cliquez n\'importe où pour ajouter rapidement aux favoris~ Appuyez longuement sur l\'image pour la prévisualiser en grand~ - Continuer la lecture ? + Continuer la lecture ? Refuser la permission appareil photo empêche le scan Redemander Permission appareil photo refusée @@ -252,9 +252,9 @@ Système Navigation Q/R - Pour demander l\'accès à la bêta, rejoignez le groupe (voir À propos de l\'auteur) et indiquez votre numéro Wan (voir profil).\n\nNote : la bêta nécessite d\'être connecté et à jour. - Nouvelle version trouvée : %s - Version bêta trouvée : %s + Pour demander l\'accès à la bêta, rejoignez le groupe (voir À propos de l\'auteur) et indiquez votre numéro Wan (voir profil).\n\nNote : la bêta nécessite d\'être connecté et à jour. + Nouvelle version trouvée : %s + Version bêta trouvée : %s Déjà à jour %s(%d) Nouveaux messages @@ -262,7 +262,7 @@ Connexion rapide activée Connexion rapide réussie Échec de la connexion rapide, veuillez utiliser le mot de passe - Activer la connexion rapide ? + Activer la connexion rapide ? Pas maintenant Connexion rapide Connexion par mot de passe @@ -271,11 +271,11 @@ Site web Liste blanche Liste noire - Voulez-vous tout supprimer ? + Voulez-vous tout supprimer ? Lien vide Échec de la suppression - Voulez-vous vider le cache ? - Voulez-vous vous déconnecter ? + Voulez-vous vider le cache ? + Voulez-vous vous déconnecter ? Langue \ No newline at end of file diff --git a/basic_l10n/src/main/res/values-ru/strings.xml b/basic_l10n/src/main/res/values-ru/strings.xml index 278e0a1f..01d10bb4 100644 --- a/basic_l10n/src/main/res/values-ru/strings.xml +++ b/basic_l10n/src/main/res/values-ru/strings.xml @@ -42,7 +42,7 @@ Спасибо за использование WanAndroid!\nМы обновили «Политику конфиденциальности» в соответствии с последними требованиями:\n1. Для предоставления основных функций мы собираем и используем необходимую информацию;\n2. С вашего разрешения мы получаем доступ к хранилищу для сохранения изображений, вы можете отказаться;\n3. Мы принимаем меры для защиты вашей информации;\n4. Без вашего согласия мы не получаем, не делимся и не передаем вашу информацию третьим лицам. %d B - %d \% + %d %% "Не удалось загрузить, скачайте с Github: Мое - Настройки системы - О нас - Репозиторий проекта" Страница предоставлена %s @@ -166,7 +166,7 @@ Сканируйте для загрузки и установки Ничего нет~ Опять что-то не так~ - Изучено %d\% + Изучено %d%% Регистрация Баллы %s Редактировать Подсказка @@ -220,7 +220,7 @@ Не удалось получить разрешение Загружено успешно Не удалось загрузить - Загрузка (%d\%) + Загрузка (%d%%) В избранном Аноним Добавлено в закладки diff --git a/basic_l10n/src/main/res/values-zh-rCN/strings.xml b/basic_l10n/src/main/res/values-zh-rCN/strings.xml index 0e8871cd..75307d6c 100644 --- a/basic_l10n/src/main/res/values-zh-rCN/strings.xml +++ b/basic_l10n/src/main/res/values-zh-rCN/strings.xml @@ -42,7 +42,7 @@ 感谢您使用玩安卓!\n我们依据最新的监管要求更新了《隐私政策》特向您说明如下:\n1. 为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2. 基于您的明示授权我们会获取存储权限,用于保存文章分享图,您有权拒绝或取消授权;\n3. 我们会采取安全措施保护您的信息安全;\n4. 未经您同意,我们不会从第三方处获取、共享或向其提供您的信息。 %d B - %d \% + %d %% "下载失败,可前往Github仓库下载:我的-系统设置-关于我们-项目仓库" 网页由%s提供 @@ -166,7 +166,7 @@ 扫码下载安装 什么都没有~ 怎么又出错~ - 已学%d\% + 已学%d%% 签到 积分%s 编辑 提示 @@ -220,7 +220,7 @@ 授权失败 加载成功 加载失败 - 加载中(%d\%) + 加载中(%d%%) 已收藏 匿名 已加入我的书签 diff --git a/basic_l10n/src/main/res/values/strings.xml b/basic_l10n/src/main/res/values/strings.xml index 418bc8e7..be09c1b6 100644 --- a/basic_l10n/src/main/res/values/strings.xml +++ b/basic_l10n/src/main/res/values/strings.xml @@ -42,7 +42,7 @@ Thank you for using WanAndroid!\nWe have updated our Privacy Policy according to the latest regulatory requirements. Please note:\n1. We collect and use necessary information to provide you with basic transaction functions;\n2. With your explicit authorization, we will obtain storage permission to save article sharing images. You have the right to refuse or cancel authorization;\n3. We take security measures to protect your information;\n4. Without your consent, we will not obtain, share, or provide your information to third parties. %d B - %d \% + %d %% Download failed, you can download from Github: Mine - System Settings - About Us - Project Repository This webpage is provided by %s @@ -166,7 +166,7 @@ Scan to download and install Nothing~ How did it go wrong again~ - Learned %d\% + Learned %d%% Check-in points %s Edit Tips @@ -220,7 +220,7 @@ Authorization failed Loaded successfully Load failed - Loading (%d\%) + Loading (%d%%) Collected Anonymous Added to my bookmarks diff --git a/gradle/config.gradle b/gradle/config.gradle index 93c88fe8..9528cb7b 100644 --- a/gradle/config.gradle +++ b/gradle/config.gradle @@ -5,7 +5,7 @@ ext { minSdkVersion : 21, targetSdkVersion : 35, buildToolsVersion: "35.0.0", - versionCode : 84, + versionCode : 85, versionName : "2.3.0", //-beta1 ] From 02ad20405b615c3e7d4c76ca2c84ba5e9c0a3e6a Mon Sep 17 00:00:00 2001 From: goweii Date: Thu, 19 Jun 2025 23:45:33 +0800 Subject: [PATCH 15/30] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E7=BD=91?= =?UTF-8?q?=E9=A1=B5=E6=9A=97=E8=89=B2=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wanandroid/utils/web/WebHolder.java | 20 +++++++------ .../wanandroid/utils/web/WebInstance.java | 28 ++++++++++++++----- .../utils/web/view/CustomWebView.java | 21 ++++---------- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java index 9f6d10bf..6da2c61e 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java @@ -6,11 +6,11 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.net.Uri; import android.os.Build; -import android.os.Bundle; import android.text.TextUtils; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -34,6 +34,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import androidx.appcompat.view.ContextThemeWrapper; import androidx.webkit.WebSettingsCompat; import androidx.webkit.WebViewFeature; @@ -144,12 +145,12 @@ private WebHolder(Activity activity, WebContainer container, ProgressBar progres mWebContainer = container; int color = ResUtils.getThemeColor(mWebContainer, R.attr.colorSurface); mWebContainer.setBackgroundColor(color); - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - } + Resources.Theme theme = mActivity.getTheme(); + ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(mActivity, theme); if (useInstanceCache) { - mWebView = WebInstance.getInstance(mActivity).obtain(); + mWebView = WebInstance.getInstance(mActivity).obtain(contextThemeWrapper); } else { - mWebView = WebInstance.getInstance(mActivity).create(); + mWebView = WebInstance.getInstance(mActivity).create(contextThemeWrapper); } container.addView(mWebView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); @@ -219,14 +220,15 @@ public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int WebSettings webSetting = mWebView.getSettings(); mUserAgentString = webSetting.getUserAgentString(); boolean isAppDarkMode = DarkModeUtils.isDarkMode(activity); + if (WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) { + WebSettingsCompat.setAlgorithmicDarkeningAllowed(webSetting, isAppDarkMode); + } if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - WebView wv = mWebView; if (isAppDarkMode) { - WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_ON); + WebSettingsCompat.setForceDark(webSetting, WebSettingsCompat.FORCE_DARK_ON); } else { - WebSettingsCompat.setForceDark(wv.getSettings(), WebSettingsCompat.FORCE_DARK_OFF); + WebSettingsCompat.setForceDark(webSetting, WebSettingsCompat.FORCE_DARK_OFF); } - } else { } jsInjector = new JsInjector(mWebView); jsInjector.attach(); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java index ea0cc8d9..82717ee9 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java @@ -3,14 +3,17 @@ import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; +import android.content.MutableContextWrapper; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.view.ViewGroup; import android.view.ViewParent; import android.webkit.CookieManager; +import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; +import android.webkit.WebViewClient; import androidx.annotation.NonNull; @@ -25,9 +28,12 @@ public class WebInstance { private final Application mApplication; private final List mCache = new ArrayList<>(1); + private final WebChromeClient mEmptyWebChromeClient = new WebChromeClient(); + private final WebViewClient mEmptyWebViewClient = new WebViewClient(); + private WebInstance(@NonNull Application application) { mApplication = application; - WebView webView = create(); + WebView webView = create(application); mCache.add(webView); } @@ -41,11 +47,15 @@ public static WebInstance getInstance(@NonNull Context context) { @SuppressLint("SetJavaScriptEnabled") @NonNull - public WebView obtain() { + public WebView obtain(Context context) { if (mCache.isEmpty()) { - return create(); + return create(context); } WebView webView = mCache.remove(0); + if (webView instanceof CustomWebView) { + CustomWebView customWebView = (CustomWebView) webView; + customWebView.setBaseContext(context); + } WebSettings webSetting = webView.getSettings(); webSetting.setJavaScriptEnabled(true); webView.clearHistory(); @@ -54,6 +64,10 @@ public WebView obtain() { } public void recycle(@NonNull WebView webView) { + if (webView instanceof CustomWebView) { + CustomWebView customWebView = (CustomWebView) webView; + customWebView.setBaseContext(mApplication); + } ViewParent parent = webView.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(webView); @@ -68,8 +82,8 @@ public void recycle(@NonNull WebView webView) { WebSettings webSetting = webView.getSettings(); webSetting.setJavaScriptEnabled(false); webView.pauseTimers(); - webView.setWebChromeClient(null); - webView.setWebViewClient(null); + webView.setWebChromeClient(mEmptyWebChromeClient); + webView.setWebViewClient(mEmptyWebViewClient); clearListeners(webView); } catch (Exception ignore) { } finally { @@ -91,8 +105,8 @@ public void destroy(@NonNull WebView webView) { } @SuppressLint("SetJavaScriptEnabled") - public WebView create() { - WebView webView = new CustomWebView(mApplication); + public WebView create(Context context) { + WebView webView = new CustomWebView(new MutableContextWrapper(context)); webView.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); webView.setBackgroundColor(0); webView.getBackground().setAlpha(0); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java b/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java index 79e76f2a..b6949dfc 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java @@ -1,12 +1,14 @@ package per.goweii.wanandroid.utils.web.view; import android.content.Context; +import android.content.MutableContextWrapper; import android.util.AttributeSet; import android.view.MotionEvent; import android.webkit.WebView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.view.ContextThemeWrapper; import androidx.core.view.ScrollingView; import per.goweii.wanandroid.utils.web.WebScrollableUtils; @@ -20,24 +22,13 @@ public class CustomWebView extends WebView implements ScrollingView { private Float touchX = null; private Float touchY = null; - public CustomWebView(@NonNull Context context) { + public CustomWebView(@NonNull MutableContextWrapper context) { super(context); } - public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - } - - public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) { - super(context, attrs, defStyleAttr, privateBrowsing); + public void setBaseContext(Context context) { + final MutableContextWrapper contextWrapper = (MutableContextWrapper) this.getContext(); + contextWrapper.setBaseContext(context); } @Override From 48dd377999ea9f5956b933b2cea9bc13d84dcbce Mon Sep 17 00:00:00 2001 From: goweii Date: Fri, 20 Jun 2025 00:04:18 +0800 Subject: [PATCH 16/30] =?UTF-8?q?feat:=20=E8=87=AA=E5=AE=9A=E4=B9=89webvie?= =?UTF-8?q?w=E6=BB=9A=E5=8A=A8=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wanandroid/utils/web/WebHolder.java | 33 +++++----- .../wanandroid/utils/web/WebInstance.java | 35 +++++------ .../utils/web/WebScrollableUtils.kt | 4 +- ...ustomWebView.java => ResuableWebView.java} | 62 +++++++++++++++++-- .../utils/web/view/WebContainer.java | 2 +- 5 files changed, 91 insertions(+), 45 deletions(-) rename app/src/main/java/per/goweii/wanandroid/utils/web/view/{CustomWebView.java => ResuableWebView.java} (59%) diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java index 6da2c61e..e499a70e 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebHolder.java @@ -59,6 +59,7 @@ import per.goweii.wanandroid.utils.DarkModeUtils; import per.goweii.wanandroid.utils.SettingUtils; import per.goweii.wanandroid.utils.web.js.JsInjector; +import per.goweii.wanandroid.utils.web.view.ResuableWebView; import per.goweii.wanandroid.utils.web.view.WebContainer; /** @@ -80,7 +81,7 @@ public class WebHolder { private final Activity mActivity; private final WebContainer mWebContainer; - private final WebView mWebView; + private final ResuableWebView mWebView; private final ProgressBar mProgressBar; private final String mUserAgentString; @@ -199,24 +200,22 @@ public boolean onLongClick(View v) { } } }); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mWebView.setOnScrollChangeListener(new View.OnScrollChangeListener() { - @Override - public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { - if (isProgressShown) return; - float percent = getPercent(); - if (mOnPageScrollChangeListener != null) { - mOnPageScrollChangeListener.onPageScrolled(percent); - } - if (!isPageScrollEnd && percent >= 0.95) { - isPageScrollEnd = true; - if (mOnPageScrollEndListener != null) { - mOnPageScrollEndListener.onPageScrollEnd(); - } + mWebView.addOnScrollChangeListener(new ResuableWebView.OnScrollChangeListener() { + @Override + public void onScrollChange(@NonNull ResuableWebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + if (isProgressShown) return; + float percent = getPercent(); + if (mOnPageScrollChangeListener != null) { + mOnPageScrollChangeListener.onPageScrolled(percent); + } + if (!isPageScrollEnd && percent >= 0.95) { + isPageScrollEnd = true; + if (mOnPageScrollEndListener != null) { + mOnPageScrollEndListener.onPageScrollEnd(); } } - }); - } + } + }); WebSettings webSetting = mWebView.getSettings(); mUserAgentString = webSetting.getUserAgentString(); boolean isAppDarkMode = DarkModeUtils.isDarkMode(activity); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java index 82717ee9..2dea3ede 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebInstance.java @@ -16,24 +16,25 @@ import android.webkit.WebViewClient; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import per.goweii.wanandroid.utils.web.view.CustomWebView; +import per.goweii.wanandroid.utils.web.view.ResuableWebView; public class WebInstance { private static WebInstance sInstance = null; private final Application mApplication; - private final List mCache = new ArrayList<>(1); + private final List mCache = new ArrayList<>(1); private final WebChromeClient mEmptyWebChromeClient = new WebChromeClient(); private final WebViewClient mEmptyWebViewClient = new WebViewClient(); private WebInstance(@NonNull Application application) { mApplication = application; - WebView webView = create(application); + ResuableWebView webView = create(application); mCache.add(webView); } @@ -47,14 +48,13 @@ public static WebInstance getInstance(@NonNull Context context) { @SuppressLint("SetJavaScriptEnabled") @NonNull - public WebView obtain(Context context) { + public ResuableWebView obtain(@Nullable Context context) { if (mCache.isEmpty()) { return create(context); } - WebView webView = mCache.remove(0); - if (webView instanceof CustomWebView) { - CustomWebView customWebView = (CustomWebView) webView; - customWebView.setBaseContext(context); + ResuableWebView webView = mCache.remove(0); + if (context != null) { + webView.setBaseContext(context); } WebSettings webSetting = webView.getSettings(); webSetting.setJavaScriptEnabled(true); @@ -63,11 +63,8 @@ public WebView obtain(Context context) { return webView; } - public void recycle(@NonNull WebView webView) { - if (webView instanceof CustomWebView) { - CustomWebView customWebView = (CustomWebView) webView; - customWebView.setBaseContext(mApplication); - } + public void recycle(@NonNull ResuableWebView webView) { + webView.setBaseContext(mApplication); ViewParent parent = webView.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(webView); @@ -93,7 +90,7 @@ public void recycle(@NonNull WebView webView) { } } - public void destroy(@NonNull WebView webView) { + public void destroy(@NonNull ResuableWebView webView) { recycle(webView); try { webView.removeAllViews(); @@ -105,8 +102,8 @@ public void destroy(@NonNull WebView webView) { } @SuppressLint("SetJavaScriptEnabled") - public WebView create(Context context) { - WebView webView = new CustomWebView(new MutableContextWrapper(context)); + public ResuableWebView create(@Nullable Context context) { + ResuableWebView webView = new ResuableWebView(new MutableContextWrapper(context != null ? context : mApplication)); webView.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); webView.setBackgroundColor(0); webView.getBackground().setAlpha(0); @@ -134,7 +131,7 @@ public WebView create(Context context) { } @SuppressLint("ClickableViewAccessibility") - private void clearListeners(@NonNull WebView webView) { + private void clearListeners(@NonNull ResuableWebView webView) { webView.setDownloadListener(null); webView.setFindListener(null); webView.setPictureListener(null); @@ -147,8 +144,6 @@ private void clearListeners(@NonNull WebView webView) { webView.setOnFocusChangeListener(null); webView.setOnApplyWindowInsetsListener(null); webView.setOnSystemUiVisibilityChangeListener(null); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - webView.setOnScrollChangeListener(null); - } + webView.clearOnScrollChangeListeners(); } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt index f5dfd58a..b1575330 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/WebScrollableUtils.kt @@ -2,7 +2,7 @@ package per.goweii.wanandroid.utils.web import android.webkit.ValueCallback import per.goweii.basic.utils.LogUtils -import per.goweii.wanandroid.utils.web.view.CustomWebView +import per.goweii.wanandroid.utils.web.view.ResuableWebView import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock @@ -12,7 +12,7 @@ object WebScrollableUtils { const val DIRECTION_LEFT = 4 const val DIRECTION_RIGHT = 8 - fun getScrollableDirections(webView: CustomWebView, x: Float, y: Float): Int { + fun getScrollableDirections(webView: ResuableWebView, x: Float, y: Float): Int { if (true) return 0 val density: Float = webView.resources.displayMetrics.density diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java b/app/src/main/java/per/goweii/wanandroid/utils/web/view/ResuableWebView.java similarity index 59% rename from app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java rename to app/src/main/java/per/goweii/wanandroid/utils/web/view/ResuableWebView.java index b6949dfc..04704ea2 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/view/CustomWebView.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/view/ResuableWebView.java @@ -4,13 +4,17 @@ import android.content.MutableContextWrapper; import android.util.AttributeSet; import android.view.MotionEvent; +import android.view.View; import android.webkit.WebView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.view.ContextThemeWrapper; import androidx.core.view.ScrollingView; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + import per.goweii.wanandroid.utils.web.WebScrollableUtils; /** @@ -18,15 +22,32 @@ * @date 2019/11/30 * GitHub: https://github.com/goweii */ -public class CustomWebView extends WebView implements ScrollingView { +public class ResuableWebView extends WebView implements ScrollingView { + private final List mOnScrollChangeListeners = new LinkedList<>(); private Float touchX = null; private Float touchY = null; - public CustomWebView(@NonNull MutableContextWrapper context) { - super(context); + public ResuableWebView(@NonNull Context context) { + super(new MutableContextWrapper(context)); + } + + public ResuableWebView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(new MutableContextWrapper(context), attrs); + } + + public ResuableWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(new MutableContextWrapper(context), attrs, defStyleAttr); + } + + public ResuableWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(new MutableContextWrapper(context), attrs, defStyleAttr, defStyleRes); + } + + public ResuableWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) { + super(new MutableContextWrapper(context), attrs, defStyleAttr, privateBrowsing); } - public void setBaseContext(Context context) { + public void setBaseContext(@NonNull Context context) { final MutableContextWrapper contextWrapper = (MutableContextWrapper) this.getContext(); contextWrapper.setBaseContext(context); } @@ -53,6 +74,33 @@ public void scrollBy(int x, int y) { super.scrollBy(x, y); } + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + for (int i = 0; i < mOnScrollChangeListeners.size(); i++) { + OnScrollChangeListener listener = mOnScrollChangeListeners.get(i); + if (listener != null) { + listener.onScrollChange(this, l, t, oldl, oldt); + } + } + } + + public void addOnScrollChangeListener(OnScrollChangeListener l) { + if (l != null) { + mOnScrollChangeListeners.add(l); + } + } + + public void removeOnScrollChangeListener(OnScrollChangeListener l) { + if (l != null) { + mOnScrollChangeListeners.remove(l); + } + } + + public void clearOnScrollChangeListeners() { + mOnScrollChangeListeners.clear(); + } + @Override public boolean canScrollHorizontally(int direction) { if (super.canScrollHorizontally(direction)) { @@ -118,4 +166,8 @@ public int computeVerticalScrollOffset() { public int computeVerticalScrollExtent() { return super.computeVerticalScrollExtent(); } + + public interface OnScrollChangeListener { + void onScrollChange(@NonNull ResuableWebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY); + } } diff --git a/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java b/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java index 939207de..163fa399 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/web/view/WebContainer.java @@ -404,7 +404,7 @@ public View getCurrentWebView() { View child = getChildAt(i); if (child instanceof WebView) { return child; - } else if (child instanceof CustomWebView) { + } else if (child instanceof ResuableWebView) { return child; } } From 73cd30026572088bc46b10f3b629942d73cdb82a Mon Sep 17 00:00:00 2001 From: goweii Date: Fri, 20 Jun 2025 17:45:42 +0800 Subject: [PATCH 17/30] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=B8=BB=E9=A2=98=E6=A8=A1=E5=BC=8F=E9=87=8D=E5=90=AF?= =?UTF-8?q?app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../wanandroid/module/mine/activity/SettingActivity.java | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f5d23a9..131bf6c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -203,7 +203,7 @@ android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" /> + android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" /> diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index 708f6562..b5838863 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -260,12 +260,6 @@ public void onSelect(String data, int pos) { SettingUtils.getInstance().setThemeMode(themeMode); updateThemeModeUI(); DarkModeUtils.initDarkMode(); - v.postDelayed(new Runnable() { - @Override - public void run() { - WanApp.restartApp(); - } - }, 300); } }) .show(); From d1f9eb5d12b2914864a59ad96186dcd041a2f371 Mon Sep 17 00:00:00 2001 From: goweii Date: Fri, 20 Jun 2025 18:06:45 +0800 Subject: [PATCH 18/30] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/mine/activity/LanguageActivity.kt | 40 ++--------------- .../per/goweii/basic/l10n/L10nManager.java | 44 ++++++++++++++++++- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt index b2ccffbd..facd3742 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/LanguageActivity.kt @@ -2,20 +2,15 @@ package per.goweii.wanandroid.module.mine.activity import android.content.Context import android.content.Intent -import android.content.res.XmlResourceParser import android.view.LayoutInflater -import androidx.appcompat.app.AppCompatDelegate -import androidx.core.os.LocaleListCompat import androidx.recyclerview.widget.LinearLayoutManager import per.goweii.basic.core.base.BaseActivity import per.goweii.basic.core.base.BasePresenter -import per.goweii.basic.utils.ResUtils -import per.goweii.wanandroid.R +import per.goweii.basic.l10n.L10nManager import per.goweii.wanandroid.databinding.ActivityLanguageBinding import per.goweii.wanandroid.module.mine.adapter.LanguageAdapter import java.util.Locale - class LanguageActivity : BaseActivity, ActivityLanguageBinding>() { companion object { @JvmStatic @@ -42,43 +37,14 @@ class LanguageActivity : BaseActivity, ActivityLanguageBinding> adapter?.setOnItemClickListener { _, _, position -> val locale = adapter?.getItem(position) - val localeListCompat = if (locale != null) { - LocaleListCompat.create(locale) - } else { - LocaleListCompat.getEmptyLocaleList() - } - AppCompatDelegate.setApplicationLocales(localeListCompat) + L10nManager.setApplicationLocales(locale) } } override fun loadData() { val locales = arrayListOf() locales.add(null) - locales.addAll(getSupportedLocales()) + locales.addAll(L10nManager.getSupportedLocales(this)) adapter?.setNewData(locales) - - } - - private fun getSupportedLocales(): List { - val locales = arrayListOf() - try { - val androidNamespace = "http://schemas.android.com/apk/res/android" - resources.getXml(R.xml.locale_config).use { parser -> - var next = parser.next() - while (next != XmlResourceParser.END_DOCUMENT) { - if (parser.eventType == XmlResourceParser.START_TAG) { - if (parser.name == "locale") { - val name = parser.getAttributeValue(androidNamespace, "name") - locales.add(Locale.forLanguageTag(name)) - } - } - next = parser.next() - } - } - } catch (e: Exception) { - e.printStackTrace() - } - return locales } - } \ No newline at end of file diff --git a/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java b/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java index 497e1c3c..ff7b36e2 100644 --- a/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java +++ b/basic_l10n/src/main/java/per/goweii/basic/l10n/L10nManager.java @@ -1,11 +1,22 @@ package per.goweii.basic.l10n; +import android.content.Context; +import android.content.res.XmlResourceParser; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.os.LocaleListCompat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + public class L10nManager { - public static void setApplicationLocales(@Nullable String languageCode) { + private static final String ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android"; + + public static void setApplicationLocales(@Nullable String languageCode) { LocaleListCompat appLocale; if (languageCode == null || languageCode.isEmpty()) { appLocale = LocaleListCompat.getEmptyLocaleList(); @@ -14,4 +25,35 @@ public static void setApplicationLocales(@Nullable String languageCode) { } AppCompatDelegate.setApplicationLocales(appLocale); } + + public static void setApplicationLocales(@Nullable Locale locale) { + LocaleListCompat appLocale; + if (locale == null) { + appLocale = LocaleListCompat.getEmptyLocaleList(); + } else { + appLocale = LocaleListCompat.create(locale); + } + AppCompatDelegate.setApplicationLocales(appLocale); + } + + @NonNull + public static List getSupportedLocales(@NonNull Context context) { + try (XmlResourceParser parser = context.getResources().getXml(R.xml.locale_config)) { + final List locales = new ArrayList<>(); + int event = parser.next(); + while (event != XmlResourceParser.END_DOCUMENT) { + if (parser.getEventType() == XmlResourceParser.START_TAG) { + if ("locale".equals(parser.getName())) { + String name = parser.getAttributeValue(ANDROID_NAMESPACE, "name"); + locales.add(Locale.forLanguageTag(name)); + } + } + event = parser.next(); + } + return locales; + } catch (Exception e) { + e.printStackTrace(); + } + return Collections.emptyList(); + } } From 9fdf84250e2ef626967bcc08066e3e923d25dcaf Mon Sep 17 00:00:00 2001 From: goweii Date: Fri, 20 Jun 2025 20:40:53 +0800 Subject: [PATCH 19/30] =?UTF-8?q?feat:=20=E4=B8=BB=E9=A2=98=E5=92=8C?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E5=88=87=E6=8D=A2=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 + .../module/mine/activity/LanguageActivity.kt | 8 +- .../module/mine/activity/SettingActivity.java | 41 +++++---- .../recreate_anim/RecreateAnimActivity.kt | 92 +++++++++++++++++++ .../utils/recreate_anim/RecreateAnimation.kt | 12 +++ .../utils/recreate_anim/RecreateSource.kt | 12 +++ app/src/main/res/values/themes.xml | 12 +++ .../goweii/basic/ui/dialog/ListDialog.java | 40 ++++++-- 8 files changed, 196 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimActivity.kt create mode 100644 app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimation.kt create mode 100644 app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateSource.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 131bf6c5..1123ca39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -234,6 +234,11 @@ android:name=".module.mine.activity.LanguageActivity" android:configChanges="keyboard|keyboardHidden|screenSize|fontScale|density|orientation" android:windowSoftInputMode="adjustResize" /> + , ActivityLanguageBinding> adapter?.setOnItemClickListener { _, _, position -> val locale = adapter?.getItem(position) - L10nManager.setApplicationLocales(locale) + LogUtils.e("LanguageActivity", "old decorView is ${window.decorView}") + RecreateAnimation( + activity = this, + trigger = { L10nManager.setApplicationLocales(locale) } + ).start() } } diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index b5838863..97509987 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -1,6 +1,5 @@ package per.goweii.wanandroid.module.mine.activity; -import android.Manifest; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; @@ -13,12 +12,10 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.SwitchCompat; -import androidx.core.app.LocaleManagerCompat; import androidx.core.os.LocaleListCompat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -26,33 +23,24 @@ import butterknife.BindView; import butterknife.OnClick; import butterknife.OnLongClick; -import per.goweii.anypermission.RequestListener; -import per.goweii.anypermission.RuntimeRequester; import per.goweii.basic.core.base.BaseActivity; -import per.goweii.basic.core.permission.PermissionUtils; import per.goweii.basic.ui.dialog.ListDialog; import per.goweii.basic.ui.dialog.TipDialog; -import per.goweii.basic.ui.dialog.UpdateDialog; import per.goweii.basic.ui.toast.ToastMaker; -import per.goweii.basic.utils.AppInfoUtils; -import per.goweii.basic.utils.ResUtils; import per.goweii.basic.utils.listener.SimpleCallback; import per.goweii.rxhttp.request.base.BaseBean; import per.goweii.wanandroid.R; import per.goweii.wanandroid.common.Constant; -import per.goweii.wanandroid.common.WanApp; import per.goweii.wanandroid.databinding.ActivitySettingBinding; import per.goweii.wanandroid.event.LoginEvent; import per.goweii.wanandroid.event.SettingChangeEvent; -import per.goweii.wanandroid.module.main.dialog.DownloadDialog; -import per.goweii.wanandroid.module.main.model.UpdateBean; import per.goweii.wanandroid.module.mine.presenter.SettingPresenter; import per.goweii.wanandroid.module.mine.view.SettingView; import per.goweii.wanandroid.utils.DarkModeUtils; import per.goweii.wanandroid.utils.SettingUtils; -import per.goweii.wanandroid.utils.UpdateUtils; import per.goweii.wanandroid.utils.UrlOpenUtils; import per.goweii.wanandroid.utils.UserUtils; +import per.goweii.wanandroid.utils.recreate_anim.RecreateAnimation; import per.goweii.wanandroid.utils.web.HostInterceptUtils; /** @@ -242,7 +230,7 @@ protected void onClick2(View v) { break; } } - SettingUtils.ThemeMode selectedThemeMode = SettingUtils.getInstance().getThemeMode(); + final SettingUtils.ThemeMode selectedThemeMode = SettingUtils.getInstance().getThemeMode(); final int selectedPos = themeModes.indexOf(selectedThemeMode); ListDialog.with(getContext()) @@ -250,7 +238,7 @@ protected void onClick2(View v) { .title(getString(R.string.theme_mode)) .datas(nameList) .currSelectPos(selectedPos) - .listener(new ListDialog.OnItemSelectedListener() { + .onItemSelectedListener(new ListDialog.OnItemSelectedListener() { @Override public void onSelect(String data, int pos) { if (selectedPos == pos) { @@ -258,8 +246,25 @@ public void onSelect(String data, int pos) { } SettingUtils.ThemeMode themeMode = themeModes.get(pos); SettingUtils.getInstance().setThemeMode(themeMode); - updateThemeModeUI(); - DarkModeUtils.initDarkMode(); + } + }) + .onDismissListener(new ListDialog.OnDismissListener() { + @Override + public void onPreDismiss(String data, int pos) { + } + + @Override + public void onPostDismiss(String data, int pos) { + if (selectedThemeMode == SettingUtils.getInstance().getThemeMode()) { + return; + } + new RecreateAnimation(SettingActivity.this, new Runnable() { + @Override + public void run() { + DarkModeUtils.initDarkMode(); + } + } + ).start(); } }) .show(); @@ -272,7 +277,7 @@ public void onSelect(String data, int pos) { HostInterceptUtils.getName(HostInterceptUtils.TYPE_ONLY_WHITE), HostInterceptUtils.getName(HostInterceptUtils.TYPE_INTERCEPT_BLACK)) .currSelectPos(SettingUtils.getInstance().getUrlInterceptType()) - .listener(new ListDialog.OnItemSelectedListener() { + .onItemSelectedListener(new ListDialog.OnItemSelectedListener() { @Override public void onSelect(String data, int pos) { tv_intercept_host.setText(HostInterceptUtils.getName(pos)); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimActivity.kt b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimActivity.kt new file mode 100644 index 00000000..6c0283e5 --- /dev/null +++ b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimActivity.kt @@ -0,0 +1,92 @@ +package per.goweii.wanandroid.utils.recreate_anim + +import android.app.Activity +import android.content.Intent +import android.graphics.Bitmap +import android.os.Bundle +import android.widget.ImageView +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.doOnPreDraw +import per.goweii.statusbarcompat.StatusBarCompat +import per.goweii.swipeback.SwipeBackAbility + +class RecreateAnimActivity : AppCompatActivity(), SwipeBackAbility.Direction { + companion object { + private var recreateSource: RecreateSource? = null + + internal fun launch(activity: Activity, action: Runnable) { + if (recreateSource != null) { + return + } + + val window = activity.window + val decorView = window.decorView + decorView.isDrawingCacheEnabled = true + val b = decorView.drawingCache + val bitmap = Bitmap.createBitmap(b) + decorView.isDrawingCacheEnabled = false + + recreateSource = RecreateSource( + bitmap = bitmap, + action = action, + ) + + val intent = Intent(activity, RecreateAnimActivity::class.java) + activity.startActivity(intent) + activity.overridePendingTransition(0, 0) + } + } + + private var imageView: ImageView? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + StatusBarCompat.transparent(this) + + if (recreateSource == null) { + finish() + return + } + + val recreateSource = recreateSource!! + + val imageView = ImageView(this) + imageView.scaleType = ImageView.ScaleType.FIT_XY + imageView.setImageBitmap(recreateSource.bitmap) + + this.imageView = imageView + + setContentView(imageView) + + imageView.doOnPreDraw { + recreateSource.action.run() + imageView.post { + imageView.post { + doAnim(imageView) + } + } + } + } + + private fun doAnim(imageView: ImageView) { + imageView.animate() + .setDuration(500) + .alpha(0F) + .withEndAction { + finish() + recreateSource?.recycle() + recreateSource = null + } + .start() + } + + override fun swipeBackDirection(): Int { + return 0 + } + + override fun finish() { + super.finish() + overridePendingTransition(0, 0) + } +} \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimation.kt b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimation.kt new file mode 100644 index 00000000..d12fa79c --- /dev/null +++ b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateAnimation.kt @@ -0,0 +1,12 @@ +package per.goweii.wanandroid.utils.recreate_anim + +import android.app.Activity + +class RecreateAnimation( + private val activity: Activity, + private val trigger: Runnable, +) { + fun start() { + RecreateAnimActivity.launch(activity, trigger) + } +} \ No newline at end of file diff --git a/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateSource.kt b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateSource.kt new file mode 100644 index 00000000..65fa3c76 --- /dev/null +++ b/app/src/main/java/per/goweii/wanandroid/utils/recreate_anim/RecreateSource.kt @@ -0,0 +1,12 @@ +package per.goweii.wanandroid.utils.recreate_anim + +import android.graphics.Bitmap + +internal data class RecreateSource( + val bitmap: Bitmap, + val action: Runnable, +) { + fun recycle() { + bitmap.recycle() + } +} \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 04c07e70..f0dc536a 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -29,6 +29,18 @@ @null + + diff --git a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java index 172c5f09..3cedaf6b 100644 --- a/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java +++ b/basic_ui/src/main/java/per/goweii/basic/ui/dialog/ListDialog.java @@ -38,7 +38,8 @@ public class ListDialog { private boolean noBtn = false; private boolean singleBtnYes = false; private boolean cancelable = true; - private OnItemSelectedListener listener = null; + private OnItemSelectedListener onItemSelectedListener = null; + private OnDismissListener onDismissListener = null; private BaseQuickAdapter mAdapter = null; private List datas = new ArrayList<>(); private int currSelectPos = -1; @@ -110,8 +111,13 @@ public ListDialog currSelectPos(int currSelectPos) { return this; } - public ListDialog listener(OnItemSelectedListener listener) { - this.listener = listener; + public ListDialog onItemSelectedListener(OnItemSelectedListener listener) { + this.onItemSelectedListener = listener; + return this; + } + + public ListDialog onDismissListener(OnDismissListener listener) { + this.onDismissListener = listener; return this; } @@ -187,8 +193,8 @@ public void onItemClick(BaseQuickAdapter adapter, View view, int position) { currSelectPos = position; adapter.notifyDataSetChanged(); if (noBtn) { - if (listener != null) { - listener.onSelect(datas.get(currSelectPos), currSelectPos); + if (onItemSelectedListener != null) { + onItemSelectedListener.onSelect(datas.get(currSelectPos), currSelectPos); } layer.dismiss(); } @@ -201,15 +207,35 @@ public void onItemClick(BaseQuickAdapter adapter, View view, int position) { .addOnClickToDismissListener(new Layer.OnClickListener() { @Override public void onClick(@NonNull Layer layer, @NonNull View v) { - if (listener != null) { - listener.onSelect(datas.get(currSelectPos), currSelectPos); + if (onItemSelectedListener != null) { + onItemSelectedListener.onSelect(datas.get(currSelectPos), currSelectPos); } } }, R.id.basic_ui_tv_dialog_list_yes) .addOnClickToDismissListener(R.id.basic_ui_tv_dialog_list_no) + .addOnDismissListener(new Layer.OnDismissListener() { + @Override + public void onPreDismiss(@NonNull Layer layer) { + if (onDismissListener != null) { + onDismissListener.onPreDismiss(datas.get(currSelectPos), currSelectPos); + } + } + + @Override + public void onPostDismiss(@NonNull Layer layer) { + if (onDismissListener != null) { + onDismissListener.onPostDismiss(datas.get(currSelectPos), currSelectPos); + } + } + }) .show(); } + public interface OnDismissListener { + void onPreDismiss(String data, int pos); + void onPostDismiss(String data, int pos); + } + public interface OnItemSelectedListener { void onSelect(String data, int pos); } From 9fcc08fd55dab5b01a604bb6ff74780955eca599 Mon Sep 17 00:00:00 2001 From: goweii Date: Sat, 21 Jun 2025 15:58:27 +0800 Subject: [PATCH 20/30] =?UTF-8?q?fix:=20=E4=B8=BB=E9=A2=98bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../per/goweii/wanandroid/common/InitTasks.kt | 2 +- .../module/main/activity/CrashActivity.kt | 2 +- .../module/mine/activity/SettingActivity.java | 2 +- .../wanandroid/utils/DarkModeUtils.java | 21 +++++++++++++++++-- .../src/main/res/values-night/themes.xml | 2 ++ basic_res/src/main/res/values/themes.xml | 2 ++ 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt index e047f872..6963a29b 100644 --- a/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt +++ b/app/src/main/java/per/goweii/wanandroid/common/InitTasks.kt @@ -66,7 +66,7 @@ class CookieManagerInitTask : SyncInitTask() { class NightModeInitTask : SyncInitTask() { override fun init(application: Application) { - DarkModeUtils.initDarkMode() + DarkModeUtils.initDarkMode(application) } override fun onlyMainProcess(): Boolean { diff --git a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt index 11f7d2fd..118fab82 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt +++ b/app/src/main/java/per/goweii/wanandroid/module/main/activity/CrashActivity.kt @@ -28,7 +28,7 @@ class CrashActivity : AppCompatActivity() { View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window.statusBarColor = Color.TRANSPARENT - DarkModeUtils.initDarkMode() + DarkModeUtils.initDarkMode(this) StatusBarCompat.setIconMode(this, !DarkModeUtils.isDarkMode(this)) binding = ActivityCrashBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java index 97509987..914d8b32 100644 --- a/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java +++ b/app/src/main/java/per/goweii/wanandroid/module/mine/activity/SettingActivity.java @@ -261,7 +261,7 @@ public void onPostDismiss(String data, int pos) { new RecreateAnimation(SettingActivity.this, new Runnable() { @Override public void run() { - DarkModeUtils.initDarkMode(); + DarkModeUtils.initDarkMode(SettingActivity.this); } } ).start(); diff --git a/app/src/main/java/per/goweii/wanandroid/utils/DarkModeUtils.java b/app/src/main/java/per/goweii/wanandroid/utils/DarkModeUtils.java index 7e171e09..aee0a919 100644 --- a/app/src/main/java/per/goweii/wanandroid/utils/DarkModeUtils.java +++ b/app/src/main/java/per/goweii/wanandroid/utils/DarkModeUtils.java @@ -1,7 +1,9 @@ package per.goweii.wanandroid.utils; +import android.app.UiModeManager; import android.content.Context; import android.content.res.Configuration; +import android.os.Build; import androidx.appcompat.app.AppCompatDelegate; @@ -20,8 +22,23 @@ public static boolean isDarkMode(Context context) { return isDarkMode(context.getResources().getConfiguration()); } - public static void initDarkMode() { - switch (SettingUtils.getInstance().getThemeMode()) { + public static void initDarkMode(Context context) { + SettingUtils.ThemeMode themeMode = SettingUtils.getInstance().getThemeMode(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE); + switch (themeMode) { + case FOLLOW_SYSTEM: + uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_AUTO); + break; + case LIGHT: + uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_NO); + break; + case DARK: + uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES); + break; + } + } + switch (themeMode) { case FOLLOW_SYSTEM: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); break; diff --git a/basic_res/src/main/res/values-night/themes.xml b/basic_res/src/main/res/values-night/themes.xml index e5d52f13..1d530357 100644 --- a/basic_res/src/main/res/values-night/themes.xml +++ b/basic_res/src/main/res/values-night/themes.xml @@ -2,6 +2,8 @@