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

Commit 45726b93 authored by SongFerng Wang's avatar SongFerng Wang Committed by Android (Google) Code Review
Browse files

Merge "Moving the error messages from slice to panel's subtitle" into sc-dev

parents 46fdf4d5 0c86903e
Loading
Loading
Loading
Loading
+0 −25
Original line number Diff line number Diff line
@@ -147,31 +147,6 @@ public class ProviderModelSlice extends WifiSlice {
                listBuilder.addRow(getWifiSliceItemRow(item));
            }
        }

        // Fifth section:  If device has connection problem, this row show the message for user.
        // 1) show non_carrier_network_unavailable:
        //    - while no wifi item
        // 2) show all_network_unavailable:
        //    - while no wifi item + no carrier
        //    - while no wifi item + no data capability
        if (worker == null || wifiList == null || wifiList.size() == 0) {
            log("no wifi item");
            int resId = R.string.non_carrier_network_unavailable;
            if (!hasCarrier || !mHelper.isDataSimActive()) {
                log("No carrier item or no carrier data.");
                resId = R.string.all_network_unavailable;
            }

            if (!hasCarrier && !hasEthernet) {
                // If there is no item in ProviderModelItem, slice needs a header.
                listBuilder.setHeader(mHelper.createHeader(
                        NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS));
            }
            listBuilder.addGridRow(
                    mHelper.createMessageGridRow(resId,
                            NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS));
        }

        return listBuilder.build();
    }

+10 −22
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.builders.GridRowBuilder;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;

@@ -79,12 +78,6 @@ public class ProviderModelSliceHelper {
        Log.d(TAG, s);
    }

    protected ListBuilder.HeaderBuilder createHeader(String intentAction) {
        return new ListBuilder.HeaderBuilder()
                .setTitle(mContext.getText(R.string.summary_placeholder))
                .setPrimaryAction(getPrimarySliceAction(intentAction));
    }

    protected ListBuilder createListBuilder(Uri uri) {
        final ListBuilder builder = new ListBuilder(mContext, uri, ListBuilder.INFINITY)
                .setAccentColor(-1)
@@ -92,14 +85,6 @@ public class ProviderModelSliceHelper {
        return builder;
    }

    protected GridRowBuilder createMessageGridRow(int messageResId, String intentAction) {
        final CharSequence title = mContext.getText(messageResId);
        return new GridRowBuilder()
                // Add cells to the grid row.
                .addCell(new GridRowBuilder.CellBuilder().addTitleText(title))
                .setPrimaryAction(getPrimarySliceAction(intentAction));
    }

    @Nullable
    protected WifiSliceItem getConnectedWifiItem(List<WifiSliceItem> wifiList) {
        if (wifiList == null) {
@@ -111,7 +96,10 @@ public class ProviderModelSliceHelper {
        return item.isPresent() ? item.get() : null;
    }

    protected boolean hasCarrier() {
    /**
     * @return whether there is the carrier item in the slice.
     */
    public boolean hasCarrier() {
        if (isAirplaneModeEnabled()
                || mSubscriptionManager == null || mTelephonyManager == null
                || mSubscriptionManager.getDefaultDataSubscriptionId()
@@ -175,7 +163,12 @@ public class ProviderModelSliceHelper {
        return mTelephonyManager.isDataEnabled();
    }

    protected boolean isDataSimActive() {
    /**
     * To check the carrier data status.
     *
     * @return whether the carrier data is active.
     */
    public boolean isDataSimActive() {
        return isNoCarrierData() ? false : MobileNetworkUtils.activeNetworkIsCellular(mContext);
    }

@@ -193,11 +186,6 @@ public class ProviderModelSliceHelper {
        return mobileDataOnAndNoData || mobileDataOffAndOutOfService;
    }

    private boolean isAirplaneSafeNetworksModeEnabled() {
        // TODO: isAirplaneSafeNetworksModeEnabled is not READY
        return false;
    }

    @VisibleForTesting
    Drawable getMobileDrawable(Drawable drawable) throws Throwable {
        // set color and drawable
+164 −13
Original line number Diff line number Diff line
@@ -22,10 +22,23 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS;

import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.provider.Settings;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.LifecycleObserver;
@@ -35,6 +48,9 @@ import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.network.AirplaneModePreferenceController;
import com.android.settings.network.InternetUpdater;
import com.android.settings.network.ProviderModelSliceHelper;
import com.android.settings.network.SubscriptionsChangeListener;
import com.android.settings.network.telephony.DataConnectivityListener;
import com.android.settings.slices.CustomSliceRegistry;

import java.util.ArrayList;
@@ -44,23 +60,69 @@ import java.util.List;
 * Represents the Internet Connectivity Panel.
 */
public class InternetConnectivityPanel implements PanelContent, LifecycleObserver,
        InternetUpdater.InternetChangeListener {
        InternetUpdater.InternetChangeListener, DataConnectivityListener.Client,
        SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
    private static final String TAG = "InternetConnectivityPanel";
    private static final int SUBTITLE_TEXT_NONE = -1;
    private static final int SUBTITLE_TEXT_WIFI_IS_TURNED_ON = R.string.wifi_is_turned_on_subtitle;
    private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE =
            R.string.non_carrier_network_unavailable;
    private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE =
            R.string.all_network_unavailable;

    private final Context mContext;
    private final WifiManager mWifiManager;
    private final IntentFilter mWifiStateFilter;
    private final NetworkProviderTelephonyCallback mTelephonyCallback;
    private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) {
                return;
            }
            if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)
                    || TextUtils.equals(intent.getAction(),
                    WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                updatePanelTitle();
            }
        }
    };

    @VisibleForTesting
    boolean mIsProviderModelEnabled;
    private PanelContentCallback mCallback;
    @VisibleForTesting
    InternetUpdater mInternetUpdater;
    @VisibleForTesting
    ProviderModelSliceHelper mProviderModelSliceHelper;

    public static InternetConnectivityPanel create(Context context) {
        return new InternetConnectivityPanel(context);
    }
    private int mSubtitle = SUBTITLE_TEXT_NONE;
    private PanelContentCallback mCallback;
    private TelephonyManager mTelephonyManager;
    private SubscriptionsChangeListener mSubscriptionsListener;
    private DataConnectivityListener mConnectivityListener;
    private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID;

    private InternetConnectivityPanel(Context context) {
        mContext = context.getApplicationContext();
        mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext);
        mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this);

        mSubscriptionsListener = new SubscriptionsChangeListener(context, this);
        mConnectivityListener = new DataConnectivityListener(context, this);
        mTelephonyCallback = new NetworkProviderTelephonyCallback();
        mDefaultDataSubid = getDefaultDataSubscriptionId();
        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);

        mWifiManager = mContext.getSystemService(WifiManager.class);
        mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

        mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null);
    }

    /** create the panel */
    public static InternetConnectivityPanel create(Context context) {
        return new InternetConnectivityPanel(context);
    }

    /** @OnLifecycleEvent(ON_RESUME) */
@@ -70,6 +132,12 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
            return;
        }
        mInternetUpdater.onResume();
        mSubscriptionsListener.start();
        mConnectivityListener.start();
        mTelephonyManager.registerTelephonyCallback(
                new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
        mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
        updatePanelTitle();
    }

    /** @OnLifecycleEvent(ON_PAUSE) */
@@ -79,6 +147,10 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
            return;
        }
        mInternetUpdater.onPause();
        mSubscriptionsListener.stop();
        mConnectivityListener.stop();
        mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
        mContext.unregisterReceiver(mWifiStateReceiver);
    }

    /**
@@ -98,9 +170,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
     */
    @Override
    public CharSequence getSubTitle() {
        if (mIsProviderModelEnabled && mInternetUpdater.isAirplaneModeOn()
                && mInternetUpdater.isWifiEnabled()) {
            return mContext.getText(R.string.wifi_is_turned_on_subtitle);
        if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) {
            return mContext.getText(mSubtitle);
        }
        return null;
    }
@@ -170,15 +241,36 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
        updatePanelTitle();
    }

    private void updatePanelTitle() {
    @Override
    public void onSubscriptionsChanged() {
        final int defaultDataSubId = getDefaultDataSubscriptionId();
        log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId);
        if (mDefaultDataSubid == defaultDataSubId) {
            return;
        }
        if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
            mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
            mTelephonyManager.registerTelephonyCallback(
                    new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
        }
        updatePanelTitle();
    }

    @Override
    public void onDataConnectivityChange() {
        log("onDataConnectivityChange");
        updatePanelTitle();
    }

    @VisibleForTesting
    void updatePanelTitle() {
        if (mCallback == null) {
            return;
        }
        updateSubtitleText();

        if (mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) {
            // When the airplane mode is on and Wi-Fi is enabled.
            //   Title: Airplane mode
            //   Sub-Title: Wi-Fi is turned on
        log("Subtitle:" + mSubtitle);
        if (mSubtitle != SUBTITLE_TEXT_NONE) {
            mCallback.onHeaderChanged();
        } else {
            // Other situations.
@@ -187,4 +279,63 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
        }
        mCallback.onCustomizedButtonStateChanged();
    }

    @VisibleForTesting
    int getDefaultDataSubscriptionId() {
        return SubscriptionManager.getDefaultDataSubscriptionId();
    }

    private void updateSubtitleText() {
        mSubtitle = SUBTITLE_TEXT_NONE;
        if (!mInternetUpdater.isWifiEnabled()) {
            return;
        }

        if (mInternetUpdater.isAirplaneModeOn()) {
            // When the airplane mode is on and Wi-Fi is enabled.
            //   Title: Airplane mode
            //   Sub-Title: Wi-Fi is turned on
            log("Airplane mode is on + Wi-Fi on.");
            mSubtitle = SUBTITLE_TEXT_WIFI_IS_TURNED_ON;
            return;
        }

        final List<ScanResult> wifiList = mWifiManager.getScanResults();
        if (wifiList != null && wifiList.size() == 0) {
            // Sub-Title:
            // show non_carrier_network_unavailable
            //   - while Wi-Fi on + no Wi-Fi item
            // show all_network_unavailable:
            //   - while Wi-Fi on + no Wi-Fi item + no carrier
            //   - while Wi-Fi on + no Wi-Fi item + no data capability
            log("No Wi-Fi item.");
            mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE;
            if (!mProviderModelSliceHelper.hasCarrier()
                    || !mProviderModelSliceHelper.isDataSimActive()) {
                log("No carrier item or no carrier data.");
                mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE;
            }
        }
    }

    private class NetworkProviderTelephonyCallback extends TelephonyCallback implements
            TelephonyCallback.DataConnectionStateListener,
            TelephonyCallback.ServiceStateListener {
        @Override
        public void onServiceStateChanged(ServiceState state) {
            log("onServiceStateChanged voiceState=" + state.getState()
                    + " dataState=" + state.getDataRegistrationState());
            updatePanelTitle();
        }

        @Override
        public void onDataConnectionStateChanged(int state, int networkType) {
            log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state);
            updatePanelTitle();
        }
    }

    private static void log(String s) {
        Log.d(TAG, s);
    }
}
+0 −17
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.Uri;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
@@ -43,8 +42,6 @@ import android.telephony.TelephonyManager;
import android.text.Html;

import androidx.slice.Slice;
import androidx.slice.builders.GridRowBuilder;
import androidx.slice.builders.GridRowBuilder.CellBuilder;
import androidx.slice.builders.ListBuilder;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -114,20 +111,6 @@ public class ProviderModelSliceHelperTest {
        mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable);
    }

    @Test
    public void createMessageGridRow_inputTheResourceId_verifyTitle() {
        int messageResId = ResourcesUtils.getResourcesId(mContext, "string",
                "non_carrier_network_unavailable");
        CharSequence title = ResourcesUtils.getResourcesString(mContext,
                "non_carrier_network_unavailable");

        GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId,
                Settings.ACTION_AIRPLANE_MODE_SETTINGS);
        List<CellBuilder> cellItem = testGridRow.getCells();

        assertThat(cellItem.get(0).getTitle()).isEqualTo(title);
    }

    @Test
    public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() {
        when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+2 −53
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -42,7 +41,6 @@ import android.telephony.TelephonyManager;

import androidx.slice.Slice;
import androidx.slice.SliceProvider;
import androidx.slice.builders.GridRowBuilder;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;
import androidx.slice.widget.SliceLiveData;
@@ -97,12 +95,6 @@ public class ProviderModelSliceTest {
    private WifiSliceItem mMockWifiSliceItem3;
    @Mock
    ListBuilder.RowBuilder mMockCarrierRowBuild;
    @Mock
    ListBuilder.HeaderBuilder mMockHeader;
    @Mock
    GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable;
    @Mock
    GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable;

    private FakeFeatureFactory mFeatureFactory;
    @Mock
@@ -147,35 +139,7 @@ public class ProviderModelSliceTest {

    @Test
    @UiThreadTest
    public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
        mWifiList.clear();
        mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
        mockHelperCondition(false, false, false, null);

        final Slice slice = mMockProviderModelSlice.getSlice();

        assertThat(slice).isNotNull();
        verify(mListBuilder, times(1)).setHeader(mMockHeader);
        verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
    }

    @Test
    @UiThreadTest
    public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
        mWifiList.clear();
        mMockNetworkProviderWorker.updateSelfResults(null);
        mockHelperCondition(false, false, false, null);

        final Slice slice = mMockProviderModelSlice.getSlice();

        assertThat(slice).isNotNull();
        verify(mListBuilder, times(1)).setHeader(mMockHeader);
        verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
    }

    @Test
    @UiThreadTest
    public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() {
    public void getSlice_noWifiAndHasCarrierNoData_oneCarrier() {
        mWifiList.clear();
        mMockNetworkProviderWorker.updateSelfResults(null);
        mockHelperCondition(false, true, false, null);
@@ -184,12 +148,11 @@ public class ProviderModelSliceTest {

        assertThat(slice).isNotNull();
        verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
        verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
    }

    @Test
    @UiThreadTest
    public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() {
    public void getSlice_noWifiAndNoCarrier_oneCarrier() {
        mWifiList.clear();
        mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
        mockHelperCondition(false, true, true, null);
@@ -198,7 +161,6 @@ public class ProviderModelSliceTest {

        assertThat(slice).isNotNull();
        verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
        verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable);
    }

    @Test
@@ -331,19 +293,6 @@ public class ProviderModelSliceTest {

    private void mockBuilder() {
        SliceAction mockSliceAction = getPrimarySliceAction();
        when(mMockHeader.getTitle()).thenReturn("mockHeader");
        when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction);
        when(mProviderModelSliceHelper.createHeader(anyString())).thenReturn(mMockHeader);

        int resId = ResourcesUtils.getResourcesId(mContext, "string",
                "non_carrier_network_unavailable");
        when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn(
                mMockGridRowBuilderNonCarrierNetworkUnavailable);
        resId = ResourcesUtils.getResourcesId(mContext, "string",
                "all_network_unavailable");
        when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn(
                mMockGridRowBuilderAllNetworkUnavailable);

        when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow");
        when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction);
        when(mProviderModelSliceHelper.createCarrierRow(anyString())).thenReturn(
Loading