1 /*
2  * Copyright 2019 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.antelope
18 
19 import androidx.camera.integration.antelope.MainActivity.Companion.cameraParams
20 import androidx.camera.integration.antelope.MainActivity.Companion.logd
21 import androidx.camera.integration.antelope.cameracontrollers.camera1OpenCamera
22 import androidx.camera.integration.antelope.cameracontrollers.camera2OpenCamera
23 import androidx.camera.integration.antelope.cameracontrollers.cameraXOpenCamera
24 import androidx.camera.integration.antelope.cameracontrollers.cameraXTakePicture
25 import androidx.camera.integration.antelope.cameracontrollers.closePreviewAndCamera
26 import androidx.camera.integration.antelope.cameracontrollers.initializeStillCapture
27 
28 // Keeps track of what iteration of a repeated test is occurring
29 internal var multiCounter: Int = 0
30 
initializeTestnull31 internal fun initializeTest(activity: MainActivity, params: CameraParams?, config: TestConfig) {
32 
33     if (null == params) return
34 
35     // Camera1 cannot directly access physical cameras. If we try, abort.
36     if (
37         (CameraAPI.CAMERA1 == config.api) &&
38             !(PrefHelper.getLogicalCameraIds(cameraParams).contains(config.camera))
39     ) {
40         activity.resetUIAfterTest()
41         activity.updateLog(
42             "ABORTED: Camera1 API cannot access camera with id:" + config.camera,
43             false,
44             false
45         )
46         return
47     }
48 
49     when (config.currentRunningTest) {
50         TestType.INIT -> runInitTest(activity, params, config)
51         TestType.PREVIEW -> runPreviewTest(activity, params, config)
52         TestType.SWITCH_CAMERA -> runSwitchTest(activity, params, config)
53         TestType.MULTI_SWITCH -> runMultiSwitchTest(activity, params, config)
54         TestType.PHOTO -> runPhotoTest(activity, params, config)
55         TestType.MULTI_PHOTO -> runMultiPhotoTest(activity, params, config)
56         TestType.MULTI_PHOTO_CHAIN -> runMultiPhotoChainTest(activity, params, config)
57         TestType.NONE -> Unit
58     }
59 }
60 
61 /** Run the INIT test */
runInitTestnull62 internal fun runInitTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
63 
64     logd("Running init test")
65     activity.startBackgroundThread(params)
66     activity.showProgressBar(true)
67 
68     setupImageReader(activity, params, config)
69     params.timer = CameraTimer()
70     config.currentRunningTest = TestType.INIT
71     params.timer.testStart = System.currentTimeMillis()
72     beginTest(activity, params, config)
73 }
74 
75 /** Run the SWITCH test */
runSwitchTestnull76 internal fun runSwitchTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
77     // For switch test, always go from default back camera to default front camera and back 0->1->0
78     // TODO: Can we handle different permutations of physical cameras?
79     if (
80         !PrefHelper.getLogicalCameraIds(cameraParams).contains("0") ||
81             !PrefHelper.getLogicalCameraIds(cameraParams).contains("1")
82     ) {
83         activity.resetUIAfterTest()
84         activity.updateLog("ABORTED: Camera 0 and 1 needed for Switch test.", false, false)
85         return
86     }
87 
88     config.switchTestCameras = arrayOf("0", "1")
89     config.switchTestCurrentCamera = "0"
90 
91     logd("Running switch test")
92     logd("Starting with camera: " + config.switchTestCurrentCamera)
93     activity.startBackgroundThread(params)
94     activity.showProgressBar(true)
95 
96     setupImageReader(activity, params, config)
97     params.timer = CameraTimer()
98     config.currentRunningTest = TestType.SWITCH_CAMERA
99     params.timer.testStart = System.currentTimeMillis()
100     beginTest(activity, params, config)
101 }
102 
103 /** Run the MULTI_SWITCH test */
runMultiSwitchTestnull104 internal fun runMultiSwitchTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
105     // For switch test, always go from default back camera to default front camera and back 0->1->0
106     // TODO: Can we handle different permutations of physical cameras?
107     if (
108         !PrefHelper.getLogicalCameraIds(cameraParams).contains("0") ||
109             !PrefHelper.getLogicalCameraIds(cameraParams).contains("1")
110     ) {
111         activity.resetUIAfterTest()
112         activity.updateLog("ABORTED: Camera 0 and 1 needed for Switch test.", false, false)
113         return
114     }
115 
116     config.switchTestCameras = arrayOf("0", "1")
117 
118     if (0 == multiCounter) {
119         // New test
120         logd("Running multi switch test")
121         config.switchTestCurrentCamera = "0"
122         activity.startBackgroundThread(params)
123         activity.showProgressBar(true, 0)
124         multiCounter = PrefHelper.getNumTests(activity)
125         config.currentRunningTest = TestType.MULTI_SWITCH
126         config.testFinished = false
127     } else {
128         // Add previous result
129         params.timer.testEnd = System.currentTimeMillis()
130         activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
131         logd("In Multi Switch Test. Counter: " + multiCounter)
132 
133         config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
134         config.testResults.previewStart.add(params.timer.previewEnd - params.timer.previewStart)
135         config.testResults.switchToSecond.add(
136             params.timer.switchToSecondEnd - params.timer.switchToSecondStart
137         )
138         config.testResults.switchToFirst.add(
139             params.timer.switchToFirstEnd - params.timer.switchToFirstStart
140         )
141         config.testResults.previewClose.add(
142             params.timer.previewCloseEnd - params.timer.previewCloseStart
143         )
144         config.testResults.cameraClose.add(
145             params.timer.cameraCloseEnd - params.timer.cameraCloseStart
146         )
147         config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
148 
149         config.testFinished = false
150         config.isFirstOnActive = true
151     }
152 
153     setupImageReader(activity, params, config)
154     params.timer = CameraTimer()
155     params.timer.testStart = System.currentTimeMillis()
156     beginTest(activity, params, config)
157 }
158 
159 /** Run the PREVIEW test */
runPreviewTestnull160 internal fun runPreviewTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
161     logd("Running preview test")
162     activity.startBackgroundThread(params)
163     activity.showProgressBar(true)
164 
165     setupImageReader(activity, params, config)
166     params.timer = CameraTimer()
167     config.currentRunningTest = TestType.PREVIEW
168     params.timer.testStart = System.currentTimeMillis()
169     beginTest(activity, params, config)
170 }
171 
172 /** Run the PHOTO (single capture) test */
runPhotoTestnull173 internal fun runPhotoTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
174     logd("Running photo test")
175     activity.startBackgroundThread(params)
176     activity.showProgressBar(true)
177 
178     setupImageReader(activity, params, config)
179     params.timer = CameraTimer()
180     config.currentRunningTest = TestType.PHOTO
181     params.timer.testStart = System.currentTimeMillis()
182 
183     logd("About to start photo test. " + config.currentRunningTest.toString())
184     beginTest(activity, params, config)
185 }
186 
187 /** Run the MULTI_PHOTO (repeated capture) test */
runMultiPhotoTestnull188 internal fun runMultiPhotoTest(activity: MainActivity, params: CameraParams, config: TestConfig) {
189     if (0 == multiCounter) {
190         // New test
191         logd("Running multi photo test")
192         activity.startBackgroundThread(params)
193         activity.showProgressBar(true, 0)
194         multiCounter = PrefHelper.getNumTests(activity)
195         config.currentRunningTest = TestType.MULTI_PHOTO
196         logd(
197             "About to start multi photo test. multi_counter: " +
198                 multiCounter +
199                 " and test: " +
200                 config.currentRunningTest.toString()
201         )
202     } else {
203         // Add previous result
204         params.timer.testEnd = System.currentTimeMillis()
205         activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
206         logd("In Multi Photo Test. Counter: " + multiCounter)
207 
208         config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
209         config.testResults.previewStart.add(params.timer.previewEnd - params.timer.previewStart)
210         config.testResults.previewFill.add(
211             params.timer.previewFillEnd - params.timer.previewFillStart
212         )
213         config.testResults.autofocus.add(params.timer.autofocusEnd - params.timer.autofocusStart)
214         config.testResults.captureNoAF.add(
215             (params.timer.captureEnd - params.timer.captureStart) -
216                 (params.timer.autofocusEnd - params.timer.autofocusStart)
217         )
218         config.testResults.capture.add(params.timer.captureEnd - params.timer.captureStart)
219         config.testResults.imageready.add(
220             params.timer.imageReaderEnd - params.timer.imageReaderStart
221         )
222         config.testResults.capturePlusImageReady.add(
223             (params.timer.captureEnd - params.timer.captureStart) +
224                 (params.timer.imageReaderEnd - params.timer.imageReaderStart)
225         )
226         config.testResults.imagesave.add(params.timer.imageSaveEnd - params.timer.imageSaveStart)
227         config.testResults.isHDRPlus.add(params.timer.isHDRPlus)
228         config.testResults.previewClose.add(
229             params.timer.previewCloseEnd - params.timer.previewCloseStart
230         )
231         config.testResults.cameraClose.add(
232             params.timer.cameraCloseEnd - params.timer.cameraCloseStart
233         )
234         config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
235         config.testResults.totalNoPreview.add(
236             (params.timer.testEnd - params.timer.testStart) -
237                 (params.timer.previewFillEnd - params.timer.previewFillStart)
238         )
239         config.testFinished = false
240         config.isFirstOnActive = true
241         config.isFirstOnCaptureComplete = true
242     }
243 
244     setupImageReader(activity, params, config)
245     params.timer = CameraTimer()
246     params.timer.testStart = System.currentTimeMillis()
247     beginTest(activity, params, config)
248 }
249 
250 /** Run the MULTI_PHOTO_CHAIN (multiple captures, do not close camera) test */
runMultiPhotoChainTestnull251 internal fun runMultiPhotoChainTest(
252     activity: MainActivity,
253     params: CameraParams,
254     config: TestConfig
255 ) {
256 
257     // Cannot chain with Camera 1, run default test
258     if (CameraAPI.CAMERA1 == config.api) {
259         logd("Cannot run Chain test with Camera 1, running regular multi-test instead")
260         config.currentRunningTest = TestType.MULTI_PHOTO
261         runMultiPhotoTest(activity, params, config)
262         return
263     }
264 
265     if (0 == multiCounter) {
266         // New test
267         logd("Running multi photo (chain) test")
268         activity.startBackgroundThread(params)
269         activity.showProgressBar(true, 0)
270         multiCounter = PrefHelper.getNumTests(activity)
271         params.timer = CameraTimer()
272         params.timer.testStart = System.currentTimeMillis()
273         config.currentRunningTest = TestType.MULTI_PHOTO_CHAIN
274         logd(
275             "About to start multi chain test. multi_counter: " +
276                 multiCounter +
277                 " and test: " +
278                 config.currentRunningTest.toString()
279         )
280 
281         setupImageReader(activity, params, config)
282         beginTest(activity, params, config)
283     } else {
284         // Add previous result
285         activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
286 
287         if (config.api == CameraAPI.CAMERA1) {
288             beginTest(activity, params, config)
289         } else {
290 
291             // Camera2 and CameraX
292             config.testResults.autofocus.add(
293                 params.timer.autofocusEnd - params.timer.autofocusStart
294             )
295             config.testResults.captureNoAF.add(
296                 (params.timer.captureEnd - params.timer.captureStart) -
297                     (params.timer.autofocusEnd - params.timer.autofocusStart)
298             )
299             config.testResults.capture.add(params.timer.captureEnd - params.timer.captureStart)
300             config.testResults.imageready.add(
301                 params.timer.imageReaderEnd - params.timer.imageReaderStart
302             )
303             config.testResults.capturePlusImageReady.add(
304                 (params.timer.captureEnd - params.timer.captureStart) +
305                     (params.timer.imageReaderEnd - params.timer.imageReaderStart)
306             )
307             config.testResults.imagesave.add(
308                 params.timer.imageSaveEnd - params.timer.imageSaveStart
309             )
310             config.testResults.isHDRPlus.add(params.timer.isHDRPlus)
311             config.testFinished = false
312 
313             params.timer.clearImageTimers()
314             config.isFirstOnCaptureComplete = true
315 
316             when (config.api) {
317                 CameraAPI.CAMERA2 -> initializeStillCapture(activity, params, config)
318                 CameraAPI.CAMERAX -> cameraXTakePicture(activity, params, config)
319                 else -> {}
320             }
321         }
322     }
323 }
324 
325 /**
326  * A test has ended. Depending on which test and if we are at the beginning, middle or end of a
327  * repeated test, record the results and repeat/return,
328  */
testEndednull329 internal fun testEnded(activity: MainActivity, params: CameraParams?, config: TestConfig) {
330     if (null == params) return
331     logd(
332         "In testEnded. multi_counter: " +
333             multiCounter +
334             " and test: " +
335             config.currentRunningTest.toString()
336     )
337 
338     when (config.currentRunningTest) {
339         TestType.INIT -> {
340             params.timer.testEnd = System.currentTimeMillis()
341             logd("Test ended")
342             config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
343             config.testResults.cameraClose.add(
344                 params.timer.cameraCloseEnd - params.timer.cameraCloseStart
345             )
346             config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
347         }
348         TestType.PREVIEW -> {
349             params.timer.testEnd = System.currentTimeMillis()
350             logd("Test ended")
351             config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
352             config.testResults.previewStart.add(params.timer.previewEnd - params.timer.previewStart)
353             config.testResults.previewClose.add(
354                 params.timer.previewCloseEnd - params.timer.previewCloseStart
355             )
356             config.testResults.cameraClose.add(
357                 params.timer.cameraCloseEnd - params.timer.cameraCloseStart
358             )
359             config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
360         }
361         TestType.SWITCH_CAMERA -> {
362             params.timer.testEnd = System.currentTimeMillis()
363             logd("Test ended")
364             config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
365             config.testResults.previewStart.add(params.timer.previewEnd - params.timer.previewStart)
366             config.testResults.switchToSecond.add(
367                 params.timer.switchToSecondEnd - params.timer.switchToSecondStart
368             )
369             config.testResults.switchToFirst.add(
370                 params.timer.switchToFirstEnd - params.timer.switchToFirstStart
371             )
372             config.testResults.previewClose.add(
373                 params.timer.previewCloseEnd - params.timer.previewCloseStart
374             )
375             config.testResults.cameraClose.add(
376                 params.timer.cameraCloseEnd - params.timer.cameraCloseStart
377             )
378             config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
379         }
380         TestType.MULTI_SWITCH -> {
381             if (1 == multiCounter) {
382                 params.timer.testEnd = System.currentTimeMillis()
383                 config.testFinished = false // Reset flag
384 
385                 logd("Test ended")
386                 activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
387 
388                 config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
389                 config.testResults.previewStart.add(
390                     params.timer.previewEnd - params.timer.previewStart
391                 )
392                 config.testResults.switchToSecond.add(
393                     params.timer.switchToSecondEnd - params.timer.switchToSecondStart
394                 )
395                 config.testResults.switchToFirst.add(
396                     params.timer.switchToFirstEnd - params.timer.switchToFirstStart
397                 )
398                 config.testResults.previewClose.add(
399                     params.timer.previewCloseEnd - params.timer.previewCloseStart
400                 )
401                 config.testResults.cameraClose.add(
402                     params.timer.cameraCloseEnd - params.timer.cameraCloseStart
403                 )
404                 config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
405 
406                 multiCounter = 0
407             } else {
408                 logd(
409                     "Switch " +
410                         (Math.abs(multiCounter - PrefHelper.getNumTests(activity)) + 1) +
411                         " completed."
412                 )
413                 multiCounter--
414                 runMultiSwitchTest(activity, params, config)
415                 return
416             }
417         }
418         TestType.PHOTO -> {
419             params.timer.testEnd = System.currentTimeMillis()
420             logd("Test ended")
421             config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
422             config.testResults.previewStart.add(params.timer.previewEnd - params.timer.previewStart)
423             config.testResults.previewFill.add(
424                 params.timer.previewFillEnd - params.timer.previewFillStart
425             )
426             config.testResults.autofocus.add(
427                 params.timer.autofocusEnd - params.timer.autofocusStart
428             )
429             config.testResults.captureNoAF.add(
430                 (params.timer.captureEnd - params.timer.captureStart) -
431                     (params.timer.autofocusEnd - params.timer.autofocusStart)
432             )
433             config.testResults.capture.add(params.timer.captureEnd - params.timer.captureStart)
434             config.testResults.imageready.add(
435                 params.timer.imageReaderEnd - params.timer.imageReaderStart
436             )
437             config.testResults.capturePlusImageReady.add(
438                 (params.timer.captureEnd - params.timer.captureStart) +
439                     (params.timer.imageReaderEnd - params.timer.imageReaderStart)
440             )
441             config.testResults.imagesave.add(
442                 params.timer.imageSaveEnd - params.timer.imageSaveStart
443             )
444             config.testResults.isHDRPlus.add(params.timer.isHDRPlus)
445             config.testResults.previewClose.add(
446                 params.timer.previewCloseEnd - params.timer.previewCloseStart
447             )
448             config.testResults.cameraClose.add(
449                 params.timer.cameraCloseEnd - params.timer.cameraCloseStart
450             )
451             config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
452             config.testResults.totalNoPreview.add(
453                 (params.timer.testEnd - params.timer.testStart) -
454                     (params.timer.previewFillEnd - params.timer.previewFillStart)
455             )
456         }
457         TestType.MULTI_PHOTO -> {
458             val lastResult = params.timer.captureEnd - params.timer.captureStart
459 
460             if (1 == multiCounter) {
461                 params.timer.testEnd = System.currentTimeMillis()
462                 config.testFinished = false // Reset flag
463 
464                 logd("Test ended")
465                 activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
466 
467                 config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
468                 config.testResults.previewStart.add(
469                     params.timer.previewEnd - params.timer.previewStart
470                 )
471                 config.testResults.previewFill.add(
472                     params.timer.previewFillEnd - params.timer.previewFillStart
473                 )
474                 config.testResults.autofocus.add(
475                     params.timer.autofocusEnd - params.timer.autofocusStart
476                 )
477                 config.testResults.captureNoAF.add(
478                     (params.timer.captureEnd - params.timer.captureStart) -
479                         (params.timer.autofocusEnd - params.timer.autofocusStart)
480                 )
481                 config.testResults.capture.add(params.timer.captureEnd - params.timer.captureStart)
482                 config.testResults.imageready.add(
483                     params.timer.imageReaderEnd - params.timer.imageReaderStart
484                 )
485                 config.testResults.capturePlusImageReady.add(
486                     (params.timer.captureEnd - params.timer.captureStart) +
487                         (params.timer.imageReaderEnd - params.timer.imageReaderStart)
488                 )
489                 config.testResults.imagesave.add(
490                     params.timer.imageSaveEnd - params.timer.imageSaveStart
491                 )
492                 config.testResults.isHDRPlus.add(params.timer.isHDRPlus)
493                 config.testResults.previewClose.add(
494                     params.timer.previewCloseEnd - params.timer.previewCloseStart
495                 )
496                 config.testResults.cameraClose.add(
497                     params.timer.cameraCloseEnd - params.timer.cameraCloseStart
498                 )
499                 config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
500                 config.testResults.totalNoPreview.add(
501                     (params.timer.testEnd - params.timer.testStart) -
502                         (params.timer.previewFillEnd - params.timer.previewFillStart)
503                 )
504 
505                 multiCounter = 0
506             } else {
507                 logd(
508                     "Capture " +
509                         (Math.abs(multiCounter - PrefHelper.getNumTests(activity)) + 1) +
510                         " completed: " +
511                         lastResult +
512                         "ms"
513                 )
514                 multiCounter--
515                 runMultiPhotoTest(activity, params, config)
516                 return
517             }
518         }
519         TestType.MULTI_PHOTO_CHAIN -> {
520             val lastResult = params.timer.captureEnd - params.timer.captureStart
521 
522             if (1 == multiCounter) {
523 
524                 // If this is a chain test, the camera may still be open
525                 if (params.isOpen) {
526                     config.testFinished = true
527                     closePreviewAndCamera(activity, params, config)
528                     return
529                 }
530 
531                 params.timer.testEnd = System.currentTimeMillis()
532                 logd("Test ended")
533                 config.testFinished = false // Reset flag
534 
535                 activity.showProgressBar(true, precentageCompleted(activity, multiCounter))
536 
537                 config.testResults.initialization.add(params.timer.openEnd - params.timer.openStart)
538                 config.testResults.previewStart.add(
539                     params.timer.previewEnd - params.timer.previewStart
540                 )
541                 config.testResults.previewFill.add(
542                     params.timer.previewFillEnd - params.timer.previewFillStart
543                 )
544                 config.testResults.autofocus.add(
545                     params.timer.autofocusEnd - params.timer.autofocusStart
546                 )
547                 config.testResults.captureNoAF.add(
548                     (params.timer.captureEnd - params.timer.captureStart) -
549                         (params.timer.autofocusEnd - params.timer.autofocusStart)
550                 )
551                 config.testResults.capture.add(params.timer.captureEnd - params.timer.captureStart)
552                 config.testResults.imageready.add(
553                     params.timer.imageReaderEnd - params.timer.imageReaderStart
554                 )
555                 config.testResults.capturePlusImageReady.add(
556                     (params.timer.captureEnd - params.timer.captureStart) +
557                         (params.timer.imageReaderEnd - params.timer.imageReaderStart)
558                 )
559                 config.testResults.imagesave.add(
560                     params.timer.imageSaveEnd - params.timer.imageSaveStart
561                 )
562                 config.testResults.isHDRPlus.add(params.timer.isHDRPlus)
563                 config.testResults.previewClose.add(
564                     params.timer.previewCloseEnd - params.timer.previewCloseStart
565                 )
566                 config.testResults.cameraClose.add(
567                     params.timer.cameraCloseEnd - params.timer.cameraCloseStart
568                 )
569                 config.testResults.total.add(params.timer.testEnd - params.timer.testStart)
570                 config.testResults.totalNoPreview.add(
571                     (params.timer.testEnd - params.timer.testStart) -
572                         (params.timer.previewFillEnd - params.timer.previewFillStart)
573                 )
574 
575                 multiCounter = 0
576             } else {
577                 logd(
578                     "Capture " +
579                         (Math.abs(multiCounter - PrefHelper.getNumTests(activity)) + 1) +
580                         " completed: " +
581                         lastResult +
582                         "ms"
583                 )
584                 multiCounter--
585                 runMultiPhotoChainTest(activity, params, config)
586                 return
587             }
588         }
589         TestType.NONE -> {}
590     }
591 
592     multiCounter = 0
593     postTestResults(activity, config)
594 }
595 
596 /** Calculate the percentage of repeated tests that are complete */
precentageCompletednull597 fun precentageCompleted(activity: MainActivity, testCounter: Int): Int {
598     return (100 * (PrefHelper.getNumTests(activity) - testCounter)) /
599         PrefHelper.getNumTests(activity)
600 }
601 
602 /** Test is configured, begin it based on the API in the test config */
beginTestnull603 internal fun beginTest(activity: MainActivity, params: CameraParams?, testConfig: TestConfig) {
604     if (null == params) return
605 
606     when (testConfig.api) {
607         CameraAPI.CAMERA1 -> {
608             // Camera 1 doesn't have its own threading built-in
609             val runnable = Runnable { camera1OpenCamera(activity, params, testConfig) }
610             params.backgroundHandler?.post(runnable)
611         }
612         CameraAPI.CAMERA2 -> {
613             camera2OpenCamera(activity, params, testConfig)
614         }
615         CameraAPI.CAMERAX -> {
616             cameraXOpenCamera(activity, params, testConfig)
617         }
618     }
619 }
620