-
-
Notifications
You must be signed in to change notification settings - Fork 472
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3f63473
commit 8f1cee7
Showing
4 changed files
with
66 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 50 additions & 70 deletions
120
app/src/main/java/org/jellyfin/androidtv/ui/search/SearchProvider.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,71 +1,51 @@ | ||
package org.jellyfin.androidtv.ui.search; | ||
|
||
import android.content.Context; | ||
import android.os.Handler; | ||
|
||
import androidx.leanback.app.SearchSupportFragment; | ||
import androidx.leanback.widget.ArrayObjectAdapter; | ||
import androidx.leanback.widget.ObjectAdapter; | ||
|
||
import org.jellyfin.androidtv.ui.presentation.CustomListRowPresenter; | ||
import org.jellyfin.androidtv.util.Utils; | ||
|
||
public class SearchProvider implements SearchSupportFragment.SearchResultProvider { | ||
private static final int SEARCH_DELAY_MS = 600; | ||
private final Handler mHandler = new Handler(); | ||
private ArrayObjectAdapter mRowsAdapter; | ||
private SearchRunnable mDelayedLoad; | ||
private String lastQuery; | ||
|
||
SearchProvider(Context context) { | ||
mRowsAdapter = new ArrayObjectAdapter(new CustomListRowPresenter()); | ||
mDelayedLoad = new SearchRunnable(context, mRowsAdapter); | ||
} | ||
|
||
@Override | ||
public ObjectAdapter getResultsAdapter() { | ||
return mRowsAdapter; | ||
} | ||
|
||
@Override | ||
public boolean onQueryTextChange(String query) { | ||
search(query, true); | ||
|
||
return true; | ||
} | ||
|
||
@Override | ||
public boolean onQueryTextSubmit(String query) { | ||
search(query, false); | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* Update search results | ||
* | ||
* @param query String to search for | ||
* @param delayed When true the search is delayed by [SEARCH_DELAY_MS] milliseconds | ||
*/ | ||
private void search(String query, boolean delayed) { | ||
// Clear results when query is empty | ||
if (Utils.isEmpty(query)) { | ||
mRowsAdapter.clear(); | ||
return; | ||
} | ||
|
||
// Don't search the same thing twice | ||
if (query.equals(lastQuery)) return; | ||
lastQuery = query; | ||
|
||
// Remove current delayed search (if any) | ||
mHandler.removeCallbacks(mDelayedLoad); | ||
|
||
// Update search string | ||
mDelayedLoad.setQueryString(query); | ||
|
||
// Schedule search depending on [delayed] | ||
if (delayed) mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS); | ||
else mHandler.post(mDelayedLoad); | ||
} | ||
package org.jellyfin.androidtv.ui.search | ||
|
||
import android.content.Context | ||
import androidx.leanback.app.SearchSupportFragment | ||
import androidx.leanback.widget.ArrayObjectAdapter | ||
import androidx.leanback.widget.ObjectAdapter | ||
import androidx.lifecycle.Lifecycle | ||
import androidx.lifecycle.coroutineScope | ||
import kotlinx.coroutines.Job | ||
import kotlinx.coroutines.delay | ||
import kotlinx.coroutines.launch | ||
import org.jellyfin.androidtv.ui.presentation.CustomListRowPresenter | ||
import kotlin.time.Duration.Companion.milliseconds | ||
|
||
class SearchProvider( | ||
context: Context, | ||
private val lifecycle: Lifecycle, | ||
) : SearchSupportFragment.SearchResultProvider { | ||
companion object { | ||
private val SEARCH_DELAY = 600.milliseconds | ||
} | ||
|
||
private val rowsAdapter = ArrayObjectAdapter(CustomListRowPresenter()) | ||
private var previousQuery: String? = null | ||
private val searchRunnable = SearchRunnable(context, rowsAdapter) | ||
private var searchJob: Job? = null | ||
|
||
override fun getResultsAdapter(): ObjectAdapter = rowsAdapter | ||
|
||
override fun onQueryTextChange(query: String): Boolean = search(query, true) | ||
override fun onQueryTextSubmit(query: String): Boolean = search(query, false) | ||
|
||
private fun search(query: String, delayed: Boolean): Boolean { | ||
if (query.isBlank()) { | ||
rowsAdapter.clear() | ||
return true | ||
} | ||
|
||
// Don't search the same thing twice | ||
if (query == previousQuery) return false | ||
previousQuery = query | ||
|
||
searchJob?.cancel() | ||
searchJob = lifecycle.coroutineScope.launch { | ||
if (delayed) delay(SEARCH_DELAY) | ||
searchRunnable.run(query) | ||
} | ||
|
||
return true | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters