/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.amazonaws.services.chime.sdkdemo.fragment import android.app.AlertDialog import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter import android.widget.Button import android.widget.CheckBox import android.widget.CheckedTextView import android.widget.CompoundButton import android.widget.EditText import android.widget.ExpandableListAdapter import android.widget.ExpandableListView import android.widget.ExpandableListView.OnChildClickListener import android.widget.Spinner import android.widget.TextView import androidx.fragment.app.Fragment import com.amazonaws.services.chime.sdk.meetings.utils.logger.ConsoleLogger import com.amazonaws.services.chime.sdk.meetings.utils.logger.LogLevel import com.amazonaws.services.chime.sdkdemo.R import com.amazonaws.services.chime.sdkdemo.activity.HomeActivity import com.amazonaws.services.chime.sdkdemo.adapter.LanguageOptionsAdapter import com.amazonaws.services.chime.sdkdemo.data.SpinnerItem import com.amazonaws.services.chime.sdkdemo.data.TranscribeLanguageOption import java.lang.ClassCastException import kotlinx.android.synthetic.main.fragment_transcription_config.checkboxCustomLanguageModel import kotlinx.android.synthetic.main.fragment_transcription_config.checkboxPHIContentIdentification import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class TranscriptionConfigFragment : Fragment() { private val logger = ConsoleLogger(LogLevel.INFO) private val uiScope = CoroutineScope(Dispatchers.Main) private var languages = mutableListOf() private var regions = mutableListOf() private val languageGroups = arrayListOf( "English", "Spanish", "French", "Italian", "German", "Portuguese", "Japanese", "Korean", "Chinese" ) private val languagesMap = mapOf( "en-US" to "US English (en-US)", "es-US" to "US Spanish (es-US)", "en-GB" to "British English (en-GB)", "en-AU" to "Australian English (en-AU)", "fr-CA" to "Canadian French (fr-CA)", "fr-FR" to "French (fr-FR)", "it-IT" to "Italian (it-IT)", "de-DE" to "German (de-DE)", "pt-BR" to "Brazilian Portuguese (pt-BR)", "ja-JP" to "Japanese (ja-JP)", "ko-KR" to "Korean (ko-KR)", "zh-CN" to "Mandarin Chinese - Mainland (zh-CN)" ) private val languageGroupMapping: List> = listOf>( Pair("English", "en-US"), Pair("English", "en-GB"), Pair("English", "en-AU"), Pair("Spanish", "es-US"), Pair("French", "fr-CA"), Pair("French", "fr-FR"), Pair("Italian", "it-IT"), Pair("German", "de-DE"), Pair("Portuguese", "pt-BR"), Pair("Japanese", "ja-JP"), Pair("Korean", "ko-KR"), Pair("Chinese", "zh-CN") ) private val regionsMap = mapOf( "auto" to "Auto", "" to "Not specified", "ap-northeast-1" to "Japan (Tokyo)", "ap-northeast-2" to "South Korea (Seoul)", "ap-southeast-2" to "Australia (Sydney)", "ca-central-1" to "Canada", "eu-central-1" to "Germany (Frankfurt)", "eu-west-1" to "Ireland", "eu-west-2" to "United Kingdom (London)", "sa-east-1" to "Brazil (São Paulo)", "us-east-1" to "United States (N. Virginia)", "us-east-2" to "United States (Ohio)", "us-west-2" to "United States (Oregon)" ) private val transcribeLanguages: List = arrayOf( "en-US", "es-US", "en-GB", "en-AU", "fr-CA", "fr-FR", "it-IT", "de-DE", "pt-BR", "ja-JP", "ko-KR", "zh-CN" ).mapNotNull { l -> languagesMap[l]?.let { SpinnerItem(l, it) } } private val transcribeRegions: List = arrayOf( "auto", "", "ap-northeast-1", "ap-northeast-2", "ap-southeast-2", "ca-central-1", "eu-central-1", "eu-west-1", "eu-west-2", "sa-east-1", "us-east-1", "us-east-2", "us-west-2" ).mapNotNull { l -> regionsMap[l]?.let { SpinnerItem(l, it) } } private val transcribePartialResultStabilizationValues: List = mapOf( null to "Enable Partial Results Stabilization", "default" to "-- DEFAULT (HIGH) --", "low" to "Low", "medium" to "Medium", "high" to "High" ).map { SpinnerItem(it.key, it.value) } private val transcribePiiOptions: List = mapOf( "" to "ALL", "BANK_ROUTING" to "BANK ROUTING", "CREDIT_DEBIT_NUMBER" to "CREDIT/DEBIT NUMBER", "CREDIT_DEBIT_CVV" to "CREDIT/DEBIT CVV", "CREDIT_DEBIT_EXPIRY" to "CREDIT/DEBIT EXPIRY", "PIN" to "PIN", "EMAIL" to "EMAIL", "ADDRESS" to "ADDRESS", "NAME" to "NAME", "PHONE" to "PHONE NUMBER", "SSN" to "SSN" ).map { SpinnerItem(it.key, it.value) } private val transcribePreferredLanguageDefaultOption: List = mapOf( "" to "[Optional] Select preferred language" ).map { SpinnerItem(it.key, it.value) } private val transcribeIdentificationOptions: MutableList = mutableListOf() private val transcribeRedactionOptions: MutableList = mutableListOf() private val transcribePartialResultStabilizationOptions: MutableList = transcribePartialResultStabilizationValues.toMutableList() private val preferredLanguageOptions: MutableList = mutableListOf() private val languageOptionsSelected: MutableSet = mutableSetOf() private val languageOptions: HashMap> = HashMap() private val transcribeMedicalLanguages: List = arrayOf("en-US").mapNotNull { l -> languagesMap[l]?.let { SpinnerItem(l, it) } } private val transcribeMedicalRegions: List = arrayOf( "auto", "", "ap-southeast-2", "ca-central-1", "eu-west-1", "us-east-1", "us-east-2", "us-west-2" ).mapNotNull { l -> regionsMap[l]?.let { SpinnerItem(l, it) } } private val transcribeEngines: List = mapOf( "transcribe" to "Amazon Transcribe", "transcribe_medical" to "Amazon Transcribe Medical" ).map { SpinnerItem(it.key, it.value) } private lateinit var listener: TranscriptionConfigurationEventListener private val TAG = "TranscriptionConfigurationFragment" private lateinit var transcribeEngineSpinner: Spinner private lateinit var transcribeEngineAdapter: ArrayAdapter private lateinit var languageSpinner: Spinner private lateinit var languageAdapter: ArrayAdapter private lateinit var regionSpinner: Spinner private lateinit var regionAdapter: ArrayAdapter private lateinit var partialResultsStabilizationSpinner: Spinner private lateinit var partialResultsStabilizationAdapter: ArrayAdapter private lateinit var piiIdentificationSpinner: Spinner private lateinit var piiIdentificationAdapter: ArrayAdapter private lateinit var piiRedactionSpinner: Spinner private lateinit var piiRedactionAdapter: ArrayAdapter private lateinit var phiIdentificationCheckBox: CheckBox private lateinit var customLanguageModelCheckbox: CheckBox private lateinit var customLanguageModelEditText: EditText private lateinit var identifyLanguageCheckbox: CheckBox private lateinit var languageOptionsListView: ExpandableListView private lateinit var languageOptionsTextView: TextView private lateinit var languageOptionsAdapter: ExpandableListAdapter private lateinit var preferredLanguageSpinner: Spinner private lateinit var preferredLanguageAdapter: ArrayAdapter private val TRANSCRIBE_ENGINE_SPINNER_INDEX_KEY = "transcribeEngineSpinnerIndex" private val LANGUAGE_SPINNER_INDEX_KEY = "languageSpinnerIndex" private val REGION_SPINNER_INDEX_KEY = "regionSpinnerIndex" private val PARTIAL_RESULTS_STABILIZATION_INDEX_KEY = "partialResultsStabilizationSpinnerIndex" private val PII_CONTENT_IDENTIFICATION_SPINNER_INDEX_KEY = "piiContentIdentificationSpinnerIndex" private val PII_CONTENT_REDACTION_SPINNER_INDEX_KEY = "piiContentRedactionSpinnerIndex" private val PHI_CONTENT_IDENTIFICATION_ENABLED_KEY = "phiContentIdentificationEnabled" private val CUSTOM_LANGUAGE_MODEL_NAME_KEY = "customLanguageModelName" private val IDENTIFY_LANGUAGE_ENABLED_KEY = "identifyLanguageEnabled" private val PREFERRED_LANGUAGE_INDEX_KEY = "preferredLanguageIndex" companion object { fun newInstance(meetingId: String): TranscriptionConfigFragment { val fragment = TranscriptionConfigFragment() fragment.arguments = Bundle().apply { putString(HomeActivity.MEETING_ID_KEY, meetingId) } return fragment } } interface TranscriptionConfigurationEventListener { fun onStartTranscription( engine: SpinnerItem, language: SpinnerItem?, region: SpinnerItem, partialResultsStability: SpinnerItem, contentIdentificationType: SpinnerItem?, contentRedactionType: SpinnerItem?, languageModelName: String?, identifyLanguage: Boolean, languageOptions: String?, preferredLanguage: SpinnerItem? ) } override fun onAttach(context: Context) { super.onAttach(context) if (context is TranscriptionConfigurationEventListener) { listener = context } else { logger.error(TAG, "$context must implement TranscriptionConfigurationEventListener.") throw ClassCastException("$context must implement TranscriptionConfigurationEventListener.") } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_transcription_config, container, false) val context = activity as Context view.findViewById