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

Commit e0f8b565 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add "Reboot with MTE" option for supported devices."

parents 7c731707 966aef4e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -13077,6 +13077,9 @@
    <!-- Title for the button to initiate a heap dump for the system server. [CHAR LIMIT=NONE] -->
    <string name="capture_system_heap_dump_title">Capture system heap dump</string>
    <!-- Title for the button to reboot with MTE enabled. [CHAR LIMIT=NONE] -->
    <string name="reboot_with_mte_title">Reboot with MTE</string>
    <string name="reboot_with_mte_message">This wil reboot and allow to experiment with Memory Tagging Extensions (MTE). This may negatively impact system performance and stability. Will be reset on next subsequent reboot.</string>
    <!-- Toast that is shown when the user initiates capturing a heap dump for the system server. [CHAR LIMIT=NONE] -->
    <string name="capturing_system_heap_dump_message">Capturing system heap dump</string>
    <!-- Toast that is shown if there's an error capturing the user initiated heap dump. [CHAR LIMIT=NONE] -->
+4 −0
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@
            android:key="system_server_heap_dump"
            android:title="@string/capture_system_heap_dump_title" />

        <Preference
            android:key="reboot_with_mte"
            android:title="@string/reboot_with_mte_title" />

        <Preference
            android:key="local_backup_password"
            android:title="@string/local_backup_password_title"
+1 −0
Original line number Diff line number Diff line
@@ -477,6 +477,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new BugReportPreferenceController(context));
        controllers.add(new BugReportHandlerPreferenceController(context));
        controllers.add(new SystemServerHeapDumpPreferenceController(context));
        controllers.add(new RebootWithMtePreferenceController(context, fragment));
        controllers.add(new LocalBackupPasswordPreferenceController(context));
        controllers.add(new StayAwakePreferenceController(context, lifecycle));
        controllers.add(new HdcpCheckingPreferenceController(context));
+75 −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.development;

import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.SystemProperties;

import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

public class RebootWithMteDialog extends InstrumentedDialogFragment
        implements DialogInterface.OnClickListener {

    public static final String TAG = "RebootWithMteDlg";
    private Context mContext;

    public RebootWithMteDialog(Context context) {
        mContext = context;
    }

    public static void show(Context context, Fragment host) {
        FragmentManager manager = host.getActivity().getSupportFragmentManager();
        if (manager.findFragmentByTag(TAG) == null) {
            RebootWithMteDialog dialog = new RebootWithMteDialog(context);
            dialog.setTargetFragment(host, 0 /* requestCode */);
            dialog.show(manager, TAG);
        }
    }

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.REBOOT_WITH_MTE;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.reboot_with_mte_title)
                .setMessage(R.string.reboot_with_mte_message)
                .setPositiveButton(android.R.string.ok, this /* onClickListener */)
                .setNegativeButton(android.R.string.cancel, null /* onClickListener */)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        PowerManager pm = mContext.getSystemService(PowerManager.class);
        SystemProperties.set("arm64.memtag.bootctl", "memtag-once");
        pm.reboot(null);
    }
}
+63 −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.development;

import android.content.Context;
import android.text.TextUtils;

import androidx.preference.Preference;

import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

public class RebootWithMtePreferenceController extends DeveloperOptionsPreferenceController
        implements PreferenceControllerMixin {

    private static final String KEY_REBOOT_WITH_MTE = "reboot_with_mte";

    private final DevelopmentSettingsDashboardFragment mFragment;

    public RebootWithMtePreferenceController(
            Context context, DevelopmentSettingsDashboardFragment fragment) {
        super(context);
        mFragment = fragment;
    }

    @Override
    public boolean isAvailable() {
        return android.os.SystemProperties.getBoolean("ro.arm64.memtag.bootctl_supported", false);
    }

    @Override
    public String getPreferenceKey() {
        return KEY_REBOOT_WITH_MTE;
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (Utils.isMonkeyRunning()) {
            return false;
        }

        if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
            RebootWithMteDialog.show(mContext, mFragment);
            return true;
        }
        return false;
    }
}
Loading