fix: 迁移 DataStore

This commit is contained in:
HuanCheng65 2022-08-05 16:34:17 +08:00
parent 45c0fcf721
commit 54bd414e52
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
14 changed files with 314 additions and 301 deletions

View File

@ -5,6 +5,7 @@ import androidx.datastore.core.DataStore
import androidx.datastore.preferences.SharedPreferencesMigration import androidx.datastore.preferences.SharedPreferencesMigration
import androidx.datastore.preferences.core.* import androidx.datastore.preferences.core.*
import androidx.datastore.preferences.preferencesDataStore import androidx.datastore.preferences.preferencesDataStore
import androidx.preference.PreferenceDataStore
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
@ -42,6 +43,14 @@ fun DataStore<Preferences>.putBoolean(key: String, value: Boolean) {
} }
} }
fun DataStore<Preferences>.putInt(key: String, value: Int) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[intPreferencesKey(key)] = value
}
}
}
fun DataStore<Preferences>.getInt(key: String, defaultValue: Int): Int { fun DataStore<Preferences>.getInt(key: String, defaultValue: Int): Int {
var resultValue = defaultValue var resultValue = defaultValue
@ -135,3 +144,88 @@ fun DataStore<Preferences>.getLong(key: String, defaultValue: Long): Long {
return resultValue return resultValue
} }
class DataStorePreference : PreferenceDataStore() {
override fun putString(key: String, value: String?) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
if (value == null) {
it.remove(stringPreferencesKey(key))
} else {
it[stringPreferencesKey(key)] = value
}
}
}
}
override fun putStringSet(key: String, values: MutableSet<String>?) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
if (values == null) {
it.remove(stringSetPreferencesKey(key))
} else {
it[stringSetPreferencesKey(key)] = values
}
}
}
}
override fun putInt(key: String, value: Int) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[intPreferencesKey(key)] = value
}
}
}
override fun putLong(key: String, value: Long) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[longPreferencesKey(key)] = value
}
}
}
override fun putFloat(key: String, value: Float) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[floatPreferencesKey(key)] = value
}
}
}
override fun putBoolean(key: String, value: Boolean) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[booleanPreferencesKey(key)] = value
}
}
}
override fun getString(key: String, defValue: String?): String? {
return BaseApplication.INSTANCE.dataStore.getString(key) ?: defValue
}
override fun getStringSet(
key: String,
defValues: MutableSet<String>?
): MutableSet<String>? {
return BaseApplication.INSTANCE.dataStore.getStringSet(key, defValues)
}
override fun getInt(key: String, defValue: Int): Int {
return BaseApplication.INSTANCE.dataStore.getInt(key, defValue)
}
override fun getLong(key: String, defValue: Long): Long {
return BaseApplication.INSTANCE.dataStore.getLong(key, defValue)
}
override fun getFloat(key: String, defValue: Float): Float {
return BaseApplication.INSTANCE.dataStore.getFloat(key, defValue)
}
override fun getBoolean(key: String, defValue: Boolean): Boolean {
return BaseApplication.INSTANCE.dataStore.getBoolean(key, defValue)
}
}

View File

@ -43,7 +43,7 @@ import com.google.android.material.button.MaterialButton
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.*
import com.huanchengfly.tieba.post.adapters.FragmentTabViewPagerAdapter import com.huanchengfly.tieba.post.adapters.FragmentTabViewPagerAdapter
import com.huanchengfly.tieba.post.adapters.SingleChooseAdapter import com.huanchengfly.tieba.post.adapters.SingleChooseAdapter
import com.huanchengfly.tieba.post.api.ForumSortType import com.huanchengfly.tieba.post.api.ForumSortType
@ -53,15 +53,12 @@ import com.huanchengfly.tieba.post.api.models.ForumPageBean
import com.huanchengfly.tieba.post.api.models.LikeForumResultBean import com.huanchengfly.tieba.post.api.models.LikeForumResultBean
import com.huanchengfly.tieba.post.api.retrofit.doIfFailure import com.huanchengfly.tieba.post.api.retrofit.doIfFailure
import com.huanchengfly.tieba.post.api.retrofit.doIfSuccess import com.huanchengfly.tieba.post.api.retrofit.doIfSuccess
import com.huanchengfly.tieba.post.dpToPxFloat
import com.huanchengfly.tieba.post.fragments.ForumFragment import com.huanchengfly.tieba.post.fragments.ForumFragment
import com.huanchengfly.tieba.post.fragments.ForumFragment.OnRefreshedListener import com.huanchengfly.tieba.post.fragments.ForumFragment.OnRefreshedListener
import com.huanchengfly.tieba.post.goToActivity
import com.huanchengfly.tieba.post.interfaces.Refreshable import com.huanchengfly.tieba.post.interfaces.Refreshable
import com.huanchengfly.tieba.post.interfaces.ScrollTopable import com.huanchengfly.tieba.post.interfaces.ScrollTopable
import com.huanchengfly.tieba.post.models.PhotoViewBean import com.huanchengfly.tieba.post.models.PhotoViewBean
import com.huanchengfly.tieba.post.models.database.History import com.huanchengfly.tieba.post.models.database.History
import com.huanchengfly.tieba.post.toastShort
import com.huanchengfly.tieba.post.ui.common.animation.addMaskAnimation import com.huanchengfly.tieba.post.ui.common.animation.addMaskAnimation
import com.huanchengfly.tieba.post.ui.common.animation.addZoomAnimation import com.huanchengfly.tieba.post.ui.common.animation.addZoomAnimation
import com.huanchengfly.tieba.post.ui.common.animation.buildPressAnimator import com.huanchengfly.tieba.post.ui.common.animation.buildPressAnimator
@ -210,8 +207,7 @@ class ForumActivity : BaseActivity(), View.OnClickListener, OnRefreshedListener,
private fun getSortType(): ForumSortType { private fun getSortType(): ForumSortType {
val defaultSortType = appPreferences.defaultSortType!!.toInt() val defaultSortType = appPreferences.defaultSortType!!.toInt()
return ForumSortType.valueOf( return ForumSortType.valueOf(
SharedPreferencesUtil.get(this, SharedPreferencesUtil.SP_SETTINGS) dataStore.getInt(forumName + "_sort_type", defaultSortType)
.getInt(forumName + "_sort_type", defaultSortType)
) )
} }
@ -223,10 +219,7 @@ class ForumActivity : BaseActivity(), View.OnClickListener, OnRefreshedListener,
} }
} }
refresh() refresh()
SharedPreferencesUtil.get(this, SharedPreferencesUtil.SP_SETTINGS) dataStore.putInt(forumName + "_sort_type", sortType.value)
.edit()
.putInt(forumName + "_sort_type", sortType.value)
.apply()
} }
private fun refresh() { private fun refresh() {

View File

@ -21,11 +21,11 @@ import com.huanchengfly.tieba.post.api.models.PersonalizedBean;
import com.huanchengfly.tieba.post.components.MyViewHolder; import com.huanchengfly.tieba.post.components.MyViewHolder;
import com.huanchengfly.tieba.post.components.dialogs.DislikeDialog; import com.huanchengfly.tieba.post.components.dialogs.DislikeDialog;
import com.huanchengfly.tieba.post.models.PhotoViewBean; import com.huanchengfly.tieba.post.models.PhotoViewBean;
import com.huanchengfly.tieba.post.utils.AppPreferencesUtilsKt;
import com.huanchengfly.tieba.post.utils.DateTimeUtils; import com.huanchengfly.tieba.post.utils.DateTimeUtils;
import com.huanchengfly.tieba.post.utils.DisplayUtil; import com.huanchengfly.tieba.post.utils.DisplayUtil;
import com.huanchengfly.tieba.post.utils.ImageUtil; import com.huanchengfly.tieba.post.utils.ImageUtil;
import com.huanchengfly.tieba.post.utils.NavigationHelper; import com.huanchengfly.tieba.post.utils.NavigationHelper;
import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil;
import com.huanchengfly.tieba.post.utils.Util; import com.huanchengfly.tieba.post.utils.Util;
import com.huanchengfly.tieba.post.widgets.MarkedImageView; import com.huanchengfly.tieba.post.widgets.MarkedImageView;
import com.huanchengfly.tieba.post.widgets.VideoPlayerStandard; import com.huanchengfly.tieba.post.widgets.VideoPlayerStandard;
@ -243,7 +243,7 @@ public class PersonalizedFeedAdapter extends BaseMultiTypeAdapter<PersonalizedBe
case TYPE_THREAD_MULTI_PIC: case TYPE_THREAD_MULTI_PIC:
GridLayout gridLayout = viewHolder.getView(R.id.forum_item_content_pics); GridLayout gridLayout = viewHolder.getView(R.id.forum_item_content_pics);
CardView cardView = viewHolder.getView(R.id.forum_item_content_pics_card); CardView cardView = viewHolder.getView(R.id.forum_item_content_pics_card);
cardView.setRadius(DisplayUtil.dp2px(getContext(), SharedPreferencesUtil.get(getContext(), SharedPreferencesUtil.SP_SETTINGS).getInt("radius", 8))); cardView.setRadius(DisplayUtil.dp2px(getContext(), AppPreferencesUtilsKt.getAppPreferences(getContext()).getRadius()));
MarkedImageView firstImageView = viewHolder.getView(R.id.forum_item_content_pic_1); MarkedImageView firstImageView = viewHolder.getView(R.id.forum_item_content_pic_1);
MarkedImageView secondImageView = viewHolder.getView(R.id.forum_item_content_pic_2); MarkedImageView secondImageView = viewHolder.getView(R.id.forum_item_content_pic_2);
MarkedImageView thirdImageView = viewHolder.getView(R.id.forum_item_content_pic_3); MarkedImageView thirdImageView = viewHolder.getView(R.id.forum_item_content_pic_3);

View File

@ -27,12 +27,12 @@ import com.huanchengfly.tieba.post.adapters.base.BaseMultiTypeDelegateAdapter;
import com.huanchengfly.tieba.post.api.models.ForumPageBean; import com.huanchengfly.tieba.post.api.models.ForumPageBean;
import com.huanchengfly.tieba.post.components.MyViewHolder; import com.huanchengfly.tieba.post.components.MyViewHolder;
import com.huanchengfly.tieba.post.models.PhotoViewBean; import com.huanchengfly.tieba.post.models.PhotoViewBean;
import com.huanchengfly.tieba.post.utils.AppPreferencesUtilsKt;
import com.huanchengfly.tieba.post.utils.BlockUtil; import com.huanchengfly.tieba.post.utils.BlockUtil;
import com.huanchengfly.tieba.post.utils.DateTimeUtils; import com.huanchengfly.tieba.post.utils.DateTimeUtils;
import com.huanchengfly.tieba.post.utils.DisplayUtil; import com.huanchengfly.tieba.post.utils.DisplayUtil;
import com.huanchengfly.tieba.post.utils.ImageUtil; import com.huanchengfly.tieba.post.utils.ImageUtil;
import com.huanchengfly.tieba.post.utils.NavigationHelper; import com.huanchengfly.tieba.post.utils.NavigationHelper;
import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil;
import com.huanchengfly.tieba.post.utils.StringUtil; import com.huanchengfly.tieba.post.utils.StringUtil;
import com.huanchengfly.tieba.post.utils.Util; import com.huanchengfly.tieba.post.utils.Util;
import com.huanchengfly.tieba.post.utils.preload.PreloadUtil; import com.huanchengfly.tieba.post.utils.preload.PreloadUtil;
@ -256,7 +256,12 @@ public class NewForumAdapter extends BaseMultiTypeDelegateAdapter<ForumPageBean.
case TYPE_THREAD_MULTI_PIC: case TYPE_THREAD_MULTI_PIC:
GridLayout gridLayout = viewHolder.getView(R.id.forum_item_content_pics); GridLayout gridLayout = viewHolder.getView(R.id.forum_item_content_pics);
CardView cardView = viewHolder.getView(R.id.forum_item_content_pics_card); CardView cardView = viewHolder.getView(R.id.forum_item_content_pics_card);
cardView.setRadius(DisplayUtil.dp2px(getContext(), SharedPreferencesUtil.get(getContext(), SharedPreferencesUtil.SP_SETTINGS).getInt("radius", 8))); cardView.setRadius(
DisplayUtil.dp2px(
getContext(),
AppPreferencesUtilsKt.getAppPreferences(getContext()).getRadius()
)
);
MarkedImageView firstImageView = viewHolder.getView(R.id.forum_item_content_pic_1); MarkedImageView firstImageView = viewHolder.getView(R.id.forum_item_content_pic_1);
MarkedImageView secondImageView = viewHolder.getView(R.id.forum_item_content_pic_2); MarkedImageView secondImageView = viewHolder.getView(R.id.forum_item_content_pic_2);
MarkedImageView thirdImageView = viewHolder.getView(R.id.forum_item_content_pic_3); MarkedImageView thirdImageView = viewHolder.getView(R.id.forum_item_content_pic_3);

View File

@ -33,6 +33,7 @@ import com.huanchengfly.tieba.post.components.MyViewHolder
import com.huanchengfly.tieba.post.interfaces.Refreshable import com.huanchengfly.tieba.post.interfaces.Refreshable
import com.huanchengfly.tieba.post.models.database.TopForum import com.huanchengfly.tieba.post.models.database.TopForum
import com.huanchengfly.tieba.post.utils.* import com.huanchengfly.tieba.post.utils.*
import com.huanchengfly.tieba.post.utils.ThemeUtil.dataStore
import com.huanchengfly.tieba.post.utils.preload.PreloadUtil import com.huanchengfly.tieba.post.utils.preload.PreloadUtil
import com.huanchengfly.tieba.post.utils.preload.loaders.ForumLoader import com.huanchengfly.tieba.post.utils.preload.loaders.ForumLoader
import com.scwang.smart.refresh.header.MaterialHeader import com.scwang.smart.refresh.header.MaterialHeader
@ -148,8 +149,7 @@ class MainForumListFragment : BaseFragment(), Refreshable, Toolbar.OnMenuItemCli
private fun getSortType(forumName: String): ForumSortType { private fun getSortType(forumName: String): ForumSortType {
val defaultSortType = appPreferences.defaultSortType!!.toInt() val defaultSortType = appPreferences.defaultSortType!!.toInt()
return ForumSortType.valueOf( return ForumSortType.valueOf(
SharedPreferencesUtil.get(attachContext, SharedPreferencesUtil.SP_SETTINGS) dataStore.getInt(forumName + "_sort_type", defaultSortType)
.getInt(forumName + "_sort_type", defaultSortType)
) )
} }

View File

@ -12,10 +12,12 @@ import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.datastore.preferences.core.* import androidx.preference.EditTextPreference
import androidx.preference.* import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.SwitchPreference
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.huanchengfly.tieba.post.* import com.huanchengfly.tieba.post.DataStorePreference
import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.R
import com.huanchengfly.tieba.post.activities.BlockListActivity import com.huanchengfly.tieba.post.activities.BlockListActivity
import com.huanchengfly.tieba.post.activities.LoginActivity import com.huanchengfly.tieba.post.activities.LoginActivity
@ -23,11 +25,9 @@ import com.huanchengfly.tieba.post.components.prefs.TimePickerPreference
import com.huanchengfly.tieba.post.fragments.preference.PreferencesFragment import com.huanchengfly.tieba.post.fragments.preference.PreferencesFragment
import com.huanchengfly.tieba.post.models.database.Account import com.huanchengfly.tieba.post.models.database.Account
import com.huanchengfly.tieba.post.models.database.Block import com.huanchengfly.tieba.post.models.database.Block
import com.huanchengfly.tieba.post.toastShort
import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils
import com.huanchengfly.tieba.post.utils.* import com.huanchengfly.tieba.post.utils.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
class PreferencesFragment : PreferencesFragment() { class PreferencesFragment : PreferencesFragment() {
private var loginInfo: Account? = null private var loginInfo: Account? = null
@ -297,89 +297,4 @@ class PreferencesFragment : PreferencesFragment() {
companion object { companion object {
const val TAG = "PreferencesFragment" const val TAG = "PreferencesFragment"
} }
class DataStorePreference : PreferenceDataStore() {
override fun putString(key: String, value: String?) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
if (value == null) {
it.remove(stringPreferencesKey(key))
} else {
it[stringPreferencesKey(key)] = value
}
}
}
}
override fun putStringSet(key: String, values: MutableSet<String>?) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
if (values == null) {
it.remove(stringSetPreferencesKey(key))
} else {
it[stringSetPreferencesKey(key)] = values
}
}
}
}
override fun putInt(key: String, value: Int) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[intPreferencesKey(key)] = value
}
}
}
override fun putLong(key: String, value: Long) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[longPreferencesKey(key)] = value
}
}
}
override fun putFloat(key: String, value: Float) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[floatPreferencesKey(key)] = value
}
}
}
override fun putBoolean(key: String, value: Boolean) {
MainScope().launch(Dispatchers.IO) {
BaseApplication.INSTANCE.dataStore.edit {
it[booleanPreferencesKey(key)] = value
}
}
}
override fun getString(key: String, defValue: String?): String? {
return BaseApplication.INSTANCE.dataStore.getString(key) ?: defValue
}
override fun getStringSet(
key: String,
defValues: MutableSet<String>?
): MutableSet<String>? {
return BaseApplication.INSTANCE.dataStore.getStringSet(key, defValues)
}
override fun getInt(key: String, defValue: Int): Int {
return BaseApplication.INSTANCE.dataStore.getInt(key, defValue)
}
override fun getLong(key: String, defValue: Long): Long {
return BaseApplication.INSTANCE.dataStore.getLong(key, defValue)
}
override fun getFloat(key: String, defValue: Float): Float {
return BaseApplication.INSTANCE.dataStore.getFloat(key, defValue)
}
override fun getBoolean(key: String, defValue: Boolean): Boolean {
return BaseApplication.INSTANCE.dataStore.getBoolean(key, defValue)
}
}
} }

View File

@ -1,214 +1,222 @@
package com.huanchengfly.tieba.post.fragments; package com.huanchengfly.tieba.post.fragments
import android.graphics.Color; import android.graphics.Color
import android.os.Bundle; import android.os.Bundle
import android.view.View; import android.view.View
import android.widget.Toast; import android.widget.Toast
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView
import androidx.annotation.Nullable; import butterknife.BindView
import androidx.recyclerview.widget.ItemTouchHelper; import com.google.android.material.snackbar.Snackbar
import androidx.recyclerview.widget.RecyclerView; import com.huanchengfly.tieba.post.R
import com.huanchengfly.tieba.post.adapters.ThreadStoreAdapter
import com.google.android.material.snackbar.Snackbar; import com.huanchengfly.tieba.post.adapters.base.OnItemClickListener
import com.huanchengfly.tieba.post.R; import com.huanchengfly.tieba.post.api.TiebaApi.getInstance
import com.huanchengfly.tieba.post.adapters.ThreadStoreAdapter; import com.huanchengfly.tieba.post.api.booleanToString
import com.huanchengfly.tieba.post.api.TiebaApi; import com.huanchengfly.tieba.post.api.models.CommonResponse
import com.huanchengfly.tieba.post.api.models.CommonResponse; import com.huanchengfly.tieba.post.api.models.ThreadStoreBean
import com.huanchengfly.tieba.post.api.models.ThreadStoreBean; import com.huanchengfly.tieba.post.api.models.ThreadStoreBean.ThreadStoreInfo
import com.huanchengfly.tieba.post.components.MyLinearLayoutManager; import com.huanchengfly.tieba.post.components.MyLinearLayoutManager
import com.huanchengfly.tieba.post.models.database.Account; import com.huanchengfly.tieba.post.components.MyViewHolder
import com.huanchengfly.tieba.post.utils.AccountUtil; import com.huanchengfly.tieba.post.dataStore
import com.huanchengfly.tieba.post.utils.NavigationHelper; import com.huanchengfly.tieba.post.getBoolean
import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil; import com.huanchengfly.tieba.post.utils.AccountUtil.getLoginInfo
import com.huanchengfly.tieba.post.utils.ThemeUtil; import com.huanchengfly.tieba.post.utils.NavigationHelper
import com.huanchengfly.tieba.post.utils.Util; import com.huanchengfly.tieba.post.utils.ThemeUtil.setThemeForSmartRefreshLayout
import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.huanchengfly.tieba.post.utils.Util
import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener; import com.scwang.smart.refresh.layout.api.RefreshLayout
import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
import org.jetbrains.annotations.NotNull; import retrofit2.Call
import retrofit2.Callback
import java.util.HashMap; import retrofit2.Response
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ThreadStoreFragment extends BaseFragment {
class ThreadStoreFragment : BaseFragment() {
@JvmField
@BindView(R.id.thread_store_recycler_view) @BindView(R.id.thread_store_recycler_view)
public RecyclerView recyclerView; var recyclerView: RecyclerView? = null
@JvmField
@BindView(R.id.thread_store_refresh_layout) @BindView(R.id.thread_store_refresh_layout)
public SmartRefreshLayout refreshLayout; var refreshLayout: SmartRefreshLayout? = null
val navigationHelper: NavigationHelper by lazy { NavigationHelper.newInstance(attachContext) }
public NavigationHelper navigationHelper; private val threadStoreAdapter: ThreadStoreAdapter by lazy { ThreadStoreAdapter(attachContext) }
private ThreadStoreAdapter threadStoreAdapter; private var page = 0
private int page = 0; private var hasMore = true
private boolean hasMore = true; private var tbs: String? = null
private String tbs; override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
public ThreadStoreFragment() { val account = getLoginInfo(attachContext)
if (account != null) tbs = account.tbs
threadStoreAdapter.setOnItemClickListener(object : OnItemClickListener<ThreadStoreInfo> {
override fun onClick(viewHolder: MyViewHolder, item: ThreadStoreInfo, position: Int) {
val map: MutableMap<String, String> = HashMap()
map["tid"] = item.threadId
map["pid"] = item.markPid
map["seeLz"] = attachContext.dataStore.getBoolean("collect_thread_see_lz", true)
.booleanToString()
map["from"] = "collect"
map["max_pid"] = item.maxPid
navigationHelper.navigationByData(NavigationHelper.ACTION_THREAD, map)
}
})
} }
@Override override fun getLayoutId(): Int {
public void onCreate(@Nullable Bundle savedInstanceState) { return R.layout.fragment_thread_store
super.onCreate(savedInstanceState);
navigationHelper = NavigationHelper.newInstance(getAttachContext());
Account account = AccountUtil.getLoginInfo(getAttachContext());
if (account != null) tbs = account.getTbs();
threadStoreAdapter = new ThreadStoreAdapter(getAttachContext());
threadStoreAdapter.setOnItemClickListener((viewHolder, threadStoreInfo, i) -> {
Map<String, String> map = new HashMap<>();
map.put("tid", threadStoreInfo.getThreadId());
map.put("pid", threadStoreInfo.getMarkPid());
map.put("seeLz", SharedPreferencesUtil.get(getAttachContext(), SharedPreferencesUtil.SP_SETTINGS).getBoolean("collect_thread_see_lz", true) ? "1" : "0");
map.put("from", "collect");
map.put("max_pid", threadStoreInfo.getMaxPid());
navigationHelper.navigationByData(NavigationHelper.ACTION_THREAD, map);
});
} }
@Override override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
public int getLayoutId() { super.onViewCreated(view, savedInstanceState)
return R.layout.fragment_thread_store; setThemeForSmartRefreshLayout(refreshLayout!!)
refreshLayout!!.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
override fun onLoadMore(refreshLayout: RefreshLayout) {
loadMore()
} }
@Override override fun onRefresh(refreshLayout: RefreshLayout) {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { refresh()
super.onViewCreated(view, savedInstanceState); }
ThemeUtil.setThemeForSmartRefreshLayout(refreshLayout); })
refreshLayout.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { recyclerView!!.layoutManager = MyLinearLayoutManager(attachContext)
@Override val mItemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
public void onLoadMore(@NonNull RefreshLayout refreshLayout) { override fun clearView(
loadMore(); recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder)
viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT)
} }
@Override override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
public void onRefresh(@NonNull RefreshLayout refreshLayout) { super.onSelectedChanged(viewHolder, actionState)
refresh();
}
});
recyclerView.setLayoutManager(new MyLinearLayoutManager(getAttachContext()));
ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
viewHolder.itemView.setBackgroundColor(Util.getColorByAttr(getAttachContext(), R.attr.colorControlHighlight, R.color.transparent)); viewHolder!!.itemView.setBackgroundColor(
Util.getColorByAttr(
attachContext,
R.attr.colorControlHighlight,
R.color.transparent
)
)
} }
} }
@Override override fun getMovementFlags(
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { recyclerView: RecyclerView,
int dragFlags = 0, swiped = ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT; viewHolder: RecyclerView.ViewHolder
return makeMovementFlags(dragFlags, swiped); ): Int {
val dragFlags = 0
val swiped = ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT
return makeMovementFlags(dragFlags, swiped)
} }
@Override override fun onMove(
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { recyclerView: RecyclerView,
return true; viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return true
} }
@Override override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { val position = viewHolder.adapterPosition
int position = viewHolder.getAdapterPosition(); val threadStoreInfo = threadStoreAdapter.getItem(position)
ThreadStoreBean.ThreadStoreInfo threadStoreInfo = threadStoreAdapter.getItem(position); threadStoreAdapter.remove(position)
threadStoreAdapter.remove(position); Util.createSnackbar(recyclerView!!, R.string.toast_deleted, Snackbar.LENGTH_LONG)
Util.createSnackbar(recyclerView, R.string.toast_deleted, Snackbar.LENGTH_LONG) .addCallback(object : Snackbar.Callback() {
.addCallback(new Snackbar.Callback() { override fun onDismissed(snackbar: Snackbar, event: Int) {
@Override
public void onDismissed(Snackbar snackbar, int event) {
if (event != DISMISS_EVENT_ACTION) { if (event != DISMISS_EVENT_ACTION) {
TiebaApi.getInstance() getInstance()
.removeStore(threadStoreInfo.getThreadId(), tbs) .removeStore(threadStoreInfo.threadId, tbs!!)
.enqueue(new Callback<CommonResponse>() { .enqueue(object : Callback<CommonResponse?> {
@Override override fun onResponse(
public void onResponse(@NotNull Call<CommonResponse> call, @NotNull Response<CommonResponse> response) { call: Call<CommonResponse?>,
response: Response<CommonResponse?>
) {
} }
@Override override fun onFailure(
public void onFailure(@NotNull Call<CommonResponse> call, @NotNull Throwable t) { call: Call<CommonResponse?>,
Toast.makeText(getAttachContext(), getAttachContext().getString(R.string.toast_delete_error, t.getMessage()), Toast.LENGTH_SHORT).show(); t: Throwable
threadStoreAdapter.insert(threadStoreInfo, position); ) {
Toast.makeText(
attachContext,
attachContext.getString(
R.string.toast_delete_error,
t.message
),
Toast.LENGTH_SHORT
).show()
threadStoreAdapter.insert(threadStoreInfo, position)
} }
}); })
} }
} }
}).setAction(R.string.button_undo, mView -> threadStoreAdapter.insert(threadStoreInfo, position)).show(); }).setAction(R.string.button_undo) { mView: View? ->
threadStoreAdapter.insert(
threadStoreInfo,
position
)
} }
}); .show()
mItemTouchHelper.attachToRecyclerView(recyclerView); }
recyclerView.setAdapter(threadStoreAdapter); })
mItemTouchHelper.attachToRecyclerView(recyclerView)
recyclerView!!.adapter = threadStoreAdapter
} }
@Override override fun onFragmentFirstVisible() {
protected void onFragmentFirstVisible() { refreshLayout!!.autoRefresh()
refreshLayout.autoRefresh();
} }
private void refresh() { private fun refresh() {
page = 0; page = 0
TiebaApi.getInstance() getInstance()
.threadStore(page, 20) .threadStore(page, 20)
.enqueue(new Callback<ThreadStoreBean>() { .enqueue(object : Callback<ThreadStoreBean?> {
@Override override fun onResponse(
public void onResponse(@NotNull Call<ThreadStoreBean> call, @NotNull Response<ThreadStoreBean> response) { call: Call<ThreadStoreBean?>,
ThreadStoreBean data = response.body(); response: Response<ThreadStoreBean?>
refreshLayout.finishRefresh(); ) {
refreshLayout.setNoMoreData(!hasMore); val data = response.body()
List<ThreadStoreBean.ThreadStoreInfo> storeInfoList = data.getStoreThread(); refreshLayout!!.finishRefresh()
if (storeInfoList == null) { refreshLayout!!.setNoMoreData(!hasMore)
return; val storeInfoList = data!!.storeThread ?: return
} threadStoreAdapter.reset()
threadStoreAdapter.reset(); threadStoreAdapter.setData(storeInfoList)
threadStoreAdapter.setData(storeInfoList); hasMore = storeInfoList.size > 0
hasMore = storeInfoList.size() > 0;
} }
@Override override fun onFailure(call: Call<ThreadStoreBean?>, t: Throwable) {
public void onFailure(@NotNull Call<ThreadStoreBean> call, @NotNull Throwable t) { refreshLayout!!.finishRefresh(false)
refreshLayout.finishRefresh(false);
} }
}); })
} }
private void loadMore() { private fun loadMore() {
if (!hasMore) { if (!hasMore) {
return; return
} }
TiebaApi.getInstance() getInstance()
.threadStore(page + 1, 20) .threadStore(page + 1, 20)
.enqueue(new Callback<ThreadStoreBean>() { .enqueue(object : Callback<ThreadStoreBean?> {
@Override override fun onResponse(
public void onResponse(@NotNull Call<ThreadStoreBean> call, @NotNull Response<ThreadStoreBean> response) { call: Call<ThreadStoreBean?>,
page += 1; response: Response<ThreadStoreBean?>
ThreadStoreBean data = response.body(); ) {
List<ThreadStoreBean.ThreadStoreInfo> storeInfoList = data.getStoreThread(); page += 1
if (storeInfoList == null) { val data = response.body()
return; val storeInfoList = data!!.storeThread ?: return
} threadStoreAdapter.insert(storeInfoList)
threadStoreAdapter.insert(storeInfoList); refreshLayout!!.finishLoadMore()
refreshLayout.finishLoadMore(); refreshLayout!!.setNoMoreData(!hasMore)
refreshLayout.setNoMoreData(!hasMore); hasMore = storeInfoList.size > 0
hasMore = storeInfoList.size() > 0;
} }
@Override override fun onFailure(call: Call<ThreadStoreBean?>, t: Throwable) {
public void onFailure(@NotNull Call<ThreadStoreBean> call, @NotNull Throwable t) { refreshLayout!!.finishLoadMore(false)
refreshLayout.finishLoadMore(false); Toast.makeText(attachContext, t.message, Toast.LENGTH_SHORT).show()
Toast.makeText(getAttachContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
} }
}); })
} }
} }

View File

@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import com.huanchengfly.tieba.post.R; import com.huanchengfly.tieba.post.R;
import com.huanchengfly.tieba.post.ui.common.intro.fragments.BaseIntroFragment; import com.huanchengfly.tieba.post.ui.common.intro.fragments.BaseIntroFragment;
import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils; import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils;
import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil;
public class CustomSettingsFragment extends BaseIntroFragment { public class CustomSettingsFragment extends BaseIntroFragment {
@Override @Override
@ -51,7 +50,7 @@ public class CustomSettingsFragment extends BaseIntroFragment {
protected void initCustomLayout(ViewGroup container) { protected void initCustomLayout(ViewGroup container) {
super.initCustomLayout(container); super.initCustomLayout(container);
getChildFragmentManager().beginTransaction() getChildFragmentManager().beginTransaction()
.replace(R.id.container, IntroSettingsFragment.newInstance(R.xml.custom_preferences, SharedPreferencesUtil.SP_SETTINGS), "IntroSettingsFragment") .replace(R.id.container, IntroSettingsFragment.newInstance(R.xml.custom_preferences), "IntroSettingsFragment")
.commit(); .commit();
} }
} }

View File

@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import com.huanchengfly.tieba.post.R; import com.huanchengfly.tieba.post.R;
import com.huanchengfly.tieba.post.ui.common.intro.fragments.BaseIntroFragment; import com.huanchengfly.tieba.post.ui.common.intro.fragments.BaseIntroFragment;
import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils; import com.huanchengfly.tieba.post.ui.common.theme.utils.ThemeUtils;
import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil;
public class HabitSettingsFragment extends BaseIntroFragment { public class HabitSettingsFragment extends BaseIntroFragment {
@Override @Override
@ -51,7 +50,7 @@ public class HabitSettingsFragment extends BaseIntroFragment {
protected void initCustomLayout(ViewGroup container) { protected void initCustomLayout(ViewGroup container) {
super.initCustomLayout(container); super.initCustomLayout(container);
getChildFragmentManager().beginTransaction() getChildFragmentManager().beginTransaction()
.replace(R.id.container, IntroSettingsFragment.newInstance(R.xml.habit_preferences, SharedPreferencesUtil.SP_SETTINGS), "IntroSettingsFragment") .replace(R.id.container, IntroSettingsFragment.newInstance(R.xml.habit_preferences), "IntroSettingsFragment")
.commit(); .commit();
} }
} }

View File

@ -5,21 +5,20 @@ import android.os.Bundle;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.XmlRes; import androidx.annotation.XmlRes;
import com.huanchengfly.tieba.post.DataStorePreference;
import com.huanchengfly.tieba.post.fragments.preference.PreferencesFragment; import com.huanchengfly.tieba.post.fragments.preference.PreferencesFragment;
public class IntroSettingsFragment extends PreferencesFragment { public class IntroSettingsFragment extends PreferencesFragment {
private String spName;
private @XmlRes private @XmlRes
int res; int res;
private IntroSettingsFragment() { private IntroSettingsFragment() {
} }
public static IntroSettingsFragment newInstance(@XmlRes int res, String spName) { public static IntroSettingsFragment newInstance(@XmlRes int res) {
IntroSettingsFragment fragment = new IntroSettingsFragment(); IntroSettingsFragment fragment = new IntroSettingsFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt("res", res); bundle.putInt("res", res);
bundle.putString("spName", spName);
fragment.setArguments(bundle); fragment.setArguments(bundle);
return fragment; return fragment;
} }
@ -28,7 +27,6 @@ public class IntroSettingsFragment extends PreferencesFragment {
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
Bundle bundle = getArguments(); Bundle bundle = getArguments();
if (bundle != null) { if (bundle != null) {
spName = bundle.getString("spName");
res = bundle.getInt("res"); res = bundle.getInt("res");
} }
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -36,7 +34,7 @@ public class IntroSettingsFragment extends PreferencesFragment {
@Override @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
getPreferenceManager().setSharedPreferencesName(spName); getPreferenceManager().setPreferenceDataStore(new DataStorePreference());
addPreferencesFromResource(res); addPreferencesFromResource(res);
} }
} }

View File

@ -452,7 +452,7 @@ public class ImageUtil {
} }
public static int getRadiusDp(Context context) { public static int getRadiusDp(Context context) {
return SharedPreferencesUtil.get(context, SharedPreferencesUtil.SP_SETTINGS).getInt("radius", 8); return AppPreferencesUtilsKt.getAppPreferences(context).getRadius();
} }
public static void load(ImageView imageView, @LoadType int type, String url) { public static void load(ImageView imageView, @LoadType int type, String url) {
@ -482,7 +482,7 @@ public class ImageUtil {
if (!Util.canLoadGlide(imageView.getContext())) { if (!Util.canLoadGlide(imageView.getContext())) {
return; return;
} }
int radius = SharedPreferencesUtil.get(imageView.getContext(), SharedPreferencesUtil.SP_SETTINGS).getInt("radius", 8); int radius = getRadiusDp(imageView.getContext());
RequestBuilder<Drawable> requestBuilder; RequestBuilder<Drawable> requestBuilder;
if (skipNetworkCheck || if (skipNetworkCheck ||
type == LOAD_TYPE_AVATAR || type == LOAD_TYPE_AVATAR ||
@ -570,7 +570,7 @@ public class ImageUtil {
@ImageLoadSettings @ImageLoadSettings
private static int getImageLoadSettings() { private static int getImageLoadSettings() {
return Integer.parseInt(SharedPreferencesUtil.get(BaseApplication.getINSTANCE(), SharedPreferencesUtil.SP_SETTINGS).getString("image_load_type", String.valueOf(SETTINGS_SMART_ORIGIN))); return Integer.parseInt(AppPreferencesUtilsKt.getAppPreferences(BaseApplication.getINSTANCE()).getImageLoadType());
} }
public static String imageToBase64(InputStream is) { public static String imageToBase64(InputStream is) {

View File

@ -238,11 +238,13 @@ public final class NavigationHelper {
if (!path.contains("android_asset")) { if (!path.contains("android_asset")) {
if (!(activityName.startsWith("WebViewActivity") || activityName.startsWith("LoginActivity"))) { if (!(activityName.startsWith("WebViewActivity") || activityName.startsWith("LoginActivity"))) {
boolean isTiebaLink = host.contains("tieba.baidu.com") || host.contains("wappass.baidu.com") || host.contains("ufosdk.baidu.com") || host.contains("m.help.baidu.com"); boolean isTiebaLink = host.contains("tieba.baidu.com") || host.contains("wappass.baidu.com") || host.contains("ufosdk.baidu.com") || host.contains("m.help.baidu.com");
if (isTiebaLink || SharedPreferencesUtil.get(mContext, SharedPreferencesUtil.SP_SETTINGS).getBoolean("use_webview", true)) { if (isTiebaLink ||
AppPreferencesUtilsKt.getAppPreferences(mContext).getUseWebView()
) {
startActivity(new Intent(mContext, WebViewActivity.class).putExtra("url", url)); startActivity(new Intent(mContext, WebViewActivity.class).putExtra("url", url));
return true; return true;
} else { } else {
if (SharedPreferencesUtil.get(mContext, SharedPreferencesUtil.SP_SETTINGS).getBoolean("use_custom_tabs", true)) { if (AppPreferencesUtilsKt.getAppPreferences(mContext).getUseCustomTabs()) {
CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder() CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder()
.setShowTitle(true) .setShowTitle(true)
.setToolbarColor(ThemeUtils.getColorByAttr(mContext, R.attr.colorToolbar)); .setToolbarColor(ThemeUtils.getColorByAttr(mContext, R.attr.colorToolbar));

View File

@ -51,7 +51,7 @@ public class SharedPreferencesUtil {
return put(get(context, preference), key, value); return put(get(context, preference), key, value);
} }
@StringDef({SP_APP_DATA, SP_IGNORE_VERSIONS, SP_PERMISSION, SP_SETTINGS, SP_WEBVIEW_INFO, SP_DRAFT, SP_PLUGINS}) @StringDef({SP_APP_DATA, SP_IGNORE_VERSIONS, SP_PERMISSION, SP_WEBVIEW_INFO, SP_DRAFT, SP_PLUGINS})
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface Preferences { public @interface Preferences {
} }

View File

@ -59,7 +59,7 @@ public class StringUtil {
} }
public static CharSequence getUsernameString(Context context, String username, String nickname) { public static CharSequence getUsernameString(Context context, String username, String nickname) {
boolean showBoth = SharedPreferencesUtil.get(context, SharedPreferencesUtil.SP_SETTINGS).getBoolean("show_both_username_and_nickname", false); boolean showBoth = AppPreferencesUtilsKt.getAppPreferences(context).getShowBothUsernameAndNickname();
if (TextUtils.isEmpty(nickname)) { if (TextUtils.isEmpty(nickname)) {
return TextUtils.isEmpty(username) ? "" : username; return TextUtils.isEmpty(username) ? "" : username;
} else if (showBoth && !TextUtils.isEmpty(username) && !TextUtils.equals(username, nickname)) { } else if (showBoth && !TextUtils.isEmpty(username) && !TextUtils.equals(username, nickname)) {