package com.h.pixeldroid.fragments.feeds.search import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LiveData import androidx.paging.LivePagedListBuilder import androidx.paging.PagedList import com.h.pixeldroid.R import com.h.pixeldroid.fragments.feeds.FeedFragment import com.h.pixeldroid.fragments.feeds.postFeeds.PostsFeedFragment import com.h.pixeldroid.objects.Results import com.h.pixeldroid.objects.Status import retrofit2.Call import retrofit2.Callback import retrofit2.Response class SearchPostsFragment: PostsFeedFragment(){ private lateinit var query: String override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = super.onCreateView(inflater, container, savedInstanceState) query = arguments?.getSerializable("searchFeed") as String return view } inner class SearchFeedDataSource : FeedDataSource(){ override fun newSource(): SearchFeedDataSource { return SearchFeedDataSource() } private fun searchMakeInitialCall(requestedLoadSize: Int): Call { return pixelfedAPI .search("Bearer $accessToken", limit="$requestedLoadSize", q=query, type = Results.SearchType.statuses) } private fun searchMakeAfterCall(requestedLoadSize: Int, key: String): Call { return pixelfedAPI .search("Bearer $accessToken", max_id=key, limit="$requestedLoadSize", q = query, type = Results.SearchType.statuses) } override fun loadInitial( params: LoadInitialParams, callback: LoadInitialCallback ) { searchEnqueueCall(searchMakeInitialCall(params.requestedLoadSize), callback) } override fun loadAfter(params: LoadParams, callback: LoadCallback) { searchEnqueueCall(searchMakeAfterCall(params.requestedLoadSize, params.key), callback) } private fun searchEnqueueCall(call: Call, callback: LoadCallback){ call.enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.code() == 200) { val notifications = response.body()!!.statuses as ArrayList callback.onResult(notifications as List) } else { showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call, t: Throwable) { showError(errorText = R.string.feed_failed) Log.e("FeedFragment", t.toString()) } }) } override fun makeInitialCall(requestedLoadSize: Int): Call> { throw NotImplementedError("Should not be called, reimplemented for Search fragment") } override fun makeAfterCall(requestedLoadSize: Int, key: String): Call> { throw NotImplementedError("Should not be called, reimplemented for Search fragment") } override fun enqueueCall(call: Call>, callback: LoadCallback) { throw NotImplementedError("Should not be called, reimplemented for Search fragment") } override fun getKey(item: Status): String { return item.id!! } } override fun makeContent(): LiveData> { val config: PagedList.Config = PagedList.Config.Builder().setPageSize(10).build() factory = FeedFragment() .FeedDataSourceFactory(SearchFeedDataSource()) return LivePagedListBuilder(factory, config).build() } }