diff --git a/build.gradle b/build.gradle
index 52564693..417dd437 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,10 +1,10 @@
buildscript {
- ext.kotlin_version = "1.5.31"
+ ext.kotlin_version = "1.6.10"
ext.lifecycle_version = "2.2.0"
- ext.build_tools_version = "31.0.0"
- ext.instantsearch = '2.11.4'
- ext.canary = '2.7'
- ext.compose_version = '1.0.5'
+ ext.build_tools_version = "32.0.0"
+ ext.instantsearch = '3.0.0-SNAPSHOT'
+ ext.canary = '2.8.1'
+ ext.compose_version = '1.1.1'
repositories {
mavenCentral()
google()
diff --git a/compose/.gitignore b/compose/.gitignore
deleted file mode 100644
index 42afabfd..00000000
--- a/compose/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/compose/build.gradle b/compose/build.gradle
deleted file mode 100644
index 625418e9..00000000
--- a/compose/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-plugins {
- id 'com.android.application'
- id 'kotlin-android'
- id 'kotlinx-serialization'
-}
-
-android {
- compileSdk 31
- buildToolsVersion build_tools_version
-
- defaultConfig {
- applicationId "com.algolia.searchapp"
- minSdk 21
- targetSdk 31
- versionCode 1
- versionName "1.0"
-
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- vectorDrawables {
- useSupportLibrary true
- }
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
- buildFeatures {
- compose true
- }
- composeOptions {
- kotlinCompilerExtensionVersion compose_version
- }
-}
-
-dependencies {
- implementation "com.algolia:instantsearch-compose:$instantsearch"
-
- implementation "androidx.compose.material:material-icons-extended:$compose_version"
- implementation "androidx.compose.ui:ui:$compose_version"
- implementation "androidx.compose.material:material:$compose_version"
- implementation "androidx.compose.ui:ui-tooling:$compose_version"
- implementation 'androidx.paging:paging-compose:1.0.0-alpha11'
- implementation 'androidx.activity:activity-compose:1.3.0-rc02'
- implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
- implementation 'androidx.core:core-ktx:1.6.0'
- implementation 'androidx.appcompat:appcompat:1.3.0'
- implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
- testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.3'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
- androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
-}
-
-tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
- kotlinOptions {
- freeCompilerArgs += [
- '-Xopt-in=kotlin.RequiresOptIn',
- '-Xopt-in=com.algolia.instantsearch.ExperimentalInstantSearch',
- ]
- }
-}
diff --git a/compose/proguard-rules.pro b/compose/proguard-rules.pro
deleted file mode 100644
index 481bb434..00000000
--- a/compose/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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/compose/src/androidTest/java/com/algolia/searchapp/ExampleInstrumentedTest.kt b/compose/src/androidTest/java/com/algolia/searchapp/ExampleInstrumentedTest.kt
deleted file mode 100644
index 31aaeadb..00000000
--- a/compose/src/androidTest/java/com/algolia/searchapp/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.algolia.searchapp
-
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-import org.junit.Test
-import org.junit.runner.RunWith
-
-import org.junit.Assert.*
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
- @Test
- fun useAppContext() {
- // Context of the app under test.
- val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- assertEquals("com.algolia.searchapp", appContext.packageName)
- }
-}
\ No newline at end of file
diff --git a/compose/src/main/AndroidManifest.xml b/compose/src/main/AndroidManifest.xml
deleted file mode 100644
index 0a79ae12..00000000
--- a/compose/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/compose/src/main/res/values-night/themes.xml b/compose/src/main/res/values-night/themes.xml
deleted file mode 100644
index 74518cf0..00000000
--- a/compose/src/main/res/values-night/themes.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/compose/src/main/res/values/colors.xml b/compose/src/main/res/values/colors.xml
deleted file mode 100644
index f8c6127d..00000000
--- a/compose/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
- #FFBB86FC
- #FF6200EE
- #FF3700B3
- #FF03DAC5
- #FF018786
- #FF000000
- #FFFFFFFF
-
\ No newline at end of file
diff --git a/compose/src/main/res/values/strings.xml b/compose/src/main/res/values/strings.xml
deleted file mode 100644
index 0c06b6c1..00000000
--- a/compose/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Search App
-
\ No newline at end of file
diff --git a/compose/src/main/res/values/themes.xml b/compose/src/main/res/values/themes.xml
deleted file mode 100644
index 0520a47e..00000000
--- a/compose/src/main/res/values/themes.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/compose/src/test/java/com/algolia/searchapp/ExampleUnitTest.kt b/compose/src/test/java/com/algolia/searchapp/ExampleUnitTest.kt
deleted file mode 100644
index 2b1f1360..00000000
--- a/compose/src/test/java/com/algolia/searchapp/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.algolia.searchapp
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file
diff --git a/exchange/categories-hits/src/main/kotlin/com/algolia/exchange/query/categories/hits/MainViewModel.kt b/exchange/categories-hits/src/main/kotlin/com/algolia/exchange/query/categories/hits/MainViewModel.kt
index c42f4523..b961ac3a 100644
--- a/exchange/categories-hits/src/main/kotlin/com/algolia/exchange/query/categories/hits/MainViewModel.kt
+++ b/exchange/categories-hits/src/main/kotlin/com/algolia/exchange/query/categories/hits/MainViewModel.kt
@@ -5,30 +5,26 @@ import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.facets.addFacetsSearcher
-import com.algolia.instantsearch.helper.searcher.hits.addHitsSearcher
-import com.algolia.instantsearch.helper.searcher.multi.MultiSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.facets.addFacetsSearcher
+import com.algolia.instantsearch.searcher.hits.addHitsSearcher
+import com.algolia.instantsearch.searcher.multi.MultiSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.Attribute
import com.algolia.search.model.IndexName
import com.algolia.search.model.search.Facet
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
- LogLevel.ALL
+ private val multiSearcher = MultiSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("1f6fd3a6fb973cb08419fe7d288fa4db")
)
private val indexName = IndexName("instant_search")
private val attribute = Attribute("categories")
- private val multiSearcher = MultiSearcher(client)
private val suggestionsSearcher = multiSearcher.addHitsSearcher(indexName)
private val categoriesSearcher = multiSearcher.addFacetsSearcher(indexName, attribute)
private val searchBoxConnector = SearchBoxConnector(multiSearcher)
diff --git a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Actor.kt b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Actor.kt
index 904a4f57..141df20d 100644
--- a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Actor.kt
+++ b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Actor.kt
@@ -1,6 +1,6 @@
package com.algolia.exchange.multi.index
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import com.algolia.search.model.ObjectID
import com.algolia.search.model.indexing.Indexable
diff --git a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/MainViewModel.kt b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/MainViewModel.kt
index 4bbcc033..995cbf3f 100644
--- a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/MainViewModel.kt
+++ b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/MainViewModel.kt
@@ -5,26 +5,22 @@ import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.hits.addHitsSearcher
-import com.algolia.instantsearch.helper.searcher.multi.MultiSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.addHitsSearcher
+import com.algolia.instantsearch.searcher.multi.MultiSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
import com.algolia.search.model.search.Query
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"),
- LogLevel.ALL
+ private val multiSearcher = MultiSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("1f6fd3a6fb973cb08419fe7d288fa4db")
)
- private val multiSearcher = MultiSearcher(client)
private val actorsSearcher = multiSearcher.addHitsSearcher(IndexName("mobile_demo_actors"), Query(hitsPerPage = 5))
private val moviesSearcher = multiSearcher.addHitsSearcher(IndexName("mobile_demo_movies"))
private val searchBoxConnector = SearchBoxConnector(multiSearcher)
diff --git a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Movie.kt b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Movie.kt
index 8a13c7f3..0b1cb046 100644
--- a/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Movie.kt
+++ b/exchange/multi-index/src/main/kotlin/com/algolia/exchange/multi/index/Movie.kt
@@ -1,6 +1,6 @@
package com.algolia.exchange.multi.index
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import com.algolia.search.model.ObjectID
import com.algolia.search.model.indexing.Indexable
diff --git a/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt b/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
index ab40e164..15fff1be 100644
--- a/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
+++ b/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
@@ -1,38 +1,28 @@
package com.algolia.exchange.query.suggestions.categories
-import android.util.Log
import androidx.lifecycle.ViewModel
import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.core.selectable.list.SelectionMode
-import com.algolia.instantsearch.helper.filter.facet.FacetListConnector
-import com.algolia.instantsearch.helper.filter.state.FilterState
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectSearcher
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.connectFilterState
-import com.algolia.instantsearch.helper.searcher.facets.addFacetsSearcher
-import com.algolia.instantsearch.helper.searcher.hits.addHitsSearcher
-import com.algolia.instantsearch.helper.searcher.multi.MultiSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.facets.addFacetsSearcher
+import com.algolia.instantsearch.searcher.hits.addHitsSearcher
+import com.algolia.instantsearch.searcher.multi.MultiSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.Attribute
import com.algolia.search.model.IndexName
import com.algolia.search.model.search.Facet
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
- LogLevel.ALL
+ private val multiSearcher = MultiSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
)
- private val multiSearcher = MultiSearcher(client)
private val suggestionsSearcher = multiSearcher.addHitsSearcher(
indexName = IndexName("instantsearch_query_suggestions")
)
@@ -52,7 +42,11 @@ class MainViewModel : ViewModel() {
init {
connections += searchBoxConnector.connectView(searchBoxState)
connections += categoriesSearcher.connectHitsView(categoriesState) { it.facets }
- connections += suggestionsSearcher.connectHitsView(suggestionsState) { it.hits.deserialize(Suggestion.serializer()) }
+ connections += suggestionsSearcher.connectHitsView(suggestionsState) {
+ it.hits.deserialize(
+ Suggestion.serializer()
+ )
+ }
multiSearcher.searchAsync()
}
diff --git a/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt b/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
index fde3f6fd..93da5b80 100644
--- a/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
+++ b/exchange/query-suggestions-categories/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
@@ -1,7 +1,7 @@
package com.algolia.exchange.query.suggestions.categories
import com.algolia.instantsearch.core.highlighting.HighlightedString
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
diff --git a/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/MainViewModel.kt b/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/MainViewModel.kt
index f6b24a5c..653bb892 100644
--- a/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/MainViewModel.kt
+++ b/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/MainViewModel.kt
@@ -5,27 +5,22 @@ import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.hits.addHitsSearcher
-import com.algolia.instantsearch.helper.searcher.multi.MultiSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.addHitsSearcher
+import com.algolia.instantsearch.searcher.multi.MultiSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
import com.algolia.search.model.search.Query
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
- LogLevel.ALL
+ private val multiSearcher = MultiSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a")
)
-
- private val multiSearcher = MultiSearcher(client)
private val suggestionsSearcher = multiSearcher.addHitsSearcher(
IndexName("instantsearch_query_suggestions"),
Query(hitsPerPage = 3)
diff --git a/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/Suggestion.kt b/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/Suggestion.kt
index eee257f8..5ae18db6 100644
--- a/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/Suggestion.kt
+++ b/exchange/query-suggestions-hits/src/main/kotlin/com/algolia/exchange/query/suggestions/hits/Suggestion.kt
@@ -1,7 +1,7 @@
package com.algolia.exchange.query.suggestions.hits
import com.algolia.instantsearch.core.highlighting.HighlightedString
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
diff --git a/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt b/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
index 5650d9b4..f616bede 100644
--- a/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
+++ b/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/MainViewModel.kt
@@ -1,15 +1,14 @@
package com.algolia.exchange.query.suggestions.categories
import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.mutableStateMapOf
import androidx.lifecycle.ViewModel
import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.hits.HitsSearcher
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
import com.algolia.search.client.ClientSearch
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
@@ -19,13 +18,11 @@ import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
- LogLevel.ALL
+ private val searcherSuggestion = HitsSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
+ indexName = IndexName("instantsearch_query_suggestions")
)
- private val indexName = IndexName("instantsearch_query_suggestions")
- private val searcherSuggestion = HitsSearcher(client, indexName)
private val searchBoxConnector = SearchBoxConnector(searcherSuggestion)
private val connections = ConnectionHandler(searchBoxConnector)
diff --git a/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt b/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
index fde3f6fd..93da5b80 100644
--- a/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
+++ b/exchange/query-suggestions-recent/src/main/kotlin/com/algolia/exchange/query/suggestions/categories/Suggestion.kt
@@ -1,7 +1,7 @@
package com.algolia.exchange.query.suggestions.categories
import com.algolia.instantsearch.core.highlighting.HighlightedString
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
diff --git a/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/MainViewModel.kt b/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/MainViewModel.kt
index ed2b3661..453e7d61 100644
--- a/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/MainViewModel.kt
+++ b/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/MainViewModel.kt
@@ -5,25 +5,21 @@ import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.hits.HitsSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
- LogLevel.ALL
+ private val searcherSuggestion = HitsSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
+ indexName = IndexName("instantsearch_query_suggestions")
)
- private val indexName = IndexName("instantsearch_query_suggestions")
- private val searcherSuggestion = HitsSearcher(client, indexName)
private val searchBoxConnector = SearchBoxConnector(searcherSuggestion)
private val connections = ConnectionHandler(searchBoxConnector)
diff --git a/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/Suggestion.kt b/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/Suggestion.kt
index 67414ffc..5f131270 100644
--- a/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/Suggestion.kt
+++ b/exchange/query-suggestions/src/main/kotlin/com/algolia/exchange/query/suggestions/Suggestion.kt
@@ -1,7 +1,7 @@
package com.algolia.exchange.query.suggestions
import com.algolia.instantsearch.core.highlighting.HighlightedString
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
diff --git a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/MainViewModel.kt b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/MainViewModel.kt
index 076ed4bc..e4a66a42 100644
--- a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/MainViewModel.kt
+++ b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/MainViewModel.kt
@@ -5,24 +5,21 @@ import com.algolia.instantsearch.compose.hits.HitsState
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.hits.HitsSearcher
-import com.algolia.search.client.ClientSearch
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
-import io.ktor.client.features.logging.*
class MainViewModel : ViewModel() {
- private val client = ClientSearch(
- ApplicationID("latency"),
- APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"),
- LogLevel.ALL
+ private val hitsSearcher = HitsSearcher(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"),
+ indexName = IndexName("instant_search")
)
- private val hitsSearcher = HitsSearcher(client, IndexName("instant_search"))
private val searchBoxConnector = SearchBoxConnector(hitsSearcher)
private val connections = ConnectionHandler(searchBoxConnector)
diff --git a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/Product.kt b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/Product.kt
index 56533cd8..30dc5a2d 100644
--- a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/Product.kt
+++ b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/Product.kt
@@ -1,6 +1,6 @@
package com.algolia.exchange.voice.search
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import com.algolia.search.model.ObjectID
import com.algolia.search.model.indexing.Indexable
diff --git a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/SearchScreen.kt b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/SearchScreen.kt
index 354b9ec1..f0b5bbfb 100644
--- a/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/SearchScreen.kt
+++ b/exchange/voice-search/src/main/kotlin/com/algolia/exchange/voice/search/SearchScreen.kt
@@ -39,7 +39,7 @@ fun SearchScreen(
.fillMaxWidth()
.padding(12.dp),
searchBoxState = searchBoxState,
- clearIcon = {
+ trailingIcon = {
if (searchBoxState.query.isEmpty()) {
Icon(
modifier = Modifier.clickable(onClick = onMicClick),
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 17032641..30c10954 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-7.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
diff --git a/guides/build.gradle b/guides/build.gradle
index 2ac9b051..edbcb125 100644
--- a/guides/build.gradle
+++ b/guides/build.gradle
@@ -1,6 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlinx-serialization'
apply plugin: 'kotlin-kapt'
@@ -34,18 +33,35 @@ android {
packagingOptions {
exclude("META-INF/*.kotlin_module")
}
- sourceSets["main"].java.srcDir("src/main/kotlin")
+ buildFeatures {
+ compose true
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion compose_version
+ }
}
dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
+ implementation "com.algolia:instantsearch-android:$instantsearch"
+ implementation "com.algolia:instantsearch-compose:$instantsearch"
+ implementation "com.algolia:instantsearch-android-paging3:$instantsearch"
+ implementation "com.algolia:instantsearch-insights-android:$instantsearch"
+ implementation "com.algolia.instantsearch:voice:1.1.0"
- implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
- implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
- implementation "androidx.constraintlayout:constraintlayout:1.1.3"
- implementation "com.google.android.material:material:1.2.0-alpha06"
+ implementation "androidx.fragment:fragment-ktx:1.4.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1"
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1"
+ implementation "androidx.constraintlayout:constraintlayout:2.1.3"
+ implementation "com.google.android.material:material:1.5.0"
implementation "com.github.bumptech.glide:glide:4.10.0"
- implementation "com.algolia:instantsearch-android:$instantsearch"
+
+ implementation "androidx.compose.ui:ui:$compose_version"
+ implementation "androidx.compose.ui:ui-tooling:$compose_version"
+ implementation "androidx.compose.material:material:$compose_version"
+ implementation "androidx.compose.material:material-icons-extended:$compose_version"
+ implementation 'androidx.activity:activity-compose:1.4.0'
+ implementation 'androidx.paging:paging-compose:1.0.0-alpha14'
+
debugImplementation "com.squareup.leakcanary:leakcanary-android:$canary"
testImplementation 'junit:junit:4.12'
diff --git a/guides/src/main/AndroidManifest.xml b/guides/src/main/AndroidManifest.xml
index da291262..521fe8b9 100644
--- a/guides/src/main/AndroidManifest.xml
+++ b/guides/src/main/AndroidManifest.xml
@@ -3,8 +3,10 @@
package="com.algolia.instantsearch.guides">
+
+
+
+
+
+
+
diff --git a/insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/App.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/App.kt
similarity index 57%
rename from insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/App.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/App.kt
index 5b0e0f04..eb30c6d4 100644
--- a/insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/App.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/App.kt
@@ -1,4 +1,4 @@
-package com.algolia.instantsearch.insights.showcase
+package com.algolia.instantsearch.guides
import android.app.Application
import com.algolia.instantsearch.insights.registerInsights
@@ -6,23 +6,22 @@ import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
import com.algolia.search.model.insights.UserToken
+import io.ktor.client.features.logging.*
class App : Application() {
override fun onCreate() {
super.onCreate()
- registerInsights(this, AppID, ApiKey, IndexName).apply {
+ registerInsights(
+ context = this,
+ appId = ApplicationID("latency"),
+ apiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a"),
+ indexName = IndexName("instant_search"),
+ clientLogLevel = LogLevel.ALL
+ ).apply {
loggingEnabled = true
userToken = UserToken("userToken")
minBatchSize = 1
- }.also {
- it.loggingEnabled = true
}
}
-
- companion object {
- val AppID = ApplicationID("latency")
- val ApiKey = APIKey("afc3dd66dd1293e2e2736a5a51b05c0a")
- val IndexName = IndexName("bestbuy")
- }
}
diff --git a/compose/src/main/java/com/algolia/searchapp/MainActivity.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/ComposeActivity.kt
similarity index 80%
rename from compose/src/main/java/com/algolia/searchapp/MainActivity.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/ComposeActivity.kt
index cc30c0ee..38754f96 100644
--- a/compose/src/main/java/com/algolia/searchapp/MainActivity.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/ComposeActivity.kt
@@ -1,12 +1,12 @@
-package com.algolia.searchapp
+package com.algolia.instantsearch.guides.compose
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
-import com.algolia.searchapp.ui.theme.SearchAppTheme
+import com.algolia.instantsearch.guides.compose.theme.SearchAppTheme
-class MainActivity : ComponentActivity() {
+class ComposeActivity : ComponentActivity() {
private val viewModel: MainViewModel by viewModels()
diff --git a/compose/src/main/java/com/algolia/searchapp/MainViewModel.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/MainViewModel.kt
similarity index 63%
rename from compose/src/main/java/com/algolia/searchapp/MainViewModel.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/MainViewModel.kt
index 9b5dd810..d0014001 100644
--- a/compose/src/main/java/com/algolia/searchapp/MainViewModel.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/MainViewModel.kt
@@ -1,25 +1,26 @@
-package com.algolia.searchapp
+package com.algolia.instantsearch.guides.compose
import androidx.lifecycle.ViewModel
+import com.algolia.instantsearch.android.paging3.Paginator
+import com.algolia.instantsearch.android.paging3.facet.connectPaginator
+import com.algolia.instantsearch.android.paging3.searchbox.connectPaginator
import com.algolia.instantsearch.compose.filter.facet.FacetListState
-import com.algolia.instantsearch.compose.filter.facet.connectPaginator
import com.algolia.instantsearch.compose.item.StatsTextState
-import com.algolia.instantsearch.compose.list.Paginator
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
-import com.algolia.instantsearch.compose.searchbox.connectPaginator
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.selectable.list.SelectionMode
-import com.algolia.instantsearch.helper.filter.facet.FacetListConnector
-import com.algolia.instantsearch.helper.filter.facet.connectView
-import com.algolia.instantsearch.helper.filter.state.FilterState
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.SearcherForFacets
-import com.algolia.instantsearch.helper.searcher.SearcherSingleIndex
-import com.algolia.instantsearch.helper.searcher.connectFilterState
-import com.algolia.instantsearch.helper.stats.StatsConnector
-import com.algolia.instantsearch.helper.stats.StatsPresenterImpl
-import com.algolia.instantsearch.helper.stats.connectView
+import com.algolia.instantsearch.filter.facet.FacetListConnector
+import com.algolia.instantsearch.filter.facet.connectView
+import com.algolia.instantsearch.filter.state.FilterState
+import com.algolia.instantsearch.guides.model.Product
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.connectFilterState
+import com.algolia.instantsearch.searcher.facets.FacetsSearcher
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
+import com.algolia.instantsearch.stats.StatsConnector
+import com.algolia.instantsearch.stats.StatsPresenterImpl
+import com.algolia.instantsearch.stats.connectView
import com.algolia.search.client.ClientSearch
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
@@ -27,6 +28,7 @@ import com.algolia.search.model.Attribute
import com.algolia.search.model.IndexName
import io.ktor.client.features.logging.*
+
class MainViewModel : ViewModel() {
val client = ClientSearch(
@@ -34,8 +36,8 @@ class MainViewModel : ViewModel() {
APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"),
LogLevel.ALL
)
- val index = client.initIndex(IndexName("bestbuy"))
- val searcher = SearcherSingleIndex(index)
+ val indexName = IndexName("instant_search")
+ val searcher = HitsSearcher(client, indexName)
// Search Box
val searchBoxState = SearchBoxState()
@@ -51,12 +53,12 @@ class MainViewModel : ViewModel() {
// Filters
val facetList = FacetListState()
val filterState = FilterState()
- val manufacturer = Attribute("category")
- val searcherForFacet = SearcherForFacets(index, manufacturer)
+ val categories = Attribute("categories")
+ val searcherForFacet = FacetsSearcher(client, indexName, categories)
val facetListConnector = FacetListConnector(
searcher = searcherForFacet,
filterState = filterState,
- attribute = manufacturer,
+ attribute = categories,
selectionMode = SelectionMode.Multiple
)
diff --git a/compose/src/main/java/com/algolia/searchapp/SearchScreen.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/SearchScreen.kt
similarity index 95%
rename from compose/src/main/java/com/algolia/searchapp/SearchScreen.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/SearchScreen.kt
index a8db3cc5..fc9b85b5 100644
--- a/compose/src/main/java/com/algolia/searchapp/SearchScreen.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/SearchScreen.kt
@@ -1,6 +1,5 @@
-package com.algolia.searchapp
+package com.algolia.instantsearch.guides.compose
-import androidx.compose.animation.*
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
@@ -12,7 +11,8 @@ import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.FilterList
-import androidx.compose.runtime.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.AnnotatedString
@@ -22,13 +22,15 @@ import androidx.compose.ui.unit.dp
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.items
+import com.algolia.instantsearch.android.paging3.Paginator
+import com.algolia.instantsearch.android.paging3.flow
import com.algolia.instantsearch.compose.filter.facet.FacetListState
import com.algolia.instantsearch.compose.highlighting.toAnnotatedString
import com.algolia.instantsearch.compose.item.StatsState
-import com.algolia.instantsearch.compose.list.Paginator
import com.algolia.instantsearch.compose.searchbox.SearchBox
import com.algolia.instantsearch.compose.searchbox.SearchBoxState
import com.algolia.instantsearch.core.selectable.list.SelectableItem
+import com.algolia.instantsearch.guides.model.Product
import com.algolia.search.model.search.Facet
import kotlinx.coroutines.launch
diff --git a/compose/src/main/java/com/algolia/searchapp/ui/theme/Color.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Color.kt
similarity index 76%
rename from compose/src/main/java/com/algolia/searchapp/ui/theme/Color.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Color.kt
index 515dce5f..63a8a707 100644
--- a/compose/src/main/java/com/algolia/searchapp/ui/theme/Color.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Color.kt
@@ -1,4 +1,4 @@
-package com.algolia.searchapp.ui.theme
+package com.algolia.instantsearch.guides.compose.theme
import androidx.compose.ui.graphics.Color
diff --git a/compose/src/main/java/com/algolia/searchapp/ui/theme/Shape.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Shape.kt
similarity index 83%
rename from compose/src/main/java/com/algolia/searchapp/ui/theme/Shape.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Shape.kt
index 1d2529d3..4ba7107b 100644
--- a/compose/src/main/java/com/algolia/searchapp/ui/theme/Shape.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Shape.kt
@@ -1,4 +1,4 @@
-package com.algolia.searchapp.ui.theme
+package com.algolia.instantsearch.guides.compose.theme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Shapes
diff --git a/compose/src/main/java/com/algolia/searchapp/ui/theme/Theme.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Theme.kt
similarity index 76%
rename from compose/src/main/java/com/algolia/searchapp/ui/theme/Theme.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Theme.kt
index 9318fc0f..c6fd14d9 100644
--- a/compose/src/main/java/com/algolia/searchapp/ui/theme/Theme.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Theme.kt
@@ -1,4 +1,4 @@
-package com.algolia.searchapp.ui.theme
+package com.algolia.instantsearch.guides.compose.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.MaterialTheme
@@ -16,15 +16,6 @@ private val LightColorPalette = lightColors(
primary = Purple500,
primaryVariant = Purple700,
secondary = Teal200
-
- /* Other default colors to override
- background = Color.White,
- surface = Color.White,
- onPrimary = Color.White,
- onSecondary = Color.Black,
- onBackground = Color.Black,
- onSurface = Color.Black,
- */
)
@Composable
diff --git a/compose/src/main/java/com/algolia/searchapp/ui/theme/Type.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Type.kt
similarity index 54%
rename from compose/src/main/java/com/algolia/searchapp/ui/theme/Type.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Type.kt
index c71f5640..74c5b39e 100644
--- a/compose/src/main/java/com/algolia/searchapp/ui/theme/Type.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/compose/theme/Type.kt
@@ -1,4 +1,4 @@
-package com.algolia.searchapp.ui.theme
+package com.algolia.instantsearch.guides.compose.theme
import androidx.compose.material.Typography
import androidx.compose.ui.text.TextStyle
@@ -13,16 +13,4 @@ val Typography = Typography(
fontWeight = FontWeight.Normal,
fontSize = 16.sp
)
- /* Other default text styles to override
- button = TextStyle(
- fontFamily = FontFamily.Default,
- fontWeight = FontWeight.W500,
- fontSize = 14.sp
- ),
- caption = TextStyle(
- fontFamily = FontFamily.Default,
- fontWeight = FontWeight.Normal,
- fontSize = 12.sp
- )
- */
-)
\ No newline at end of file
+)
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/Directory.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/Directory.kt
index 47511116..5f3b8d3b 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/Directory.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/Directory.kt
@@ -1,13 +1,18 @@
package com.algolia.instantsearch.guides.directory
+import com.algolia.instantsearch.guides.compose.ComposeActivity
import com.algolia.instantsearch.guides.gettingstarted.GettingStartedGuide
+import com.algolia.instantsearch.guides.insights.InsightsActivity
import com.algolia.instantsearch.guides.places.PlacesActivity
-import com.algolia.instantsearch.guides.querysuggestion.QuerySuggestionGuide
+import com.algolia.instantsearch.guides.querysuggestion.QuerySuggestionActivity
+import com.algolia.instantsearch.guides.voice.VoiceSearchActivity
import com.algolia.search.model.ObjectID
-
val guides = mapOf(
ObjectID("guide_getting_started") to GettingStartedGuide::class,
ObjectID("guide_places") to PlacesActivity::class,
- ObjectID("guide_query_suggestion") to QuerySuggestionGuide::class
-)
\ No newline at end of file
+ ObjectID("guide_query_suggestion") to QuerySuggestionActivity::class,
+ ObjectID("guide_insights") to InsightsActivity::class,
+ ObjectID("guide_declarative_ui") to ComposeActivity::class,
+ ObjectID("guide_voice_search") to VoiceSearchActivity::class,
+)
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryActivity.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryActivity.kt
index c9e93e53..4dd7c48b 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryActivity.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryActivity.kt
@@ -2,54 +2,49 @@ package com.algolia.instantsearch.guides.directory
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.algolia.instantsearch.android.searchbox.SearchBoxViewAppCompat
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.hits.connectHitsView
import com.algolia.instantsearch.guides.R
-import com.algolia.instantsearch.helper.android.list.autoScrollToStart
-import com.algolia.instantsearch.helper.android.searchbox.SearchBoxViewAppCompat
-import com.algolia.instantsearch.helper.searchbox.SearchBoxConnector
-import com.algolia.instantsearch.helper.searchbox.connectView
-import com.algolia.instantsearch.helper.searcher.SearcherSingleIndex
+import com.algolia.instantsearch.guides.extension.configure
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
import com.algolia.search.client.ClientSearch
import com.algolia.search.helper.deserialize
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.IndexName
-import kotlinx.android.synthetic.main.activity_query_suggestion.*
-
class DirectoryActivity : AppCompatActivity() {
- private val client = ClientSearch(ApplicationID("latency"), APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"))
- private val index = client.initIndex(IndexName("mobile_guides"))
- private val searcher = SearcherSingleIndex(index)
+ private val client = ClientSearch(
+ applicationID = ApplicationID("latency"),
+ apiKey = APIKey("1f6fd3a6fb973cb08419fe7d288fa4db")
+ )
+ private val searcher = HitsSearcher(client = client, indexName = IndexName("mobile_guides"))
private val connector = SearchBoxConnector(searcher)
private val connection = ConnectionHandler(connector)
- private val adapter = DirectoryAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_directory)
+ connection += connector.connectView(SearchBoxViewAppCompat(findViewById(R.id.searchView)))
-
+ val adapter = DirectoryAdapter()
connection += searcher.connectHitsView(adapter) { response ->
response.hits.deserialize(DirectoryHit.serializer())
.filter { guides.containsKey(it.objectID) }
.groupBy { it.type }
.toSortedMap()
.flatMap { (key, value) ->
- listOf(DirectoryItem.Header(key)) + value.map { DirectoryItem.Item(it) }.sortedBy { it.hit.objectID.raw }
+ listOf(DirectoryItem.Header(key)) + value.map { DirectoryItem.Item(it) }
+ .sortedBy { it.hit.objectID.raw }
}
}
- connection += connector.connectView(SearchBoxViewAppCompat(searchView))
- list.let {
- it.layoutManager = LinearLayoutManager(this)
- it.adapter = adapter
- it.itemAnimator = null
- it.autoScrollToStart(adapter)
- }
+ findViewById(R.id.list).configure(adapter)
searcher.searchAsync()
}
@@ -59,4 +54,4 @@ class DirectoryActivity : AppCompatActivity() {
searcher.cancel()
connection.clear()
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryAdapter.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryAdapter.kt
index 64d5c47f..4f58fd7e 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryAdapter.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryAdapter.kt
@@ -1,25 +1,23 @@
package com.algolia.instantsearch.guides.directory
-import android.annotation.SuppressLint
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
+import com.algolia.instantsearch.android.inflate
import com.algolia.instantsearch.core.hits.HitsView
import com.algolia.instantsearch.guides.R
-import com.algolia.instantsearch.helper.android.inflate
-
-class DirectoryAdapter : ListAdapter(diffUtil), HitsView {
+class DirectoryAdapter : ListAdapter(diffUtil),
+ HitsView {
private enum class ViewType {
- Header,
- Item
+ Header, Item
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DirectoryViewHolder {
return when (ViewType.values()[viewType]) {
- ViewType.Header -> DirectoryViewHolder.Header(parent.inflate(R.layout.list_item_header))
+ ViewType.Header -> DirectoryViewHolder.Header(parent.inflate(R.layout.list_item_header) as TextView)
ViewType.Item -> DirectoryViewHolder.Item(parent.inflate(R.layout.list_item_small))
}
}
@@ -56,10 +54,12 @@ class DirectoryAdapter : ListAdapter(diffUti
} else false
}
- @SuppressLint("DiffUtilEquals")
- override fun areContentsTheSame(oldItem: DirectoryItem, newItem: DirectoryItem): Boolean {
+ override fun areContentsTheSame(
+ oldItem: DirectoryItem,
+ newItem: DirectoryItem
+ ): Boolean {
return oldItem == newItem
}
}
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryHit.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryHit.kt
index d4d65d07..cc88a34a 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryHit.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryHit.kt
@@ -1,6 +1,6 @@
package com.algolia.instantsearch.guides.directory
-import com.algolia.instantsearch.helper.highlighting.Highlightable
+import com.algolia.instantsearch.highlighting.Highlightable
import com.algolia.search.model.Attribute
import com.algolia.search.model.ObjectID
import com.algolia.search.model.indexing.Indexable
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryViewHolder.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryViewHolder.kt
index 4c917f43..297e2e78 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryViewHolder.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/DirectoryViewHolder.kt
@@ -4,10 +4,9 @@ import android.content.Intent
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
-import com.algolia.instantsearch.helper.android.highlighting.toSpannedString
+import com.algolia.instantsearch.android.highlighting.toSpannedString
+import com.algolia.instantsearch.guides.R
import com.algolia.search.serialize.KeyName
-import kotlinx.android.synthetic.main.list_item_small.view.*
-
sealed class DirectoryViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@@ -22,8 +21,8 @@ sealed class DirectoryViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(item: DirectoryItem.Item) {
val text = item.hit.highlightedName?.toSpannedString() ?: item.hit.name
+ view.findViewById(R.id.itemName).text = text
- view.itemName.text = text
view.setOnClickListener {
val intent = Intent(view.context, guides.getValue(item.hit.objectID).java).apply {
putExtra(KeyName, item.hit.name)
@@ -33,4 +32,4 @@ sealed class DirectoryViewHolder(view: View) : RecyclerView.ViewHolder(view) {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/RecyclerView.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/RecyclerView.kt
new file mode 100644
index 00000000..61dc8a2d
--- /dev/null
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/RecyclerView.kt
@@ -0,0 +1,21 @@
+package com.algolia.instantsearch.guides.extension
+
+import android.view.View
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.algolia.instantsearch.android.list.autoScrollToStart
+import com.algolia.instantsearch.guides.model.Product
+
+internal fun RecyclerView.configure(recyclerViewAdapter: RecyclerView.Adapter<*>) {
+ visibility = View.VISIBLE
+ layoutManager = LinearLayoutManager(context)
+ adapter = recyclerViewAdapter
+ itemAnimator = null
+ autoScrollToStart(recyclerViewAdapter)
+}
+
+object ProductDiffUtil : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: Product, newItem: Product) = oldItem.objectID == newItem.objectID
+ override fun areContentsTheSame(oldItem: Product, newItem: Product) = oldItem == newItem
+}
diff --git a/insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/extension/SearchView.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/SearchView.kt
similarity index 92%
rename from insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/extension/SearchView.kt
rename to guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/SearchView.kt
index 331a977c..e3bdc8a8 100644
--- a/insights/src/main/kotlin/com/algolia/instantsearch/insights/showcase/extension/SearchView.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/extension/SearchView.kt
@@ -1,4 +1,4 @@
-package com.algolia.instantsearch.insights.showcase.extension
+package com.algolia.instantsearch.guides.insights.extension
import android.graphics.drawable.Drawable
import android.text.Spannable
@@ -8,7 +8,7 @@ import android.widget.AutoCompleteTextView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat
-import com.algolia.instantsearch.insights.showcase.R
+import com.algolia.instantsearch.guides.R
fun AppCompatActivity.configureSearchView(
searchView: SearchView,
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/FacetFragment.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/FacetFragment.kt
index 0c39e39d..bf106605 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/FacetFragment.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/FacetFragment.kt
@@ -1,54 +1,42 @@
package com.algolia.instantsearch.guides.gettingstarted
import android.os.Bundle
-import android.view.LayoutInflater
import android.view.View
-import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.RecyclerView
+import com.algolia.instantsearch.android.filter.facet.FacetListAdapter
import com.algolia.instantsearch.core.connection.ConnectionHandler
+import com.algolia.instantsearch.filter.facet.connectView
import com.algolia.instantsearch.guides.R
-import com.algolia.instantsearch.helper.android.filter.facet.FacetListAdapter
-import com.algolia.instantsearch.helper.android.list.autoScrollToStart
-import com.algolia.instantsearch.helper.filter.facet.connectView
-import kotlinx.android.synthetic.main.fragment_facet.*
+import com.algolia.instantsearch.guides.extension.configure
+class FacetFragment : Fragment(R.layout.fragment_facet) {
-class FacetFragment : Fragment() {
-
+ private val viewModel: MyViewModel by activityViewModels()
private val connection = ConnectionHandler()
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- return inflater.inflate(R.layout.fragment_facet, container, false)
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- val viewModel = ViewModelProvider(requireActivity())[MyViewModel::class.java]
+ setupToolbar(view)
val adapterFacet = FacetListAdapter(MyFacetListViewHolder.Factory)
+ val facetList = view.findViewById(R.id.facetList)
+ connection += viewModel.facetList.connectView(adapterFacet, viewModel.facetPresenter)
- facetList.let {
- it.adapter = adapterFacet
- it.layoutManager = LinearLayoutManager(requireContext())
- it.autoScrollToStart(adapterFacet)
- }
+ facetList.configure(adapterFacet)
+ }
+
+ private fun setupToolbar(view: View) {
(requireActivity() as AppCompatActivity).let {
- it.setSupportActionBar(toolbar)
+ it.setSupportActionBar(view.findViewById(R.id.toolbar))
it.supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
-
- connection += viewModel.facetList.connectView(adapterFacet, viewModel.facetPresenter)
}
override fun onDestroyView() {
super.onDestroyView()
connection.clear()
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/GettingStartedGuide.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/GettingStartedGuide.kt
index 5c9b468c..bf3479da 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/GettingStartedGuide.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/GettingStartedGuide.kt
@@ -1,36 +1,44 @@
package com.algolia.instantsearch.guides.gettingstarted
import android.os.Bundle
+import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.commit
+import androidx.fragment.app.replace
import com.algolia.instantsearch.guides.R
-
class GettingStartedGuide : AppCompatActivity() {
+ val viewModel: MyViewModel by viewModels()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_getting_started)
-
+ setupNavigation()
showProductFragment()
}
- fun showFacetFragment() {
- supportFragmentManager
- .beginTransaction()
- .add(R.id.container, FacetFragment())
- .addToBackStack("facet")
- .commit()
+ private fun setupNavigation() {
+ viewModel.displayFilters.observe(this) {
+ showFacetFragment()
+ }
+ }
+
+ private fun showFacetFragment() {
+ supportFragmentManager.commit {
+ replace(R.id.container)
+ addToBackStack("facet")
+ }
}
- fun showProductFragment() {
- supportFragmentManager
- .beginTransaction()
- .add(R.id.container, ProductFragment())
- .commit()
+ private fun showProductFragment() {
+ supportFragmentManager.commit {
+ replace(R.id.container)
+ }
}
override fun onSupportNavigateUp(): Boolean {
- supportFragmentManager.popBackStack()
+ if (supportFragmentManager.popBackStackImmediate()) return true
return super.onSupportNavigateUp()
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyFacetListViewHolder.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyFacetListViewHolder.kt
index 004b334e..d5a31846 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyFacetListViewHolder.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyFacetListViewHolder.kt
@@ -2,21 +2,22 @@ package com.algolia.instantsearch.guides.gettingstarted
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import com.algolia.instantsearch.android.filter.facet.FacetListViewHolder
+import com.algolia.instantsearch.android.inflate
import com.algolia.instantsearch.guides.R
-import com.algolia.instantsearch.helper.android.filter.facet.FacetListViewHolder
-import com.algolia.instantsearch.helper.android.inflate
import com.algolia.search.model.search.Facet
-import kotlinx.android.synthetic.main.list_item_selectable.view.*
-
class MyFacetListViewHolder(view: View) : FacetListViewHolder(view) {
override fun bind(facet: Facet, selected: Boolean, onClickListener: View.OnClickListener) {
view.setOnClickListener(onClickListener)
- view.facetCount.text = facet.count.toString()
- view.facetCount.visibility = View.VISIBLE
- view.icon.visibility = if (selected) View.VISIBLE else View.INVISIBLE
- view.facetName.text = facet.value
+ val facetCount = view.findViewById(R.id.facetCount)
+ facetCount.text = facet.count.toString()
+ facetCount.visibility = View.VISIBLE
+ view.findViewById(R.id.icon).visibility = if (selected) View.VISIBLE else View.INVISIBLE
+ view.findViewById(R.id.facetName).text = facet.value
}
object Factory : FacetListViewHolder.Factory {
@@ -25,4 +26,4 @@ class MyFacetListViewHolder(view: View) : FacetListViewHolder(view) {
return MyFacetListViewHolder(parent.inflate(R.layout.list_item_selectable))
}
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyViewModel.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyViewModel.kt
index 0d0dcce1..f1d34522 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyViewModel.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/MyViewModel.kt
@@ -1,29 +1,29 @@
package com.algolia.instantsearch.guides.gettingstarted
-import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
-import androidx.paging.LivePagedListBuilder
-import androidx.paging.PagedList
+import androidx.paging.PagingConfig
+import com.algolia.instantsearch.android.paging3.Paginator
+import com.algolia.instantsearch.android.paging3.filterstate.connectPaginator
+import com.algolia.instantsearch.android.paging3.liveData
+import com.algolia.instantsearch.android.paging3.searchbox.connectPaginator
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.core.selectable.list.SelectionMode
-import com.algolia.instantsearch.helper.android.filter.state.connectPagedList
-import com.algolia.instantsearch.helper.android.list.SearcherSingleIndexDataSource
-import com.algolia.instantsearch.helper.android.searchbox.SearchBoxConnectorPagedList
-import com.algolia.instantsearch.helper.filter.facet.FacetListConnector
-import com.algolia.instantsearch.helper.filter.facet.FacetListPresenterImpl
-import com.algolia.instantsearch.helper.filter.facet.FacetSortCriterion
-import com.algolia.instantsearch.helper.filter.state.FilterState
-import com.algolia.instantsearch.helper.searcher.SearcherSingleIndex
-import com.algolia.instantsearch.helper.searcher.connectFilterState
-import com.algolia.instantsearch.helper.stats.StatsConnector
+import com.algolia.instantsearch.filter.facet.FacetListConnector
+import com.algolia.instantsearch.filter.facet.FacetListPresenterImpl
+import com.algolia.instantsearch.filter.facet.FacetSortCriterion
+import com.algolia.instantsearch.filter.state.FilterState
+import com.algolia.instantsearch.guides.model.Product
+import com.algolia.instantsearch.searchbox.SearchBoxConnector
+import com.algolia.instantsearch.searcher.connectFilterState
+import com.algolia.instantsearch.searcher.hits.HitsSearcher
+import com.algolia.instantsearch.stats.StatsConnector
import com.algolia.search.client.ClientSearch
import com.algolia.search.model.APIKey
import com.algolia.search.model.ApplicationID
import com.algolia.search.model.Attribute
import com.algolia.search.model.IndexName
-import io.ktor.client.features.logging.LogLevel
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
+import io.ktor.client.features.logging.*
class MyViewModel : ViewModel() {
@@ -32,27 +32,19 @@ class MyViewModel : ViewModel() {
APIKey("1f6fd3a6fb973cb08419fe7d288fa4db"),
LogLevel.ALL
)
- val index = client.initIndex(IndexName("bestbuy_promo"))
- val searcher = SearcherSingleIndex(index)
-
- val dataSourceFactory = SearcherSingleIndexDataSource.Factory(searcher) { hit ->
- Product(
- hit.json.getValue("name").jsonPrimitive.content,
- hit.json["_highlightResult"]?.jsonObject
- )
- }
- val pagedListConfig =
- PagedList.Config.Builder().setPageSize(50).setEnablePlaceholders(false).build()
- val products: LiveData> =
- LivePagedListBuilder(dataSourceFactory, pagedListConfig).build()
- val searchBox = SearchBoxConnectorPagedList(searcher, listOf(products))
+ val searcher = HitsSearcher(client = client, indexName = IndexName("instant_search"))
+ val paginator = Paginator(
+ searcher = searcher,
+ pagingConfig = PagingConfig(pageSize = 50, enablePlaceholders = false)
+ ) { hit -> hit.deserialize(Product.serializer()) }
+ val searchBox = SearchBoxConnector(searcher)
val stats = StatsConnector(searcher)
val filterState = FilterState()
val facetList = FacetListConnector(
searcher = searcher,
filterState = filterState,
- attribute = Attribute("category"),
+ attribute = Attribute("categories"),
selectionMode = SelectionMode.Single
)
val facetPresenter = FacetListPresenterImpl(
@@ -61,12 +53,15 @@ class MyViewModel : ViewModel() {
)
val connection = ConnectionHandler()
+ val displayFilters = MutableLiveData()
+
init {
connection += searchBox
connection += stats
connection += facetList
connection += searcher.connectFilterState(filterState)
- connection += filterState.connectPagedList(products)
+ connection += filterState.connectPaginator(paginator)
+ connection += searchBox.connectPaginator(paginator)
}
override fun onCleared() {
@@ -74,4 +69,4 @@ class MyViewModel : ViewModel() {
searcher.cancel()
connection.clear()
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/Product.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/Product.kt
deleted file mode 100644
index cbeeb967..00000000
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/Product.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.algolia.instantsearch.guides.gettingstarted
-
-import com.algolia.instantsearch.core.highlighting.HighlightedString
-import com.algolia.instantsearch.helper.highlighting.Highlightable
-import com.algolia.search.model.Attribute
-import kotlinx.serialization.Transient
-import kotlinx.serialization.json.JsonObject
-
-
-data class Product(
- val name: String,
- override val _highlightResult: JsonObject?
-) : Highlightable {
-
- @Transient
- public val highlightedName: HighlightedString?
- get() = getHighlight(Attribute("name"))
-}
\ No newline at end of file
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductAdapter.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductAdapter.kt
index 027f9cd8..353f2173 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductAdapter.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductAdapter.kt
@@ -1,42 +1,33 @@
package com.algolia.instantsearch.guides.gettingstarted
-import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
-import androidx.paging.PagedListAdapter
-import androidx.recyclerview.widget.DiffUtil
+import android.widget.TextView
+import androidx.paging.PagingDataAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.algolia.instantsearch.android.highlighting.toSpannedString
+import com.algolia.instantsearch.android.inflate
import com.algolia.instantsearch.guides.R
+import com.algolia.instantsearch.guides.extension.ProductDiffUtil
+import com.algolia.instantsearch.guides.gettingstarted.ProductAdapter.ProductViewHolder
+import com.algolia.instantsearch.guides.model.Product
-
-class ProductAdapter : PagedListAdapter(
- ProductAdapter
-) {
+class ProductAdapter : PagingDataAdapter(ProductDiffUtil) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
- val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_small, parent, false)
-
- return ProductViewHolder(view)
+ return ProductViewHolder(parent.inflate(R.layout.list_item_small))
}
override fun onBindViewHolder(holder: ProductViewHolder, position: Int) {
- val product = getItem(position)
-
- if (product != null) holder.bind(product)
+ getItem(position)?.let { holder.bind(it) }
}
- companion object : DiffUtil.ItemCallback() {
-
- override fun areItemsTheSame(
- oldItem: Product,
- newItem: Product
- ): Boolean {
- return oldItem::class == newItem::class
- }
+ class ProductViewHolder(val view: View) :
+ RecyclerView.ViewHolder(view) {
- override fun areContentsTheSame(
- oldItem: Product,
- newItem: Product
- ): Boolean {
- return oldItem.name == newItem.name
+ fun bind(product: Product) {
+ view.findViewById(R.id.itemName).text =
+ product.highlightedName?.toSpannedString() ?: product.name
}
}
-}
\ No newline at end of file
+}
diff --git a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductFragment.kt b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductFragment.kt
index f99595de..99ff5b9b 100644
--- a/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductFragment.kt
+++ b/guides/src/main/kotlin/com/algolia/instantsearch/guides/gettingstarted/ProductFragment.kt
@@ -1,63 +1,50 @@
package com.algolia.instantsearch.guides.gettingstarted
import android.os.Bundle
-import android.view.LayoutInflater
import android.view.View
-import android.view.ViewGroup
+import android.widget.Button
import androidx.fragment.app.Fragment
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.RecyclerView
+import com.algolia.instantsearch.android.paging3.liveData
+import com.algolia.instantsearch.android.searchbox.SearchBoxViewAppCompat
+import com.algolia.instantsearch.android.stats.StatsTextView
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.guides.R
-import com.algolia.instantsearch.helper.android.list.autoScrollToStart
-import com.algolia.instantsearch.helper.android.searchbox.SearchBoxViewAppCompat
-import com.algolia.instantsearch.helper.android.searchbox.connectView
-import com.algolia.instantsearch.helper.android.stats.StatsTextView
-import com.algolia.instantsearch.helper.stats.StatsPresenterImpl
-import com.algolia.instantsearch.helper.stats.connectView
-import kotlinx.android.synthetic.main.fragment_product.*
+import com.algolia.instantsearch.guides.extension.configure
+import com.algolia.instantsearch.searchbox.connectView
+import com.algolia.instantsearch.stats.StatsPresenterImpl
+import com.algolia.instantsearch.stats.connectView
+class ProductFragment : Fragment(R.layout.fragment_product) {
-class ProductFragment : Fragment() {
-
+ private val viewModel: MyViewModel by activityViewModels()
private val connection = ConnectionHandler()
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- return inflater.inflate(R.layout.fragment_product, container, false)
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- val viewModel = ViewModelProvider(requireActivity())[MyViewModel::class.java]
val adapterProduct = ProductAdapter()
- viewModel.products.observe(
- viewLifecycleOwner,
- Observer { hits -> adapterProduct.submitList(hits) })
-
- productList.let {
- it.itemAnimator = null
- it.adapter = adapterProduct
- it.layoutManager = LinearLayoutManager(requireContext())
- it.autoScrollToStart(adapterProduct)
+
+ viewModel.paginator.liveData.observe(viewLifecycleOwner) { pagingData ->
+ adapterProduct.submitData(lifecycle, pagingData)
}
- val searchBoxView = SearchBoxViewAppCompat(searchView)
+ view.findViewById(R.id.productList).configure(adapterProduct)
+
+ val searchBoxView = SearchBoxViewAppCompat(view.findViewById(R.id.searchView))
connection += viewModel.searchBox.connectView(searchBoxView)
- val statsView = StatsTextView(stats)
+ val statsView = StatsTextView(view.findViewById(R.id.stats))
connection += viewModel.stats.connectView(statsView, StatsPresenterImpl())
- filters.setOnClickListener { (requireActivity() as GettingStartedGuide).showFacetFragment() }
+ view.findViewById