1 /*
<lambda>null2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.camera.integration.extensions.validation
18 
19 import android.content.Context
20 import android.content.Intent
21 import android.os.Bundle
22 import android.view.LayoutInflater
23 import android.widget.AdapterView
24 import android.widget.BaseAdapter
25 import android.widget.ListView
26 import android.widget.Toast
27 import androidx.appcompat.app.AppCompatActivity
28 import androidx.camera.integration.extensions.ExtensionTestType.TEST_TYPE_CAMERAX_EXTENSION
29 import androidx.camera.integration.extensions.INVALID_LENS_FACING
30 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
31 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
32 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_LENS_FACING
33 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_REQUEST_CODE
34 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_TEST_TYPE
35 import androidx.camera.integration.extensions.R
36 import androidx.camera.integration.extensions.TestResultType.TEST_RESULT_NOT_SUPPORTED
37 import androidx.camera.integration.extensions.validation.CameraValidationResultActivity.Companion.getLensFacingStringFromInt
38 import androidx.core.app.ActivityCompat
39 
40 /**
41  * Activity to list all supported extension modes of the specified camera device.
42  *
43  * Clicking a list item will launch the ImageValidationActivity to trigger the image taking and
44  * validation flow.
45  */
46 class ExtensionValidationResultActivity : AppCompatActivity() {
47     private lateinit var extensionTestResultMap: LinkedHashMap<Int, Pair<Int, String>>
48     private lateinit var testResults: TestResults
49     private val result = Intent()
50     private var lensFacing = INVALID_LENS_FACING
51     private lateinit var testType: String
52     private lateinit var cameraId: String
53     private lateinit var adapter: BaseAdapter
54     private val imageValidationActivityRequestCode =
55         ImageValidationActivity::class.java.hashCode() % 1000
56 
57     override fun onCreate(savedInstanceState: Bundle?) {
58         super.onCreate(savedInstanceState)
59         setContentView(R.layout.full_listview)
60 
61         testResults = TestResults.getInstance(this)
62 
63         testType = intent.getStringExtra(INTENT_EXTRA_KEY_TEST_TYPE)!!
64         cameraId = intent.getStringExtra(INTENT_EXTRA_KEY_CAMERA_ID)!!
65         lensFacing = intent.getIntExtra(INTENT_EXTRA_KEY_LENS_FACING, INVALID_LENS_FACING)
66 
67         extensionTestResultMap =
68             testResults.getCameraExtensionResultMap()[Pair(testType, cameraId)]!!
69 
70         result.putExtra(INTENT_EXTRA_KEY_TEST_TYPE, testType)
71         result.putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
72         val requestCode = intent.getIntExtra(INTENT_EXTRA_KEY_REQUEST_CODE, -1)
73         setResult(requestCode, result)
74 
75         supportActionBar?.title =
76             if (testType == TEST_TYPE_CAMERAX_EXTENSION) {
77                 resources.getString(R.string.camerax_extensions_validator)
78             } else {
79                 resources.getString(R.string.camera2_extensions_validator)
80             }
81         supportActionBar!!.subtitle = "Camera $cameraId [${getLensFacingStringFromInt(lensFacing)}]"
82 
83         val layoutInflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
84         adapter = ExtensionValidationResultAdapter(testType, layoutInflater, extensionTestResultMap)
85 
86         val listView = findViewById<ListView>(R.id.listView)
87         listView.adapter = adapter
88 
89         listView.onItemClickListener =
90             AdapterView.OnItemClickListener { _, _, position, _ ->
91                 if (
92                     extensionTestResultMap.values.elementAt(position).first ==
93                         TEST_RESULT_NOT_SUPPORTED
94                 ) {
95                     Toast.makeText(this, "Not supported!", Toast.LENGTH_SHORT).show()
96                     return@OnItemClickListener
97                 }
98 
99                 startCaptureValidationActivity(
100                     testType,
101                     cameraId,
102                     extensionTestResultMap.keys.elementAt(position)
103                 )
104             }
105     }
106 
107     @Suppress("DEPRECATION")
108     @Deprecated("Deprecated in ComponentActivity")
109     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
110         super.onActivityResult(requestCode, resultCode, data)
111 
112         if (requestCode != imageValidationActivityRequestCode) {
113             return
114         }
115 
116         adapter.notifyDataSetChanged()
117     }
118 
119     private fun startCaptureValidationActivity(testType: String, cameraId: String, mode: Int) {
120         val intent = Intent(this, ImageValidationActivity::class.java)
121         intent.putExtra(INTENT_EXTRA_KEY_TEST_TYPE, testType)
122         intent.putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
123         intent.putExtra(INTENT_EXTRA_KEY_LENS_FACING, lensFacing)
124         intent.putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, mode)
125         intent.putExtra(INTENT_EXTRA_KEY_REQUEST_CODE, imageValidationActivityRequestCode)
126 
127         ActivityCompat.startActivityForResult(
128             this,
129             intent,
130             imageValidationActivityRequestCode,
131             null
132         )
133     }
134 }
135