package com.example.myapplication import android.Manifest import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.* import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import com.example.myapplication.api.ApiService import com.example.myapplication.databinding.ActivityMainBinding import com.google.ar.core.Session import com.google.ar.sceneform.rendering.ModelRenderable import com.google.ar.sceneform.ux.ArFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import com.stripe.android.paymentsheet.PaymentSheet import com.stripe.android.paymentsheet.PaymentSheetResult import com.stripe.android.paymentsheet.model.PaymentMethodCreateParams class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var arFragment: ArFragment private lateinit var session: Session private val watchModels = mutableListOf<ModelRenderable?>() private val sneakerModels = mutableListOf<ModelRenderable?>() private val glassesModels = mutableListOf<ModelRenderable?>() private lateinit var watchPagerAdapter: ModelPagerAdapter private lateinit var sneakerPagerAdapter: ModelPagerAdapter private lateinit var glassesPagerAdapter: ModelPagerAdapter private lateinit var arModelView: ArModelView private lateinit var apiService: ApiService private lateinit var paymentSheet: PaymentSheet private val TAG = "MainActivity" private val cameraExecutor = Executors.newSingleThreadExecutor() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) initializeComponents() checkPermissionsAndStartCamera() setupAdapters() setupButtonListeners() loadModels() } private fun initializeComponents() { arFragment = supportFragmentManager.findFragmentById(R.id.ar_fragment) as ArFragment setupARSession() setupPaymentSheet() initializeApiService() arModelView = ArModelView(this, fragmentManager = supportFragmentManager) // Initialize new UI components binding.switchModelButton = findViewById(R.id.switch_model_button) binding.captureSceneButton = findViewById(R.id.capture_scene_button) binding.arInstructionsOverlay = findViewById(R.id.arInstructionsOverlay) binding.loadingIndicator = findViewById(R.id.loadingIndicator) binding.errorMessage = findViewById(R.id.errorMessage) } private fun setupPaymentSheet() { // Initialize Stripe PaymentSheet paymentSheet = PaymentSheet(this, ::onPaymentSheetResult) } private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) { when (paymentSheetResult) { is PaymentSheetResult.Completed -> { showToast("Payment complete") } is PaymentSheetResult.Canceled -> { showToast("Payment canceled") } is PaymentSheetResult.Failed -> { showToast("Payment failed: ${paymentSheetResult.error.localizedMessage}") } } } private fun setupAdapters() { watchPagerAdapter = ModelPagerAdapter(watchModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle watch item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.watchViewPager.adapter = watchPagerAdapter sneakerPagerAdapter = ModelPagerAdapter(sneakerModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle sneaker item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.sneakerViewPager.adapter = sneakerPagerAdapter glassesPagerAdapter = ModelPagerAdapter(glassesModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle glasses item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.glassesViewPager.adapter = glassesPagerAdapter } private fun setupButtonListeners() { binding.tryWatchesButton.setOnClickListener { showModels(binding.watchViewPager) } binding.trySneakersButton.setOnClickListener { showModels(binding.sneakerViewPager) } binding.tryGlassesButton.setOnClickListener { showModels(binding.glassesViewPager) } binding.switchModelButton.setOnClickListener { // Handle model switching logic } binding.captureSceneButton.setOnClickListener { // Handle scene capture logic } } private fun showModels(viewPager: ViewPager2) { binding.watchViewPager.visibility = View.GONE binding.sneakerViewPager.visibility = View.GONE binding.glassesViewPager.visibility = View.GONE viewPager.visibility = View.VISIBLE viewPager.animate().alpha(1f).setDuration(500).start() } private fun checkPermissionsAndStartCamera() { when { ContextCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) == PackageManager.PERMISSION_GRANTED -> { startCamera() } shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> { showPermissionRationaleDialog() } else -> { requestPermissionLauncher.launch(Manifest.permission.CAMERA) } } } private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() cameraProvider.unbindAll() val imageCapture = ImageCapture.Builder().build() try { cameraProvider.bindToLifecycle( this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture ) } catch (exc: Exception) { Log.e(TAG, "Use case binding failed", exc) } }, ContextCompat.getMainExecutor(this)) } private fun loadModels() { // Show loading indicator binding.loadingIndicator.visibility = View.VISIBLE lifecycleScope.launch { val modelFiles = listOf( "watch01", "watch02", "watch03", "watch04", "watch05", "watch06", "watch07", "watch08", "watch09", "watch10", "sneaker01", "sneaker02", "sneaker03", "sneaker04", "sneaker05", "sneaker06", "sneaker07", "sneaker08", "sneaker09", "sneaker10", "glasses01", "glasses02", "glasses03", "glasses04", "glasses05", "glasses06", "glasses07", "glasses08", "glasses09", "glasses10" ) modelFiles.forEach { modelFile -> loadModel(modelFile) } updateAdapters() // Hide loading indicator binding.loadingIndicator.visibility = View.GONE } } private suspend fun loadModel(modelFile: String) { withContext(Dispatchers.IO) { try { val resourceId = resources.getIdentifier(modelFile, "raw", packageName) val uri = Uri.parse("android.resource://$packageName/$resourceId") val renderable = ModelRenderable.builder() .setSource(this@MainActivity, uri) .build() .await() when { modelFile.startsWith("watch") -> watchModels.add(renderable) modelFile.startsWith("sneaker") -> sneakerModels.add(renderable) modelFile.startsWith("glasses") -> glassesModels.add(renderable) } } catch (e: Exception) { Log.e(TAG, "Error loading model: $modelFile", e) withContext(Dispatchers.Main) { binding.errorMessage.visibility = View.VISIBLE } } } } private fun updateAdapters() { runOnUiThread { watchPagerAdapter.notifyDataSetChanged() sneakerPagerAdapter.notifyDataSetChanged() glassesPagerAdapter.notifyDataSetChanged() } } private fun showToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } private fun showPermissionRationaleDialog() { // Show dialog explaining why the camera permission is needed } private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean -> if (isGranted) { startCamera() } else { // Handle permission denied showToast("Camera permission is required for this app.") } } override fun onDestroy() { super.onDestroy() cameraExecutor.shutdown() } }
function that: add two numbers together ```python def add(a, b): return a + b add(1, 2) ``` function that: package com.example.myapplication import android.Manifest import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.* import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import com.example.myapplication.api.ApiService import com.example.myapplication.databinding.ActivityMainBinding import com.google.ar.core.Session import com.google.ar.sceneform.rendering.ModelRenderable import com.google.ar.sceneform.ux.ArFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import com.stripe.android.paymentsheet.PaymentSheet import com.stripe.android.paymentsheet.PaymentSheetResult import com.stripe.android.paymentsheet.model.PaymentMethodCreateParams class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var arFragment: ArFragment private lateinit var session: Session private val watchModels = mutableListOf<ModelRenderable?>() private val sneakerModels = mutableListOf<ModelRenderable?>() private val glassesModels = mutableListOf<ModelRenderable?>() private lateinit var watchPagerAdapter: ModelPagerAdapter private lateinit var sneakerPagerAdapter: ModelPagerAdapter private lateinit var glassesPagerAdapter: ModelPagerAdapter private lateinit var arModelView: ArModelView private lateinit var apiService: ApiService private lateinit var paymentSheet: PaymentSheet private val TAG = "MainActivity" private val cameraExecutor = Executors.newSingleThreadExecutor() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) initializeComponents() checkPermissionsAndStartCamera() setupAdapters() setupButtonListeners() loadModels() } private fun initializeComponents() { arFragment = supportFragmentManager.findFragmentById(R.id.ar_fragment) as ArFragment setupARSession() setupPaymentSheet() initializeApiService() arModelView = ArModelView(this, fragmentManager = supportFragmentManager) // Initialize new UI components binding.switchModelButton = findViewById(R.id.switch_model_button) binding.captureSceneButton = findViewById(R.id.capture_scene_button) binding.arInstructionsOverlay = findViewById(R.id.arInstructionsOverlay) binding.loadingIndicator = findViewById(R.id.loadingIndicator) binding.errorMessage = findViewById(R.id.errorMessage) } private fun setupPaymentSheet() { // Initialize Stripe PaymentSheet paymentSheet = PaymentSheet(this, ::onPaymentSheetResult) } private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) { when (paymentSheetResult) { is PaymentSheetResult.Completed -> { showToast("Payment complete") } is PaymentSheetResult.Canceled -> { showToast("Payment canceled") } is PaymentSheetResult.Failed -> { showToast("Payment failed: ${paymentSheetResult.error.localizedMessage}") } } } private fun setupAdapters() { watchPagerAdapter = ModelPagerAdapter(watchModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle watch item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.watchViewPager.adapter = watchPagerAdapter sneakerPagerAdapter = ModelPagerAdapter(sneakerModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle sneaker item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.sneakerViewPager.adapter = sneakerPagerAdapter glassesPagerAdapter = ModelPagerAdapter(glassesModels, object : ModelPagerAdapter.OnItemClickListener { override fun onItemClick(model: ARModel) { // Handle glasses item click } override fun onTryOnClick(model: ARModel) { arModelView.displayModel(model.renderable) } }) binding.glassesViewPager.adapter = glassesPagerAdapter } private fun setupButtonListeners() { binding.tryWatchesButton.setOnClickListener { showModels(binding.watchViewPager) } binding.trySneakersButton.setOnClickListener { showModels(binding.sneakerViewPager) } binding.tryGlassesButton.setOnClickListener { showModels(binding.glassesViewPager) } binding.switchModelButton.setOnClickListener { // Handle model switching logic } binding.captureSceneButton.setOnClickListener { // Handle scene capture logic } } private fun showModels(viewPager: ViewPager2) { binding.watchViewPager.visibility = View.GONE binding.sneakerViewPager.visibility = View.GONE binding.glassesViewPager.visibility = View.GONE viewPager.visibility = View.VISIBLE viewPager.animate().alpha(1f).setDuration(500).start() } private fun checkPermissionsAndStartCamera() { when { ContextCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) == PackageManager.PERMISSION_GRANTED -> { startCamera() } shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> { showPermissionRationaleDialog() } else -> { requestPermissionLauncher.launch(Manifest.permission.CAMERA) } } } private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() cameraProvider.unbindAll() val imageCapture = ImageCapture.Builder().build() try { cameraProvider.bindToLifecycle( this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture ) } catch (exc: Exception) { Log.e(TAG, "Use case binding failed", exc) } }, ContextCompat.getMainExecutor(this)) } private fun loadModels() { // Show loading indicator binding.loadingIndicator.visibility = View.VISIBLE lifecycleScope.launch { val modelFiles = listOf( "watch01", "watch02", "watch03", "watch04", "watch05", "watch06", "watch07", "watch08", "watch09", "watch10", "sneaker01", "sneaker02", "sneaker03", "sneaker04", "sneaker05", "sneaker06", "sneaker07", "sneaker08", "sneaker09", "sneaker10", "glasses01", "glasses02", "glasses03", "glasses04", "glasses05", "glasses06", "glasses07", "glasses08", "glasses09", "glasses10" ) modelFiles.forEach { modelFile -> loadModel(modelFile) } updateAdapters() // Hide loading indicator binding.loadingIndicator.visibility = View.GONE } } private suspend fun loadModel(modelFile: String) { withContext(Dispatchers.IO) { try { val resourceId = resources.getIdentifier(modelFile, "raw", packageName) val uri = Uri.parse("android.resource://$packageName/$resourceId") val renderable = ModelRenderable.builder() .setSource(this@MainActivity, uri) .build() .await() when { modelFile.startsWith("watch") -> watchModels.add(renderable) modelFile.startsWith("sneaker") -> sneakerModels.add(renderable) modelFile.startsWith("glasses") -> glassesModels.add(renderable) } } catch (e: Exception) { Log.e(TAG, "Error loading model: $modelFile", e) withContext(Dispatchers.Main) { binding.errorMessage.visibility = View.VISIBLE } } } } private fun updateAdapters() { runOnUiThread { watchPagerAdapter.notifyDataSetChanged() sneakerPagerAdapter.notifyDataSetChanged() glassesPagerAdapter.notifyDataSetChanged() } } private fun showToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } private fun showPermissionRationaleDialog() { // Show dialog explaining why the camera permission is needed } private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean -> if (isGranted) { startCamera() } else { // Handle permission denied showToast("Camera permission is required for this app.") } } override fun onDestroy() { super.onDestroy() cameraExecutor.shutdown() } } ```Kotlin