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

Commit 125a84f0 authored by Marie Matheson's avatar Marie Matheson
Browse files

Adds LockScreen SafetySource and SafetySource broadcast receivers.

Adds a basic LockScreen SafetySource with placeholder data.
Adds a no-op Biometric SafetySource.
Adds Broadcast Receiver and responds with data.

Test: atest SettingsUnitTests
Bug: 215516488
Bug: 215515448
Change-Id: I753a10f63fc73984c7ff96347b927bb2ca5a0aba
parent a2781721
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -4340,6 +4340,13 @@
                       android:value="true" />
        </activity>

        <receiver android:name=".safetycenter.SafetySourceBroadcastReceiver"
                  android:exported="true">
            <intent-filter>
                <action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
            </intent-filter>
        </receiver>

        <!-- This is the longest AndroidManifest.xml ever. -->
    </application>
</manifest>
+37 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.safetycenter;

import android.content.Context;

/** Combined Biometrics Safety Source for Safety Center. */
public final class BiometricsSafetySource {

    public static final String SAFETY_SOURCE_ID = "BiometricsSafetySource";

    private BiometricsSafetySource() {}

    /** Sends biometric safety data to Safety Center. */
    public static void sendSafetyData(Context context) {
        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
            return;
        }

        // TODO(b/215517420): Send biometric data to Safety Center if there are biometrics available
        // on this device.
    }
}
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.safetycenter;

import android.app.PendingIntent;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.safetycenter.SafetySourceData;
import android.safetycenter.SafetySourceStatus;

import com.android.settings.core.SubSettingLauncher;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settingslib.transition.SettingsTransitionHelper;

/** Lock Screen Safety Source for Safety Center. */
public final class LockScreenSafetySource {

    public static final String SAFETY_SOURCE_ID = "LockScreenSafetySource";

    private LockScreenSafetySource() {}

    /** Sends lock screen safety data to Safety Center. */
    public static void sendSafetyData(Context context) {
        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
            return;
        }

        // TODO(b/215515298): Replace placeholder SafetySourceData with real data.
        // TODO(b/217409995): Replace SECURITY_ALTERNATIVE with Safety Center metrics category.
        Intent clickIntent = new SubSettingLauncher(context)
                .setDestination(ChooseLockGeneric.ChooseLockGenericFragment.class.getName())
                .setSourceMetricsCategory(SettingsEnums.SECURITY_ALTERNATIVE)
                .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
                .toIntent();
        PendingIntent pendingIntent = PendingIntent
                .getActivity(
                        context,
                        0 /* requestCode */,
                        clickIntent,
                        PendingIntent.FLAG_IMMUTABLE);
        SafetySourceData safetySourceData =
                new SafetySourceData.Builder(SAFETY_SOURCE_ID).setStatus(
                        new SafetySourceStatus.Builder(
                                "Lock Screen",
                                "Lock screen settings",
                                SafetySourceStatus.STATUS_LEVEL_OK,
                                pendingIntent).build()
                ).build();

        SafetyCenterManagerWrapper.get().sendSafetyCenterUpdate(context, safetySourceData);
    }
}
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.safetycenter;

import android.content.Context;
import android.safetycenter.SafetyCenterManager;
import android.safetycenter.SafetySourceData;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;

/** A wrapper for the SafetyCenterManager system service. */
public class SafetyCenterManagerWrapper {

    private static final String TAG = "SafetyCenterManagerWrapper";

    @VisibleForTesting
    public static SafetyCenterManagerWrapper sInstance;

    private SafetyCenterManagerWrapper() {}

    /** Returns an instance of {@link SafetyCenterManagerWrapper}. */
    public static SafetyCenterManagerWrapper get() {
        if (sInstance == null) {
            sInstance = new SafetyCenterManagerWrapper();
        }
        return sInstance;
    }

    /** Sends updated safety source data to Safety Center. */
    public void sendSafetyCenterUpdate(Context context, SafetySourceData safetySourceData) {
        SafetyCenterManager safetyCenterManager =
                context.getSystemService(SafetyCenterManager.class);

        if (safetyCenterManager == null) {
            Log.e(TAG, "System service SAFETY_CENTER_SERVICE (SafetyCenterManager) is null");
            return;
        }

        try {
            safetyCenterManager.sendSafetyCenterUpdate(safetySourceData);
        } catch (Exception e) {
            Log.e(TAG, "Failed to send SafetySourceData", e);
            return;
        }
    }
}
+47 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.safetycenter;

import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.google.common.collect.ImmutableList;

/** Broadcast receiver for handling requests from Safety Center for fresh data. */
public class SafetySourceBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (!SafetyCenterStatusHolder.get().isEnabled(context)) {
            return;
        }

        ImmutableList<String> sourceIds =
                ImmutableList.copyOf(intent.getStringArrayExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS));

        if (sourceIds.contains(LockScreenSafetySource.SAFETY_SOURCE_ID)) {
            LockScreenSafetySource.sendSafetyData(context);
        }

        if (sourceIds.contains(BiometricsSafetySource.SAFETY_SOURCE_ID)) {
            BiometricsSafetySource.sendSafetyData(context);
        }
    }
}
Loading