/* * Copyright (C) 2020 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.network; import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE; import static com.android.settings.network.InternetUpdater.INTERNET_OFF; import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; import android.content.Context; import android.graphics.drawable.Drawable; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import androidx.annotation.IdRes; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.widget.SummaryUpdater; import com.android.settings.wifi.WifiSummaryUpdater; import com.android.settingslib.Utils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.utils.ThreadUtils; import java.util.HashMap; import java.util.Map; /** * PreferenceController to update the internet state. */ public class InternetPreferenceController extends AbstractPreferenceController implements LifecycleObserver, SummaryUpdater.OnSummaryChangeListener, InternetUpdater.InternetChangeListener { public static final String KEY = "internet_settings"; private Preference mPreference; private final WifiSummaryUpdater mSummaryHelper; private InternetUpdater mInternetUpdater; private @InternetUpdater.InternetType int mInternetType; @VisibleForTesting static Map sIconMap = new HashMap<>(); static { sIconMap.put(INTERNET_OFF, R.drawable.ic_no_internet_unavailable); sIconMap.put(INTERNET_NETWORKS_AVAILABLE, R.drawable.ic_no_internet_available); sIconMap.put(INTERNET_WIFI, R.drawable.ic_wifi_signal_4); sIconMap.put(INTERNET_CELLULAR, R.drawable.ic_network_cell); sIconMap.put(INTERNET_ETHERNET, R.drawable.ic_settings_ethernet); } private static Map sSummaryMap = new HashMap<>(); static { sSummaryMap.put(INTERNET_OFF, R.string.condition_airplane_title); sSummaryMap.put(INTERNET_NETWORKS_AVAILABLE, R.string.networks_available); sSummaryMap.put(INTERNET_WIFI, 0); sSummaryMap.put(INTERNET_CELLULAR, 0); sSummaryMap.put(INTERNET_ETHERNET, R.string.to_switch_networks_disconnect_ethernet); } public InternetPreferenceController(Context context, Lifecycle lifecycle) { super(context); if (lifecycle == null) { throw new IllegalArgumentException("Lifecycle must be set"); } mSummaryHelper = new WifiSummaryUpdater(mContext, this); mInternetUpdater = new InternetUpdater(context, lifecycle, this); mInternetType = mInternetUpdater.getInternetType(); lifecycle.addObserver(this); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(KEY); } @Override public void updateState(Preference preference) { if (mPreference == null) { return; } final @IdRes int icon = sIconMap.get(mInternetType); if (icon != 0) { final Drawable drawable = mContext.getDrawable(icon); if (drawable != null) { drawable.setTintList( Utils.getColorAttr(mContext, android.R.attr.colorControlNormal)); mPreference.setIcon(drawable); } } if (mInternetType == INTERNET_WIFI) { mPreference.setSummary(mSummaryHelper.getSummary()); return; } if (mInternetType == INTERNET_CELLULAR) { updateCellularSummary(); return; } final @IdRes int summary = sSummaryMap.get(mInternetType); if (summary != 0) { mPreference.setSummary(summary); } } @Override public boolean isAvailable() { return true; } @Override public String getPreferenceKey() { return KEY; } /** @OnLifecycleEvent(ON_RESUME) */ @OnLifecycleEvent(ON_RESUME) public void onResume() { mSummaryHelper.register(true); } /** @OnLifecycleEvent(ON_PAUSE) */ @OnLifecycleEvent(ON_PAUSE) public void onPause() { mSummaryHelper.register(false); } /** * Called when internet type is changed. * * @param internetType the internet type */ @Override public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) { final boolean needUpdate = (internetType != mInternetType); mInternetType = internetType; if (needUpdate) { ThreadUtils.postOnMainThread(() -> { updateState(mPreference); }); } } /** * Called when airplane mode state is changed. */ @Override public void onAirplaneModeChanged(boolean isAirplaneModeOn) { ThreadUtils.postOnMainThread(() -> { updateState(mPreference); }); } @Override public void onSummaryChanged(String summary) { if (mInternetType == INTERNET_WIFI && mPreference != null) { mPreference.setSummary(summary); } } @VisibleForTesting void updateCellularSummary() { final SubscriptionManager subscriptionManager = mContext.getSystemService(SubscriptionManager.class); if (subscriptionManager == null) { return; } SubscriptionInfo subInfo = subscriptionManager.getDefaultDataSubscriptionInfo(); if (subInfo == null) { return; } mPreference.setSummary(SubscriptionUtil.getUniqueSubscriptionDisplayName( subInfo, mContext)); } }