Skip to content

Commit

Permalink
Initial phrase (#27)
Browse files Browse the repository at this point in the history
* Initial phrase & version update

* Update versions
  • Loading branch information
lambdatamer committed Sep 11, 2019
1 parent 83878f0 commit db6d1f5
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 41 deletions.
9 changes: 4 additions & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,14 @@ repositories {

dependencies {

implementation("androidx.appcompat:appcompat:1.0.2")
implementation("androidx.appcompat:appcompat:1.1.0")
implementation("androidx.recyclerview:recyclerview:1.0.0")
implementation("androidx.constraintlayout:constraintlayout:1.1.3")
implementation("androidx.core:core-ktx:1.0.2")
implementation("androidx.lifecycle:lifecycle-extensions:2.0.0")
implementation("androidx.core:core-ktx:1.1.0")
implementation("androidx.lifecycle:lifecycle-extensions:2.1.0")

implementation(kotlin("stdlib"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1")

implementation("com.justai.aimybox:components:$componentsVersion")
implementation("com.justai.aimybox:core:$aimyboxVersion")
Expand Down
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import com.jfrog.bintray.gradle.BintrayExtension


buildscript {
val kotlinVersion = "1.3.41"
val aimyboxVersion = "0.2.1"
val componentsVersion = "0.1.2"
val kotlinVersion = "1.3.50"
val aimyboxVersion = "0.2.21"
val componentsVersion = "0.1.3"

extra.set("kotlinVersion", kotlinVersion)
extra.set("aimyboxVersion", aimyboxVersion)
Expand Down
9 changes: 4 additions & 5 deletions components/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,15 @@ repositories {

dependencies {

implementation("androidx.appcompat:appcompat:1.0.2")
implementation("androidx.appcompat:appcompat:1.1.0")
implementation("androidx.recyclerview:recyclerview:1.0.0")
implementation("androidx.constraintlayout:constraintlayout:1.1.3")
implementation("androidx.core:core-ktx:1.0.2")
implementation("androidx.lifecycle:lifecycle-extensions:2.0.0")
implementation("androidx.core:core-ktx:1.1.0")
implementation("androidx.lifecycle:lifecycle-extensions:2.1.0")
implementation("com.google.android.material:material:1.0.0")

implementation(kotlin("stdlib"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-M1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1")

implementation("com.github.bumptech.glide:glide:4.9.0")
annotationProcessor("com.github.bumptech.glide:compiler:4.9.0")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand All @@ -20,20 +21,17 @@ import com.justai.aimybox.components.adapter.AimyboxAssistantAdapter
import com.justai.aimybox.components.extensions.isPermissionGranted
import com.justai.aimybox.components.extensions.startActivityIfExist
import com.justai.aimybox.components.view.AimyboxButton
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelChildren
import kotlinx.android.parcel.Parcelize
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext


class AimyboxAssistantFragment : Fragment(), CoroutineScope {

companion object {
private const val REQUEST_PERMISSION_CODE = 100

private const val ARGUMENTS_KEY = "arguments"
}

override val coroutineContext: CoroutineContext = Dispatchers.Main + Job()
Expand All @@ -42,7 +40,7 @@ class AimyboxAssistantFragment : Fragment(), CoroutineScope {
private lateinit var recycler: RecyclerView
private lateinit var aimyboxButton: AimyboxButton

private lateinit var adapter : AimyboxAssistantAdapter
private lateinit var adapter: AimyboxAssistantAdapter
private var revealTimeMs = 0L

override fun onAttach(context: Context) {
Expand All @@ -53,44 +51,50 @@ class AimyboxAssistantFragment : Fragment(), CoroutineScope {
}

if (!::viewModel.isInitialized) {
viewModel = ViewModelProviders.of(requireActivity(), aimyboxProvider.getViewModelFactory())
.get(AimyboxAssistantViewModel::class.java)
viewModel =
ViewModelProviders.of(requireActivity(), aimyboxProvider.getViewModelFactory())
.get(AimyboxAssistantViewModel::class.java)

val initialPhrase = arguments?.getParcelable<Arguments>(ARGUMENTS_KEY)?.initialPhrase
?: context.getString(R.string.initial_phrase)

viewModel.setInitialPhrase(initialPhrase)
}
onViewModelInitialized(viewModel)

revealTimeMs = context.resources.getInteger(R.integer.assistant_reveal_time_ms).toLong()
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) =
inflater.inflate(R.layout.fragment_aimybox_assistant, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.apply {
recycler = findViewById(R.id.fragment_aimybox_assistant_recycler)
recycler.adapter = adapter
aimyboxButton = findViewById(R.id.fragment_aimybox_assistant_button)
aimyboxButton.setOnClickListener(::onAimyboxButtonClick)
}
}

@CallSuper
fun onViewModelInitialized(viewModel: AimyboxAssistantViewModel) {
adapter = AimyboxAssistantAdapter(viewModel::onButtonClick)
recycler.adapter = adapter

viewModel.isAssistantVisible.observe(this, Observer { isVisible ->
viewModel.isAssistantVisible.observe(viewLifecycleOwner, Observer { isVisible ->
coroutineContext.cancelChildren()
if (isVisible) aimyboxButton.expand() else aimyboxButton.collapse()
})

viewModel.aimyboxState.observe(this, Observer { state ->
viewModel.aimyboxState.observe(viewLifecycleOwner, Observer { state ->
if (state == Aimybox.State.LISTENING) {
aimyboxButton.onRecordingStarted()
} else {
aimyboxButton.onRecordingStopped()
}
})

viewModel.widgets.observe(this, Observer(adapter::setData))
viewModel.widgets.observe(viewLifecycleOwner, Observer(adapter::setData))

viewModel.soundVolumeRms.observe(this, Observer { volume ->
if (::aimyboxButton.isInitialized) {
Expand All @@ -115,7 +119,11 @@ class AimyboxAssistantFragment : Fragment(), CoroutineScope {
}

@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == REQUEST_PERMISSION_CODE && permissions.firstOrNull() == Manifest.permission.RECORD_AUDIO) {
if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) {
viewModel.onAssistantButtonClick()
Expand All @@ -128,6 +136,12 @@ class AimyboxAssistantFragment : Fragment(), CoroutineScope {
}
}
}
/**
* Use the method to set custom initial phrase for the assistant
* */
fun putArguments(arguments: Arguments) = apply {
setArguments(Bundle().apply { putParcelable(ARGUMENTS_KEY, arguments) })
}

/**
* Back press handler. Add this method invocation in your activity to make back pressed behavior correct.
Expand Down Expand Up @@ -159,4 +173,7 @@ class AimyboxAssistantFragment : Fragment(), CoroutineScope {
else -> null
}
}

@Parcelize
data class Arguments(val initialPhrase: String? = null) : Parcelable
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,15 @@ import com.justai.aimybox.Aimybox
import com.justai.aimybox.api.DialogApi
import com.justai.aimybox.components.widget.*
import com.justai.aimybox.model.Request
import com.justai.aimybox.model.Response
import com.justai.aimybox.model.TextSpeech
import com.justai.aimybox.model.reply.ButtonsReply
import com.justai.aimybox.model.reply.ImageReply
import com.justai.aimybox.model.reply.Reply
import com.justai.aimybox.model.reply.TextReply
import com.justai.aimybox.speechtotext.SpeechToText
import com.justai.aimybox.texttospeech.TextToSpeech
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.BroadcastChannel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.ReceiveChannel
import kotlinx.coroutines.channels.SendChannel
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.launch

/**
Expand Down Expand Up @@ -65,6 +58,10 @@ open class AimyboxAssistantViewModel(val aimybox: Aimybox) : ViewModel(), Corout
}
}

fun setInitialPhrase(text: String) {
widgetsInternal.value = listOf(ResponseWidget(text))
}

@RequiresPermission("android.permission.RECORD_AUDIO")
fun onButtonClick(button: Button) {
removeButtonWidgets()
Expand Down
2 changes: 2 additions & 0 deletions components/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="initial_phrase">Hello! How can I help you?</string>

<string name="require_mic_access">Voice Assistant requires microphone access to work</string>
<string name="grant_permission">Please grant the permission to the app</string>
<string name="grant">Grant</string>
Expand Down

0 comments on commit db6d1f5

Please sign in to comment.