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

Commit 74042f59 authored by Daniel Huang's avatar Daniel Huang Committed by Android (Google) Code Review
Browse files

Merge "The dialog should persist after rotation." into udc-dev

parents b5774a8e 94d5d00a
Loading
Loading
Loading
Loading
+46 −37
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.inputmethod;

import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
@@ -52,11 +53,13 @@ import java.util.Map;

public class ModifierKeysPickerDialogFragment extends DialogFragment {

    static final String DEFAULT_KEY = "default_key";
    static final String SELECTION_KEY = "delection_key";

    private Preference mPreference;
    private String mKeyDefaultName;
    private String mKeyFocus;
    private Context mContext;
    private InputManager mIm;
    private Activity mActivity;

    private List<int[]> mRemappableKeyList =
            new ArrayList<>(Arrays.asList(
@@ -67,36 +70,41 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {

    private Map<String, int[]> mRemappableKeyMap = new HashMap<>();

    public ModifierKeysPickerDialogFragment() {
    }
    public ModifierKeysPickerDialogFragment() {}

    public ModifierKeysPickerDialogFragment(Preference preference, InputManager inputManager) {
        mPreference = preference;
        mKeyDefaultName = preference.getTitle().toString();
        mKeyFocus = preference.getSummary().toString();
        mIm = inputManager;
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putString(SELECTION_KEY, mKeyFocus);
        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreateDialog(savedInstanceState);
        mContext = getActivity();

        mActivity = getActivity();
        InputManager inputManager = mActivity.getSystemService(InputManager.class);
        mKeyDefaultName = getArguments().getString(DEFAULT_KEY);
        mKeyFocus = getArguments().getString(SELECTION_KEY);
        if (savedInstanceState != null) {
            mKeyFocus = savedInstanceState.getString(SELECTION_KEY);
        }
        List<String> modifierKeys = new ArrayList<String>(Arrays.asList(
                mContext.getString(R.string.modifier_keys_caps_lock),
                mContext.getString(R.string.modifier_keys_ctrl),
                mContext.getString(R.string.modifier_keys_meta),
                mContext.getString(R.string.modifier_keys_alt)));
                mActivity.getString(R.string.modifier_keys_caps_lock),
                mActivity.getString(R.string.modifier_keys_ctrl),
                mActivity.getString(R.string.modifier_keys_meta),
                mActivity.getString(R.string.modifier_keys_alt)));
        for (int i = 0; i < modifierKeys.size(); i++) {
            mRemappableKeyMap.put(modifierKeys.get(i), mRemappableKeyList.get(i));
        }

        View dialoglayout  =
                LayoutInflater.from(mContext).inflate(R.layout.modifier_key_picker_dialog, null);
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
                LayoutInflater.from(mActivity).inflate(R.layout.modifier_key_picker_dialog, null);
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mActivity);
        dialogBuilder.setView(dialoglayout);

        TextView summary = dialoglayout.findViewById(R.id.modifier_key_picker_summary);
        CharSequence summaryText = mContext.getString(
        CharSequence summaryText = mActivity.getString(
                R.string.modifier_keys_picker_summary, mKeyDefaultName);
        summary.setText(summaryText);

@@ -119,14 +127,14 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {
            Spannable itemSummary;
            if (selectedItem.equals(mKeyDefaultName)) {
                itemSummary = new SpannableString(
                        mContext.getString(R.string.modifier_keys_default_summary));
                        mActivity.getString(R.string.modifier_keys_default_summary));
                itemSummary.setSpan(
                        new ForegroundColorSpan(getColorOfTextColorSecondary()),
                        0, itemSummary.length(), 0);
                // Set keys to default.
                int[] keys = mRemappableKeyMap.get(mKeyDefaultName);
                for (int i = 0; i < keys.length; i++) {
                    mIm.remapModifierKey(keys[i], keys[i]);
                    inputManager.remapModifierKey(keys[i], keys[i]);
                }
            } else {
                itemSummary = new SpannableString(selectedItem);
@@ -136,29 +144,29 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {
                int[] fromKeys = mRemappableKeyMap.get(mKeyDefaultName);
                int[] toKeys = mRemappableKeyMap.get(selectedItem);
                // CAPS_LOCK only one key, so always choose the left key for remapping.
                if (isKeyCapsLock(mContext, mKeyDefaultName)) {
                    mIm.remapModifierKey(fromKeys[0], toKeys[0]);
                if (isKeyCapsLock(mActivity, mKeyDefaultName)) {
                    inputManager.remapModifierKey(fromKeys[0], toKeys[0]);
                }
                // Remap KEY_LEFT and KEY_RIGHT to CAPS_LOCK.
                if (!isKeyCapsLock(mContext, mKeyDefaultName)
                        && isKeyCapsLock(mContext, selectedItem)) {
                    mIm.remapModifierKey(fromKeys[0], toKeys[0]);
                    mIm.remapModifierKey(fromKeys[1], toKeys[0]);
                if (!isKeyCapsLock(mActivity, mKeyDefaultName)
                        && isKeyCapsLock(mActivity, selectedItem)) {
                    inputManager.remapModifierKey(fromKeys[0], toKeys[0]);
                    inputManager.remapModifierKey(fromKeys[1], toKeys[0]);
                }
                // Auto handle left and right keys remapping.
                if (!isKeyCapsLock(mContext, mKeyDefaultName)
                        && !isKeyCapsLock(mContext, selectedItem)) {
                    mIm.remapModifierKey(fromKeys[0], toKeys[0]);
                    mIm.remapModifierKey(fromKeys[1], toKeys[1]);
                if (!isKeyCapsLock(mActivity, mKeyDefaultName)
                        && !isKeyCapsLock(mActivity, selectedItem)) {
                    inputManager.remapModifierKey(fromKeys[0], toKeys[0]);
                    inputManager.remapModifierKey(fromKeys[1], toKeys[1]);
                }
            }
            mPreference.setSummary(itemSummary);
            modifierKeyDialog.dismiss();
            dismiss();
            mActivity.recreate();
        });

        Button cancelButton = dialoglayout.findViewById(R.id.modifier_key_cancel_button);
        cancelButton.setOnClickListener(v -> {
            modifierKeyDialog.dismiss();
            dismiss();
        });

        final Window window = modifierKeyDialog.getWindow();
@@ -207,16 +215,17 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            if (view == null) {
                view = LayoutInflater.from(mContext).inflate(R.layout.modifier_key_item, null);
                view = LayoutInflater.from(mActivity).inflate(R.layout.modifier_key_item, null);
            }
            TextView textView = view.findViewById(R.id.modifier_key_text);
            ImageView checkIcon = view.findViewById(R.id.modifier_key_check_icon);
            textView.setText(mList.get(i));
            if (mCurrentItem == i) {
                mKeyFocus = mList.get(i);
                textView.setTextColor(getColorOfColorAccentPrimaryVariant());
                checkIcon.setImageAlpha(255);
                view.setBackground(
                        mContext.getDrawable(R.drawable.modifier_key_lisetview_background));
                        mActivity.getDrawable(R.drawable.modifier_key_lisetview_background));
            } else {
                textView.setTextColor(getColorOfTextColorPrimary());
                checkIcon.setImageAlpha(0);
@@ -235,15 +244,15 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {
    }

    private int getColorOfTextColorPrimary() {
        return Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorPrimary);
        return Utils.getColorAttrDefaultColor(mActivity, android.R.attr.textColorPrimary);
    }

    private int getColorOfTextColorSecondary() {
        return Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorSecondary);
        return Utils.getColorAttrDefaultColor(mActivity, android.R.attr.textColorSecondary);
    }

    private int getColorOfColorAccentPrimaryVariant() {
        return Utils.getColorAttrDefaultColor(
                mContext, com.android.internal.R.attr.materialColorPrimaryContainer);
                mActivity, com.android.internal.R.attr.materialColorPrimaryContainer);
    }
}
+22 −23
Original line number Diff line number Diff line
@@ -18,12 +18,12 @@ package com.android.settings.inputmethod;

import android.content.Context;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.KeyEvent;

import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
@@ -41,8 +41,8 @@ import java.util.Objects;

public class ModifierKeysPreferenceController extends BasePreferenceController {

    private static String KEY_TAG = "modifier_keys_dialog_tag";
    private static String KEY_RESTORE_PREFERENCE = "modifier_keys_restore";
    private static final String KEY_TAG = "modifier_keys_dialog_tag";
    private static final String KEY_RESTORE_PREFERENCE = "modifier_keys_restore";

    private static final String KEY_PREFERENCE_CAPS_LOCK = "modifier_keys_caps_lock";
    private static final String KEY_PREFERENCE_CTRL = "modifier_keys_ctrl";
@@ -52,6 +52,7 @@ public class ModifierKeysPreferenceController extends BasePreferenceController {
    private Fragment mParent;
    private FragmentManager mFragmentManager;
    private final InputManager mIm;
    private PreferenceScreen mScreen;

    private final List<Integer> mRemappableKeys = new ArrayList<>(
            Arrays.asList(
@@ -82,40 +83,39 @@ public class ModifierKeysPreferenceController extends BasePreferenceController {
    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        if (mParent == null) {
            return;
        }
        mScreen = screen;
        refreshUi();
    }

    private void refreshUi() {
        for (Map.Entry<Integer, Integer> entry : mIm.getModifierKeyRemapping().entrySet()) {
            int fromKey = entry.getKey();
            int toKey = entry.getValue();
            int index = mRemappableKeys.indexOf(toKey);

            if (isCtrl(fromKey) && mRemappableKeys.contains(toKey)) {
                Preference preference = screen.findPreference(KEY_PREFERENCE_CTRL);
                Preference preference = mScreen.findPreference(KEY_PREFERENCE_CTRL);
                preference.setSummary(changeSummaryColor(mKeyNames[index]));
            }

            if (isMeta(fromKey) && mRemappableKeys.contains(toKey)) {
                Preference preference = screen.findPreference(KEY_PREFERENCE_META);
                Preference preference = mScreen.findPreference(KEY_PREFERENCE_META);
                preference.setSummary(changeSummaryColor(mKeyNames[index]));
            }

            if (isAlt(fromKey) && mRemappableKeys.contains(toKey)) {
                Preference preference = screen.findPreference(KEY_PREFERENCE_ALT);
                Preference preference = mScreen.findPreference(KEY_PREFERENCE_ALT);
                preference.setSummary(changeSummaryColor(mKeyNames[index]));
            }

            if (isCapLock(fromKey) && mRemappableKeys.contains(toKey)) {
                Preference preference = screen.findPreference(KEY_PREFERENCE_CAPS_LOCK);
                Preference preference = mScreen.findPreference(KEY_PREFERENCE_CAPS_LOCK);
                preference.setSummary(changeSummaryColor(mKeyNames[index]));
            }
        }

        // The dialog screen depends on the previous selected key's fragment.
        // In the rotation scenario, we should remove the previous dialog screen first.
        clearPreviousDialog();
    }

    @Override
@@ -133,21 +133,20 @@ public class ModifierKeysPreferenceController extends BasePreferenceController {
    }

    private void showModifierKeysDialog(Preference preference) {
        ModifierKeysPickerDialogFragment fragment =
                new ModifierKeysPickerDialogFragment(preference, mIm);
        mFragmentManager = mParent.getFragmentManager();
        ModifierKeysPickerDialogFragment fragment = new ModifierKeysPickerDialogFragment();
        fragment.setTargetFragment(mParent, 0);
        Bundle bundle = new Bundle();
        bundle.putString(
                ModifierKeysPickerDialogFragment.DEFAULT_KEY,
                preference.getTitle().toString());
        bundle.putString(
                ModifierKeysPickerDialogFragment.SELECTION_KEY,
                preference.getSummary().toString());
        fragment.setArguments(bundle);
        fragment.show(mFragmentManager, KEY_TAG);
    }

    private void clearPreviousDialog() {
        mFragmentManager = mParent.getFragmentManager();
        DialogFragment preKeysDialogFragment =
                (DialogFragment) mFragmentManager.findFragmentByTag(KEY_TAG);
        if (preKeysDialogFragment != null) {
            preKeysDialogFragment.dismiss();
        }
    }

    private Spannable changeSummaryColor(String summary) {
        Spannable spannableSummary = new SpannableString(summary);
        spannableSummary.setSpan(
+11 −43
Original line number Diff line number Diff line
@@ -18,25 +18,19 @@ package com.android.settings.inputmethod;

import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;

import androidx.fragment.app.DialogFragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settingslib.Utils;

public class ModifierKeysResetDialogFragment extends DialogFragment {
    private static final String MODIFIER_KEYS_CAPS_LOCK = "modifier_keys_caps_lock";
@@ -44,41 +38,36 @@ public class ModifierKeysResetDialogFragment extends DialogFragment {
    private static final String MODIFIER_KEYS_META = "modifier_keys_meta";
    private static final String MODIFIER_KEYS_ALT = "modifier_keys_alt";

    private PreferenceScreen mScreen;
    private InputManager mIm;
    private String[] mKeys = {
            MODIFIER_KEYS_CAPS_LOCK,
            MODIFIER_KEYS_CTRL,
            MODIFIER_KEYS_META,
            MODIFIER_KEYS_ALT};

    public ModifierKeysResetDialogFragment() {
    }

    public ModifierKeysResetDialogFragment(PreferenceScreen screen, InputManager inputManager) {
        mScreen = screen;
        mIm = inputManager;
    }
    public ModifierKeysResetDialogFragment() {}

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreateDialog(savedInstanceState);
        Context mContext = getActivity();

        Activity activity = getActivity();
        InputManager inputManager = activity.getSystemService(InputManager.class);
        View dialoglayout =
                LayoutInflater.from(mContext).inflate(R.layout.modifier_key_reset_dialog, null);
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
                LayoutInflater.from(activity).inflate(R.layout.modifier_key_reset_dialog, null);
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
        dialogBuilder.setView(dialoglayout);
        AlertDialog modifierKeyResetDialog = dialogBuilder.create();

        Button restoreButton = dialoglayout.findViewById(R.id.modifier_key_reset_restore_button);
        restoreButton.setOnClickListener(v -> {
            resetToDefault();
            modifierKeyResetDialog.dismiss();
            inputManager.clearAllModifierKeyRemappings();
            dismiss();
            activity.recreate();
        });

        Button cancelButton = dialoglayout.findViewById(R.id.modifier_key_reset_cancel_button);
        cancelButton.setOnClickListener(v -> {
            modifierKeyResetDialog.dismiss();
            dismiss();
        });

        final Window window = modifierKeyResetDialog.getWindow();
@@ -86,25 +75,4 @@ public class ModifierKeysResetDialogFragment extends DialogFragment {

        return modifierKeyResetDialog;
    }

    private void resetToDefault() {
        Context mContext = getActivity();
        for (int i = 0; i < mKeys.length; i++) {
            Preference preference = mScreen.findPreference(mKeys[i]);
            Spannable title = new SpannableString(
                    mContext.getString(R.string.modifier_keys_default_summary));
            title.setSpan(
                    new ForegroundColorSpan(getColorOfTextColorSecondary()),
                    0, title.length(), 0);
            preference.setSummary(title);
        }

        if (mIm != null) {
            mIm.clearAllModifierKeyRemappings();
        }
    }

    private int getColorOfTextColorSecondary() {
        return Utils.getColorAttrDefaultColor(getActivity(), android.R.attr.textColorSecondary);
    }
}
+3 −19
Original line number Diff line number Diff line
@@ -17,12 +17,10 @@
package com.android.settings.inputmethod;

import android.content.Context;
import android.hardware.input.InputManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;

import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
@@ -34,16 +32,14 @@ import com.android.settingslib.Utils;

public class ModifierKeysRestorePreferenceController extends BasePreferenceController {

    private static String KEY_TAG = "modifier_keys_dialog_tag";
    private static final String KEY_TAG = "modifier_keys_restore_dialog_tag";

    private Fragment mParent;
    private FragmentManager mFragmentManager;
    private PreferenceScreen mScreen;
    private final InputManager mIm;

    public ModifierKeysRestorePreferenceController(Context context, String key) {
        super(context, key);
        mIm = context.getSystemService(InputManager.class);
    }

    public void setFragment(Fragment parent) {
@@ -57,9 +53,6 @@ public class ModifierKeysRestorePreferenceController extends BasePreferenceContr
            return;
        }
        mScreen = screen;
        // The dialog screen depends on the previous selected key's fragment.
        // In the rotation scenario, we should remove the previous dialog first.
        clearPreviousDialog();
        setResetKeyColor();
    }

@@ -78,8 +71,8 @@ public class ModifierKeysRestorePreferenceController extends BasePreferenceContr
    }

    private void showResetDialog() {
        ModifierKeysResetDialogFragment fragment =
                new ModifierKeysResetDialogFragment(mScreen, mIm);
        mFragmentManager = mParent.getFragmentManager();
        ModifierKeysResetDialogFragment fragment = new ModifierKeysResetDialogFragment();
        fragment.setTargetFragment(mParent, 0);
        fragment.show(mFragmentManager, KEY_TAG);
    }
@@ -98,13 +91,4 @@ public class ModifierKeysRestorePreferenceController extends BasePreferenceContr
        return Utils.getColorAttrDefaultColor(
                mParent.getActivity(), com.android.internal.R.attr.materialColorPrimaryContainer);
    }

    private void clearPreviousDialog() {
        mFragmentManager = mParent.getFragmentManager();
        DialogFragment preResetDialogFragment =
                (DialogFragment) mFragmentManager.findFragmentByTag(KEY_TAG);
        if (preResetDialogFragment != null) {
            preResetDialogFragment.dismiss();
        }
    }
}