diff options
author | Treehugger Robot <android-build-prod@system.gserviceaccount.com> | 2020-04-07 18:14:38 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-04-07 18:14:38 +0000 |
commit | f5f79ea645af49389ee3b51ccb07ad7f97f16d17 (patch) | |
tree | ddbe99c4aa5d7439e2b65ff8d244d3440d54fefd /src | |
parent | 788ea36823d94ae6ce3866befb516236e6112e05 (diff) | |
parent | c8a9a496d2a5ffa8d063adff3f6315b25978c008 (diff) |
Merge "Redesign 5G switch" into r-keystone-qcom-dev
Diffstat (limited to 'src')
3 files changed, 209 insertions, 0 deletions
diff --git a/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java b/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java new file mode 100755 index 0000000000..972634d066 --- /dev/null +++ b/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package com.android.settings.network.telephony; + +import android.content.Context; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.Looper; +import android.os.PersistableBundle; +import android.provider.Settings; +import android.telephony.CarrierConfigManager; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +import com.android.settings.R; +import com.android.settings.network.telephony.MobileNetworkUtils; + + +/** + * Preference controller for "Enabled 5G Switch" +*/ + +public class Enabled5GPreferenceController extends TelephonyTogglePreferenceController + implements LifecycleObserver, OnStart, OnStop { + private static final String TAG = "Enable5g"; + + Preference mPreference; + private CarrierConfigManager mCarrierConfigManager; + private PersistableBundle mCarrierConfig; + private TelephonyManager mTelephonyManager; + + private ContentObserver mPreferredNetworkModeObserver; + private ContentObserver mSubsidySettingsObserver; + + public Enabled5GPreferenceController(Context context, String key) { + super(context, key); + mPreferredNetworkModeObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + if (mPreference != null) { + Log.d(TAG, "mPreferredNetworkModeObserver#onChange"); + updateState(mPreference); + } + } + }; + mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); + } + + public Enabled5GPreferenceController init(int subId) { + if (SubscriptionManager.isValidSubscriptionId(mSubId) && mSubId == subId) { + return this; + } + mSubId = subId; + mCarrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class) + .createForSubscriptionId(mSubId); + return this; + } + + @Override + public int getAvailabilityStatus(int subId) { + init(subId); + final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId); + int defaultDdsSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + final boolean isDds = defaultDdsSubId == subId; + final boolean is5gEnabledByCarrier = (mTelephonyManager.getAllowedNetworkTypes() + & TelephonyManager.NETWORK_TYPE_BITMASK_NR) > 0; + final boolean isVisible = SubscriptionManager.isValidSubscriptionId(subId) + && !carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLED_5G_BOOL) + && is5gEnabledByCarrier + && isDds; + return isVisible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void onStart() { + mContext.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + mSubId), true, + mPreferredNetworkModeObserver); + } + + @Override + public void onStop() { + if (mPreferredNetworkModeObserver != null) { + mContext.getContentResolver().unregisterContentObserver(mPreferredNetworkModeObserver); + } + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + final SwitchPreference switchPreference = (SwitchPreference) preference; + switchPreference.setVisible(true); + switchPreference.setEnabled(true); + long preferredNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType( + Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE + mSubId, + TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE)); + switchPreference.setChecked(isNrNetworkModeType(preferredNetworkBitMask)); + } + + @Override + public boolean setChecked(boolean isChecked) { + if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { + return false; + } + int preNetworkMode = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE + mSubId, + TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE); + long newNetworkBitMask; + if (TelephonyManager.NETWORK_MODE_NR_ONLY != preNetworkMode) { + long preNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType(preNetworkMode); + newNetworkBitMask = isChecked ? + (preNetworkBitMask | TelephonyManager.NETWORK_TYPE_BITMASK_NR) + : (preNetworkBitMask & ~TelephonyManager.NETWORK_TYPE_BITMASK_NR); + } else { + newNetworkBitMask = MobileNetworkUtils + .getRafFromNetworkType(TelephonyManager.NETWORK_MODE_LTE_ONLY); + } + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE + mSubId, + MobileNetworkUtils.getNetworkTypeFromRaf((int)newNetworkBitMask)); + if (mTelephonyManager.setPreferredNetworkTypeBitmask(newNetworkBitMask)) { + Log.d(TAG, "setPreferredNetworkTypeBitmask"); + return true; + } + return false; + } + + @Override + public boolean isChecked(){ + long preNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType( + Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE + mSubId, + TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE)); + return isNrNetworkModeType(preNetworkBitMask); + } + + private boolean isNrNetworkModeType(long currentRadioBitmask) { + return checkSupportedRadioBitmask(currentRadioBitmask, + TelephonyManager.NETWORK_TYPE_BITMASK_NR); + } + + boolean checkSupportedRadioBitmask(long supportedRadioBitmask, long targetBitmask) { + Log.d(TAG, "supportedRadioBitmask: " + supportedRadioBitmask); + if ((targetBitmask & supportedRadioBitmask) > 0) { + return true; + } + return false; + } +} diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 1bbc1a263f..8dc1172598 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -209,6 +209,7 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment { final VideoCallingPreferenceController videoCallingPreferenceController = use(VideoCallingPreferenceController.class).init(mSubId); + use(Enabled5GPreferenceController.class).init(mSubId); use(CallingPreferenceCategoryController.class).setChildren( Arrays.asList(wifiCallingPreferenceController, videoCallingPreferenceController)); use(Enhanced4gLtePreferenceController.class).init(mSubId) diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java index 43a71c902e..7a4b05ec5d 100644 --- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java @@ -48,6 +48,7 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe private static final String LOG_TAG = "PreferredNetworkMode"; private CarrierConfigManager mCarrierConfigManager; + private ContentObserver mPreferredNetworkModeObserver; private ContentObserver mSubsidySettingsObserver; private TelephonyManager mTelephonyManager; private PersistableBundle mPersistableBundle; @@ -75,6 +76,15 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe } } }; + mPreferredNetworkModeObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + if (mPreference != null) { + Log.d(LOG_TAG, "mPreferredNetworkModeObserver#onChange"); + updateState(mPreference); + } + } + }; } @Override @@ -107,6 +117,9 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe Settings.Secure.getUriFor(PrimaryCardAndSubsidyLockUtils.SUBSIDY_STATUS), false, mSubsidySettingsObserver); } + mContext.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + mSubId), true, + mPreferredNetworkModeObserver); } @OnLifecycleEvent(ON_STOP) @@ -114,6 +127,9 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe if (mSubsidySettingsObserver != null) { mContext.getContentResolver().unregisterContentObserver(mSubsidySettingsObserver); } + if (mPreferredNetworkModeObserver != null) { + mContext.getContentResolver().unregisterContentObserver(mPreferredNetworkModeObserver); + } } @Override |