Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a56189e authored by Emilian Peev's avatar Emilian Peev
Browse files

Add camera extension fallback toggle

Android camera extensions
(https://source.android.com/docs/core/camera/camerax-vendor-extensions)
will be able to use SW fallback implementations
on devices that do not ship the corresponding
the device specific functionality.
Since the SW fallback will be using a new data
path, it was suggested that users must be able to
control and enable/disable the SW fallback
via the Settings app.

Bug: 297083874
Test: atest packages/apps/Settings/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java

Change-Id: I1b97777babe1c9f4ea4f2f6ee3d8251fea11146e
parent d8a82105
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -12000,6 +12000,11 @@
    <!-- Keywords for the media controls setting [CHAR LIMIT=NONE]-->
    <string name="keywords_media_controls">media</string>
    <!-- Title of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
    <string name="camera_extensions_fallback_title">Allow camera software extensions</string>
    <!-- Description of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
    <string name="camera_extensions_fallback_description">Enables the default software implementation of advanced camera features, such as Eyes Free videography.</string>
    <!-- Summary for see all preference when bluetooth is disable [CHAR LIMIT=none]-->
    <string name="connected_device_see_all_summary">Bluetooth will turn on</string>
+8 −0
Original line number Diff line number Diff line
@@ -93,6 +93,14 @@
            settings:controller=
                "com.android.settings.sound.MediaControlsLockScreenPreferenceController" />

        <!-- Allow software fallback for camera extensions -->
        <SwitchPreference
            android:key="privacy_camera_extensions_fallback"
            android:title="@string/camera_extensions_fallback_title"
            android:summary="@string/camera_extensions_fallback_description"
            settings:controller=
                "com.android.settings.privacy.CameraExtensionsFallbackPreferenceController" />

        <!-- Content Capture -->
        <!-- NOTE: content capture has a different preference, depending whether or not the
             ContentCaptureService implementations defines a custom settings activitiy on its manifest.
+64 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.privacy;

import static android.provider.Settings.Secure.CAMERA_EXTENSIONS_FALLBACK;

import android.content.Context;
import android.provider.Settings;

import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;

/**
 * Toggle for camera extensions software fallback
 */
public class CameraExtensionsFallbackPreferenceController extends TogglePreferenceController {
    public CameraExtensionsFallbackPreferenceController(Context context, String key) {
        super(context, key);
    }

    @Override
    public boolean isChecked() {
        int val = Settings.Secure.getInt(mContext.getContentResolver(),
                CAMERA_EXTENSIONS_FALLBACK, 1);
        return val == 1;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        int val = isChecked ? 1 : 0;
        return Settings.Secure.putInt(mContext.getContentResolver(),
                CAMERA_EXTENSIONS_FALLBACK, val);
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public boolean isSliceable() {
        return false;
    }

    @Override
    public int getSliceHighlightMenuRes() {
        // not needed since it's not sliceable
        return NO_RES;
    }
}
+91 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.privacy;

import static com.android.settings.core.BasePreferenceController.AVAILABLE;

import static com.google.common.truth.Truth.assertThat;

import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.android.settings.privacy.CameraExtensionsFallbackPreferenceController;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class CameraExtensionsFallbackPreferenceControllerTest {

    private static final String KEY = "camera_extensions_fallback";
    private final Context mContext = ApplicationProvider.getApplicationContext();

    private int mOriginalPreference;
    private ContentResolver mContentResolver;
    private CameraExtensionsFallbackPreferenceController mController;

    @Before
    public void setUp() {
        mContentResolver = mContext.getContentResolver();
        mOriginalPreference = Settings.Secure.getInt(mContentResolver,
                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);
        mController = new CameraExtensionsFallbackPreferenceController(mContext, KEY);
    }

    @After
    public void tearDown() {
        Settings.Secure.putInt(mContentResolver, Settings.Secure.CAMERA_EXTENSIONS_FALLBACK,
                mOriginalPreference);
    }

    @Test
    public void getAvailability_returnAvailable() {
        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
    }

    @Test
    public void setChecked_disable_shouldTurnOff() {
        Settings.Secure.putInt(mContentResolver,
                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);

        assertThat(mController.isChecked()).isTrue();

        mController.setChecked(false);

        assertThat(Settings.Secure.getInt(mContentResolver,
                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(0);
    }

    @Test
    public void setChecked_enable_shouldTurnOn() {
        Settings.Secure.putInt(mContentResolver,
                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 0);

        assertThat(mController.isChecked()).isFalse();

        mController.setChecked(true);

        assertThat(Settings.Secure.getInt(mContentResolver,
                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(1);
    }
}