From ab181697735f64a6f5ff51e6a5dc183bb64ce15a Mon Sep 17 00:00:00 2001 From: Allen Su Date: Fri, 22 Mar 2024 03:50:04 +0000 Subject: [PATCH] [ToA]Cache system gender to reduce unnecessary IPC Bug: 312324895 Test: atest TermsOfAddressNotSpecifiedControllerTest atest TermsOfAddressNeutralControllerTest atest TermsOfAddressMasculineControllerTest atest TermsOfAddressFeminineControllerTest Change-Id: Idee2cc1ece673092c94307b8812f032f7826c16a --- .../TermsOfAddressBaseController.java | 15 +++--- .../localepicker/TermsOfAddressFragment.java | 23 +++----- .../localepicker/TermsOfAddressHelper.java | 54 +++++++++++++++++++ .../TermsOfAddressFeminineControllerTest.java | 11 ++-- ...TermsOfAddressMasculineControllerTest.java | 11 ++-- .../TermsOfAddressNeutralControllerTest.java | 13 ++--- ...msOfAddressNotSpecifiedControllerTest.java | 11 ++-- 7 files changed, 87 insertions(+), 51 deletions(-) create mode 100644 src/com/android/settings/localepicker/TermsOfAddressHelper.java diff --git a/src/com/android/settings/localepicker/TermsOfAddressBaseController.java b/src/com/android/settings/localepicker/TermsOfAddressBaseController.java index d9962de9579..86b139ece48 100644 --- a/src/com/android/settings/localepicker/TermsOfAddressBaseController.java +++ b/src/com/android/settings/localepicker/TermsOfAddressBaseController.java @@ -16,9 +16,9 @@ package com.android.settings.localepicker; -import android.app.GrammaticalInflectionManager; import android.content.Context; +import androidx.annotation.NonNull; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; @@ -35,13 +35,15 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl private PreferenceScreen mPreferenceScreen; private MetricsFeatureProvider mMetricsFeatureProvider; private TickButtonPreference mPreference; - private GrammaticalInflectionManager mGrammaticalInflectionManager; + private TermsOfAddressHelper mTermsOfAddressHelper; public TermsOfAddressBaseController(Context context, String preferenceKey) { super(context, preferenceKey); mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); - mGrammaticalInflectionManager = context.getSystemService( - GrammaticalInflectionManager.class); + } + + public void setTermsOfAddressHelper(@NonNull TermsOfAddressHelper termsOfAddressHelper) { + mTermsOfAddressHelper = termsOfAddressHelper; } @Override @@ -52,7 +54,7 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl mPreference.setOnPreferenceClickListener(clickedPref -> { sExecutor.execute( () -> { - mGrammaticalInflectionManager.setSystemWideGrammaticalGender( + mTermsOfAddressHelper.setSystemGrammaticalGender( getGrammaticalGenderType()); }); setSelected(mPreference); @@ -74,8 +76,7 @@ public abstract class TermsOfAddressBaseController extends BasePreferenceControl return; } mPreference.setSelected( - mGrammaticalInflectionManager.getSystemGrammaticalGender() - == getGrammaticalGenderType()); + mTermsOfAddressHelper.getSystemGrammaticalGender() == getGrammaticalGenderType()); } @Override diff --git a/src/com/android/settings/localepicker/TermsOfAddressFragment.java b/src/com/android/settings/localepicker/TermsOfAddressFragment.java index 9484846affb..154d84e0b1c 100644 --- a/src/com/android/settings/localepicker/TermsOfAddressFragment.java +++ b/src/com/android/settings/localepicker/TermsOfAddressFragment.java @@ -22,18 +22,10 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; - -import java.util.ArrayList; -import java.util.List; public class TermsOfAddressFragment extends DashboardFragment { private static final String LOG_TAG = "TermsOfAddressFragment"; - private static final String KEY_NOT_SPECIFIED = "key_terms_of_address_not_specified"; - private static final String KEY_FEMININE = "key_terms_of_address_feminine"; - private static final String KEY_MASCULINE = "key_terms_of_address_masculine"; - private static final String KEY_NEUTRAL = "key_terms_of_address_neutral"; @Override protected String getLogTag() { @@ -51,13 +43,14 @@ public class TermsOfAddressFragment extends DashboardFragment { } @Override - protected List createPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - controllers.add(new TermsOfAddressNotSpecifiedController(context, KEY_NOT_SPECIFIED)); - controllers.add(new TermsOfAddressFeminineController(context, KEY_FEMININE)); - controllers.add(new TermsOfAddressMasculineController(context, KEY_MASCULINE)); - controllers.add(new TermsOfAddressNeutralController(context, KEY_NEUTRAL)); - return controllers; + public void onAttach(Context context) { + super.onAttach(context); + TermsOfAddressHelper termsOfAddressHelper = new TermsOfAddressHelper(context); + use(TermsOfAddressNotSpecifiedController.class).setTermsOfAddressHelper( + termsOfAddressHelper); + use(TermsOfAddressFeminineController.class).setTermsOfAddressHelper(termsOfAddressHelper); + use(TermsOfAddressMasculineController.class).setTermsOfAddressHelper(termsOfAddressHelper); + use(TermsOfAddressNeutralController.class).setTermsOfAddressHelper(termsOfAddressHelper); } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = diff --git a/src/com/android/settings/localepicker/TermsOfAddressHelper.java b/src/com/android/settings/localepicker/TermsOfAddressHelper.java new file mode 100644 index 00000000000..9e4978ec86c --- /dev/null +++ b/src/com/android/settings/localepicker/TermsOfAddressHelper.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2024 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.localepicker; + +import android.app.GrammaticalInflectionManager; +import android.content.Context; + +import androidx.annotation.NonNull; + +/** + * A helper used to get, set, and cache system grammatical gender. + */ +public class TermsOfAddressHelper { + + private int mSystemGrammaticalGender; + private GrammaticalInflectionManager mGrammaticalInflectionManager; + + public TermsOfAddressHelper(@NonNull Context context) { + mGrammaticalInflectionManager = context.getSystemService( + GrammaticalInflectionManager.class); + mSystemGrammaticalGender = mGrammaticalInflectionManager.getSystemGrammaticalGender(); + } + + /** + * set system grammatical gender + * + * @param gender system grammatical gender + */ + public void setSystemGrammaticalGender(int gender) { + mGrammaticalInflectionManager.setSystemWideGrammaticalGender(gender); + mSystemGrammaticalGender = gender; + } + + /** + * get system grammatical gender + */ + public int getSystemGrammaticalGender() { + return mSystemGrammaticalGender; + } +} diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java index fab25ca5ee5..ca39f8193b0 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java @@ -18,8 +18,6 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import android.app.GrammaticalInflectionManager; @@ -27,16 +25,14 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Looper; -import com.android.settings.widget.TickButtonPreference; - -import androidx.preference.PreferenceManager; -import androidx.preference.Preference; import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import org.junit.After; +import com.android.settings.widget.TickButtonPreference; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -91,6 +87,7 @@ public class TermsOfAddressFeminineControllerTest { mPreferenceScreen.addPreference(mMasculinePreference); mPreferenceScreen.addPreference(mNeutralPreference); mController = new TermsOfAddressFeminineController(mContext, KEY_FEMININE); + mController.setTermsOfAddressHelper(new TermsOfAddressHelper(mContext)); mController.displayPreference(mPreferenceScreen); } diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java index e794405526f..c4575150597 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java @@ -18,8 +18,6 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import android.app.GrammaticalInflectionManager; @@ -27,16 +25,14 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Looper; -import com.android.settings.widget.TickButtonPreference; - -import androidx.preference.PreferenceManager; -import androidx.preference.Preference; import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import org.junit.After; +import com.android.settings.widget.TickButtonPreference; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -91,6 +87,7 @@ public class TermsOfAddressMasculineControllerTest { mPreferenceScreen.addPreference(mMasculinePreference); mPreferenceScreen.addPreference(mNeutralPreference); mController = new TermsOfAddressMasculineController(mContext, KEY_MASCULINE); + mController.setTermsOfAddressHelper(new TermsOfAddressHelper(mContext)); mController.displayPreference(mPreferenceScreen); } diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java index ac3824348b4..757eb779ac0 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java @@ -18,8 +18,6 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import android.app.GrammaticalInflectionManager; @@ -27,16 +25,14 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Looper; -import com.android.settings.widget.TickButtonPreference; - -import androidx.preference.PreferenceManager; -import androidx.preference.Preference; import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import org.junit.After; +import com.android.settings.widget.TickButtonPreference; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -91,11 +87,12 @@ public class TermsOfAddressNeutralControllerTest { mPreferenceScreen.addPreference(mMasculinePreference); mPreferenceScreen.addPreference(mNeutralPreference); mController = new TermsOfAddressNeutralController(mContext, KEY_NEUTRAL); + mController.setTermsOfAddressHelper(new TermsOfAddressHelper(mContext)); mController.displayPreference(mPreferenceScreen); } @Test - public void displayPreference_setGrammaticalGenderIsNotSpecified_NotSpecifiedIsSelected() { + public void displayPreference_setGrammaticalGenderIsNotSpecified_NeutralIsSelected() { TickButtonPreference selectedPreference = (TickButtonPreference) mPreferenceScreen.getPreference(4); selectedPreference.performClick(); diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java index fd7d60d99cc..f53c5f68e6e 100644 --- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java +++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNotSpecifiedControllerTest.java @@ -18,8 +18,6 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; import android.app.GrammaticalInflectionManager; @@ -27,16 +25,14 @@ import android.content.Context; import android.content.res.Configuration; import android.os.Looper; -import com.android.settings.widget.TickButtonPreference; - -import androidx.preference.PreferenceManager; -import androidx.preference.Preference; import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import org.junit.After; +import com.android.settings.widget.TickButtonPreference; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -91,6 +87,7 @@ public class TermsOfAddressNotSpecifiedControllerTest { mPreferenceScreen.addPreference(mMasculinePreference); mPreferenceScreen.addPreference(mNeutralPreference); mController = new TermsOfAddressNotSpecifiedController(mContext, KEY_NOT_SPECIFIED); + mController.setTermsOfAddressHelper(new TermsOfAddressHelper(mContext)); mController.displayPreference(mPreferenceScreen); }