Convert DirectPendingInboxFragment to kotlin

This commit is contained in:
Ammar Githam 2021-06-01 21:23:42 +09:00
parent ffafda0085
commit 01c944486d

View File

@ -1,175 +1,148 @@
package awais.instagrabber.fragments.directmessages; package awais.instagrabber.fragments.directmessages
import android.content.Context; import android.content.res.Configuration
import android.content.res.Configuration; import android.os.Bundle
import android.os.Bundle; import android.view.LayoutInflater
import android.view.LayoutInflater; import android.view.View
import android.view.View; import android.view.ViewGroup
import android.view.ViewGroup; import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.NavHostFragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import awais.instagrabber.activities.MainActivity
import awais.instagrabber.adapters.DirectMessageInboxAdapter
import awais.instagrabber.customviews.helpers.RecyclerLazyLoaderAtEdge
import awais.instagrabber.databinding.FragmentDirectPendingInboxBinding
import awais.instagrabber.models.Resource
import awais.instagrabber.repositories.responses.directmessages.DirectInbox
import awais.instagrabber.repositories.responses.directmessages.DirectThread
import awais.instagrabber.viewmodels.DirectPendingInboxViewModel
import com.google.android.material.snackbar.Snackbar
import androidx.annotation.NonNull; class DirectPendingInboxFragment : Fragment(), OnRefreshListener {
import androidx.annotation.Nullable; private val viewModel: DirectPendingInboxViewModel by activityViewModels()
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.snackbar.Snackbar; private lateinit var root: CoordinatorLayout
private lateinit var lazyLoader: RecyclerLazyLoaderAtEdge
private lateinit var binding: FragmentDirectPendingInboxBinding
private lateinit var fragmentActivity: MainActivity
private lateinit var inboxAdapter: DirectMessageInboxAdapter
import java.util.Collections; private var shouldRefresh = true
import java.util.List; private var scrollToTop = false
private var navigating = false
private var threadsObserver: Observer<List<DirectThread?>>? = null
import awais.instagrabber.activities.MainActivity; override fun onCreate(savedInstanceState: Bundle?) {
import awais.instagrabber.adapters.DirectMessageInboxAdapter; super.onCreate(savedInstanceState)
import awais.instagrabber.customviews.helpers.RecyclerLazyLoaderAtEdge; fragmentActivity = requireActivity() as MainActivity
import awais.instagrabber.databinding.FragmentDirectPendingInboxBinding; }
import awais.instagrabber.repositories.responses.directmessages.DirectThread;
import awais.instagrabber.viewmodels.DirectPendingInboxViewModel;
public class DirectPendingInboxFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { override fun onCreateView(
private static final String TAG = DirectPendingInboxFragment.class.getSimpleName(); inflater: LayoutInflater,
container: ViewGroup?,
private CoordinatorLayout root; savedInstanceState: Bundle?,
private RecyclerLazyLoaderAtEdge lazyLoader; ): View {
private DirectPendingInboxViewModel viewModel; if (this::root.isInitialized) {
private boolean shouldRefresh = true; shouldRefresh = false
private FragmentDirectPendingInboxBinding binding; return root
private DirectMessageInboxAdapter inboxAdapter;
private MainActivity fragmentActivity;
private boolean scrollToTop = false;
private boolean navigating;
private Observer<List<DirectThread>> threadsObserver;
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentActivity = (MainActivity) getActivity();
if (fragmentActivity != null) {
viewModel = new ViewModelProvider(fragmentActivity).get(DirectPendingInboxViewModel.class);
} }
binding = FragmentDirectPendingInboxBinding.inflate(inflater, container, false)
root = binding.root
return root
} }
@Override override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
public View onCreateView(@NonNull final LayoutInflater inflater, if (!shouldRefresh) return
final ViewGroup container, init()
final Bundle savedInstanceState) {
if (root != null) {
shouldRefresh = false;
return root;
}
binding = FragmentDirectPendingInboxBinding.inflate(inflater, container, false);
root = binding.getRoot();
return root;
} }
@Override override fun onRefresh() {
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { lazyLoader.resetState()
if (!shouldRefresh) return; scrollToTop = true
init(); viewModel.refresh()
} }
@Override override fun onResume() {
public void onRefresh() { super.onResume()
lazyLoader.resetState(); setupObservers()
scrollToTop = true;
if (viewModel != null) {
viewModel.refresh();
}
} }
@Override override fun onConfigurationChanged(newConfig: Configuration) {
public void onResume() { super.onConfigurationChanged(newConfig)
super.onResume(); init()
setupObservers();
} }
@Override override fun onDestroy() {
public void onConfigurationChanged(@NonNull final Configuration newConfig) { super.onDestroy()
super.onConfigurationChanged(newConfig); removeViewModelObservers()
init(); viewModel.onDestroy()
} }
@Override private fun setupObservers() {
public void onDestroy() { removeViewModelObservers()
super.onDestroy(); threadsObserver = Observer { list: List<DirectThread?>? ->
removeViewModelObservers(); if (!this::inboxAdapter.isInitialized) return@Observer
viewModel.onDestroy(); if (binding.swipeRefreshLayout.visibility == View.GONE) {
} binding.swipeRefreshLayout.visibility = View.VISIBLE
binding.empty.visibility = View.GONE
private void setupObservers() { }
removeViewModelObservers(); inboxAdapter.submitList(list ?: emptyList()) {
threadsObserver = list -> { if (!scrollToTop) return@submitList
if (inboxAdapter == null) return; binding.pendingInboxList.smoothScrollToPosition(0)
if (binding.swipeRefreshLayout.getVisibility() == View.GONE) { scrollToTop = false
binding.swipeRefreshLayout.setVisibility(View.VISIBLE);
binding.empty.setVisibility(View.GONE);
} }
inboxAdapter.submitList(list == null ? Collections.emptyList() : list, () -> {
if (!scrollToTop) return;
binding.pendingInboxList.smoothScrollToPosition(0);
scrollToTop = false;
});
if (list == null || list.isEmpty()) { if (list == null || list.isEmpty()) {
binding.swipeRefreshLayout.setVisibility(View.GONE); binding.swipeRefreshLayout.visibility = View.GONE
binding.empty.setVisibility(View.VISIBLE); binding.empty.visibility = View.VISIBLE
} }
};
viewModel.getThreads().observe(fragmentActivity, threadsObserver);
viewModel.getInbox().observe(getViewLifecycleOwner(), inboxResource -> {
if (inboxResource == null) return;
switch (inboxResource.status) {
case SUCCESS:
binding.swipeRefreshLayout.setRefreshing(false);
break;
case ERROR:
if (inboxResource.message != null) {
Snackbar.make(binding.getRoot(), inboxResource.message, Snackbar.LENGTH_LONG).show();
}
binding.swipeRefreshLayout.setRefreshing(false);
break;
case LOADING:
binding.swipeRefreshLayout.setRefreshing(true);
break;
}
});
}
private void removeViewModelObservers() {
if (viewModel == null) return;
if (threadsObserver != null) {
viewModel.getThreads().removeObserver(threadsObserver);
} }
threadsObserver?.let { viewModel.threads.observe(fragmentActivity, it) }
viewModel.inbox.observe(viewLifecycleOwner, { inboxResource: Resource<DirectInbox?>? ->
if (inboxResource == null) return@observe
when (inboxResource.status) {
Resource.Status.SUCCESS -> binding.swipeRefreshLayout.isRefreshing = false
Resource.Status.ERROR -> {
if (inboxResource.message != null) {
Snackbar.make(binding.root, inboxResource.message, Snackbar.LENGTH_LONG).show()
}
binding.swipeRefreshLayout.isRefreshing = false
}
Resource.Status.LOADING -> binding.swipeRefreshLayout.isRefreshing = true
}
})
} }
private void init() { private fun removeViewModelObservers() {
final Context context = getContext(); threadsObserver?.let { viewModel.threads.removeObserver(it) }
if (context == null) return;
setupObservers();
binding.swipeRefreshLayout.setOnRefreshListener(this);
binding.pendingInboxList.setHasFixedSize(true);
binding.pendingInboxList.setItemViewCacheSize(20);
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
binding.pendingInboxList.setLayoutManager(layoutManager);
inboxAdapter = new DirectMessageInboxAdapter(thread -> {
if (navigating) return;
navigating = true;
if (isAdded()) {
final DirectPendingInboxFragmentDirections.ActionPendingInboxToThread directions = DirectPendingInboxFragmentDirections
.actionPendingInboxToThread(thread.getThreadId(), thread.getThreadTitle());
directions.setPending(true);
NavHostFragment.findNavController(this).navigate(directions);
}
navigating = false;
});
inboxAdapter.setHasStableIds(true);
binding.pendingInboxList.setAdapter(inboxAdapter);
lazyLoader = new RecyclerLazyLoaderAtEdge(layoutManager, page -> {
if (viewModel == null) return;
viewModel.fetchInbox();
});
binding.pendingInboxList.addOnScrollListener(lazyLoader);
} }
}
private fun init() {
val context = context ?: return
setupObservers()
binding.swipeRefreshLayout.setOnRefreshListener(this)
binding.pendingInboxList.setHasFixedSize(true)
binding.pendingInboxList.setItemViewCacheSize(20)
val layoutManager = LinearLayoutManager(context)
binding.pendingInboxList.layoutManager = layoutManager
inboxAdapter = DirectMessageInboxAdapter { thread ->
if (navigating) return@DirectMessageInboxAdapter
val threadId = thread.threadId ?: return@DirectMessageInboxAdapter
val threadTitle = thread.threadTitle ?: return@DirectMessageInboxAdapter
navigating = true
if (isAdded) {
val directions = DirectPendingInboxFragmentDirections.actionPendingInboxToThread(threadId, threadTitle)
directions.pending = true
NavHostFragment.findNavController(this).navigate(directions)
}
navigating = false
}
inboxAdapter.setHasStableIds(true)
binding.pendingInboxList.adapter = inboxAdapter
lazyLoader = RecyclerLazyLoaderAtEdge(layoutManager) { viewModel.fetchInbox() }
binding.pendingInboxList.addOnScrollListener(lazyLoader)
}
}