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(); + } }