From 8235ed14a4287171b37dcdb81de0f29882965389 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Mon, 17 Jun 2019 11:00:47 +0800 Subject: [PATCH] Make the default value of flashlight availibility to true. We read from SettingsProvider to decide whether flashlight slice is available. However, when switching to the second user, FLASHLIGHT_AVAILABLE will be null. The default was 0 which causes the slice returning null, so we have to set it to 1 when there is a physical flash unit to be consistent with system ui. Fixes: 134734608 Test: robotest Change-Id: I981461b1b66e6e273e13a9cbcba96e3ccf0aec68 --- .../settings/flashlight/FlashlightSlice.java | 18 ++++++++++--- .../flashlight/FlashlightSliceTest.java | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/flashlight/FlashlightSlice.java b/src/com/android/settings/flashlight/FlashlightSlice.java index a2c4561c1d5..bd7f4863b69 100644 --- a/src/com/android/settings/flashlight/FlashlightSlice.java +++ b/src/com/android/settings/flashlight/FlashlightSlice.java @@ -39,6 +39,7 @@ import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder.RowBuilder; import androidx.slice.builders.SliceAction; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.slices.CustomSliceRegistry; @@ -131,10 +132,19 @@ public class FlashlightSlice implements CustomSliceable { return null; } - - private static boolean isFlashlightAvailable(Context context) { - return Settings.Secure.getInt( - context.getContentResolver(), Secure.FLASHLIGHT_AVAILABLE, 0) == 1; + @VisibleForTesting + static boolean isFlashlightAvailable(Context context) { + int defaultAvailability = 0; + try { + // check if there is a flash unit + if (getCameraId(context) != null) { + defaultAvailability = 1; + } + } catch (CameraAccessException e) { + Log.e(TAG, "Error getting camera id.", e); + } + return Secure.getInt(context.getContentResolver(), + Secure.FLASHLIGHT_AVAILABLE, defaultAvailability) == 1; } private static boolean isFlashlightEnabled(Context context) { diff --git a/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceTest.java b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceTest.java index 224d2ee79ab..02f1a23a790 100644 --- a/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceTest.java +++ b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceTest.java @@ -20,6 +20,8 @@ package com.android.settings.flashlight; import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; import android.provider.Settings; import androidx.slice.Slice; @@ -35,6 +37,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowCameraCharacteristics; +import org.robolectric.shadows.ShadowCameraManager; import java.util.List; @@ -42,10 +49,12 @@ import java.util.List; public class FlashlightSliceTest { private Context mContext; + private ShadowCameraManager mShadowCameraManager; @Before public void setUp() { mContext = RuntimeEnvironment.application; + mShadowCameraManager = Shadows.shadowOf(mContext.getSystemService(CameraManager.class)); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); @@ -64,4 +73,22 @@ public class FlashlightSliceTest { final List toggles = metadata.getToggles(); assertThat(toggles).hasSize(1); } + + @Test + public void isFlashlightAvailable_nullSecureAttr_noFlashUnit_returnFalse() { + assertThat(FlashlightSlice.isFlashlightAvailable(mContext)).isFalse(); + } + + @Test + public void isFlashlightAvailable_nullSecureAttr_hasFlashUnit_returnTrue() { + final CameraCharacteristics characteristics = + ShadowCameraCharacteristics.newCameraCharacteristics(); + final ShadowCameraCharacteristics shadowCharacteristics = Shadow.extract(characteristics); + shadowCharacteristics.set(CameraCharacteristics.FLASH_INFO_AVAILABLE, true); + shadowCharacteristics + .set(CameraCharacteristics.LENS_FACING, CameraCharacteristics.LENS_FACING_BACK); + mShadowCameraManager.addCamera("camera_id", characteristics); + + assertThat(FlashlightSlice.isFlashlightAvailable(mContext)).isTrue(); + } }