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

Commit 7b8c367d authored by Weng Su's avatar Weng Su
Browse files

[Provider model] Add "Turn off/on Wi-Fi" link to Internet Panel

- Replace the left menu button with "Turn off/on Wi-Fi"
  - Remove the TurnOnWifiSlice

- Show "Wi-Fi is off" sub-title when Wi-Fi is disabled
  - Remove the "Wi\u-Fi is turned on" sub-title when APM is on.

Bug: 188710392
Test: manual test
atest -c InternetConnectivityPanelTest
make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.panel

Change-Id: I53e200f6cadf8b712bf794bcbd5ff79f0f239cc0
parent 31389702
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -13201,6 +13201,8 @@
    <string name="keywords_internet">network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, cell carrier, 4g, 3g, 2g, lte</string>
    <!-- Slice title text for turning on the Wi-Fi networks. [CHAR LIMIT=40] -->
    <string name="turn_on_wifi">Turn on Wi\u2011Fi</string>
    <!-- Slice title text for turning off the Wi-Fi networks. [CHAR LIMIT=40] -->
    <string name="turn_off_wifi">Turn off Wi\u2011Fi</string>
    <!-- Title for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
    <string name="reset_your_internet_title">Reset your internet?</string>
    <!-- Description for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
@@ -13215,8 +13217,8 @@
    <string name="networks_available">Networks available</string>
    <!-- Summary for warning to disconnect ethernet first then switch to other networks. [CHAR LIMIT=60] -->
    <string name="to_switch_networks_disconnect_ethernet">To switch networks, disconnect ethernet</string>
    <!-- Panel subtitle for Wi-Fi turned on. [CHAR LIMIT=60] -->
    <string name="wifi_is_turned_on_subtitle">Wi\u2011Fi is turned on</string>
    <!-- Panel subtitle for Wi-Fi turned off. [CHAR LIMIT=60] -->
    <string name="wifi_is_off">Wi\u2011Fi is off</string>
    <!-- Panel subtitle for tapping a network to connect to internet. [CHAR LIMIT=60] -->
    <string name="tap_a_network_to_connect">Tap a network to connect</string>
    <!-- Title for merged carrier Wi-Fi offload toggle. [CHAR LIMIT=NONE] -->
+0 −147
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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 android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.util.Log;

import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.ListBuilder.RowBuilder;
import androidx.slice.builders.SliceAction;
import androidx.slice.core.SliceHints;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.slices.CustomSliceRegistry;
import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver;

/**
 * {@link CustomSliceable} for turning on Wi-Fi, used by generic clients.
 */
public class TurnOnWifiSlice implements CustomSliceable {

    private static final String TAG = "TurnOnWifiSlice";

    private final Context mContext;
    private final WifiManager mWifiManager;

    public TurnOnWifiSlice(Context context) {
        mContext = context;
        mWifiManager = mContext.getSystemService(WifiManager.class);
    }

    private static void logd(String s) {
        Log.d(TAG, s);
    }

    @Override
    public Slice getSlice() {
        if (mWifiManager.isWifiEnabled()) {
            return null;
        }
        final String title = mContext.getText(R.string.turn_on_wifi).toString();
        final SliceAction primaryAction = SliceAction.create(getBroadcastIntent(mContext),
                getEndIcon(), ListBuilder.ICON_IMAGE, title);
        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
                .addRow(new RowBuilder()
                        .setTitle(title)
                        .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE)
                        .setPrimaryAction(primaryAction));
        return listBuilder.build();
    }

    @Override
    public Uri getUri() {
        return CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI;
    }

    @Override
    public void onNotifyChange(Intent intent) {
        logd("Action: turn on Wi-Fi networks");
        mWifiManager.setWifiEnabled(true);
    }

    @Override
    public Intent getIntent() {
        return new Intent(getUri().toString())
                .setData(getUri())
                .setClass(mContext, SliceBroadcastReceiver.class);
    }

    private IconCompat getEndIcon() {
        final Drawable drawable = mContext.getDrawable(R.drawable.ic_settings_wireless);
        if (drawable == null) {
            return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
        }
        drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent));
        return Utils.createIconWithDrawable(drawable);
    }

    @Override
    public Class getBackgroundWorkerClass() {
        return TurnOnWifiWorker.class;
    }

    /**
     * The Slice background worker {@link SliceBackgroundWorker} is used to listen the Wi-Fi
     * status change, and then notifies the Slice {@link Uri} to update.
     */
    public static class TurnOnWifiWorker extends SliceBackgroundWorker {

        private final IntentFilter mIntentFilter;
        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
                    notifySliceChange();
                }
            }
        };

        public TurnOnWifiWorker(Context context, Uri uri) {
            super(context, uri);
            mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
        }

        @Override
        protected void onSlicePinned() {
            getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
        }

        @Override
        protected void onSliceUnpinned() {
            getContext().unregisterReceiver(mBroadcastReceiver);
        }

        @Override
        public void close() {
            // Do nothing.
        }
    }
}
+22 −35
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@ package com.android.settings.panel;
import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
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;
@@ -32,7 +30,6 @@ 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;
@@ -41,6 +38,7 @@ import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

@@ -64,7 +62,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
        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_WIFI_IS_OFF = R.string.wifi_is_off;
    private static final int SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT =
            R.string.tap_a_network_to_connect;
    private static final int SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS =
@@ -198,7 +196,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
        final List<Uri> uris = new ArrayList<>();
        if (mIsProviderModelEnabled) {
            uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
            uris.add(CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI);
        } else {
            uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
            uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
@@ -209,9 +206,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve

    @Override
    public Intent getSeeMoreIntent() {
        return new Intent(mIsProviderModelEnabled
                ? ACTION_NETWORK_PROVIDER_SETTINGS : Settings.ACTION_WIRELESS_SETTINGS)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        return null;
    }

    @Override
@@ -221,15 +216,14 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve

    @Override
    public CharSequence getCustomizedButtonTitle() {
        if (mInternetUpdater.isAirplaneModeOn() && !mInternetUpdater.isWifiEnabled()) {
            return null;
        }
        return mContext.getText(R.string.settings_button);
        return mContext.getText(
                mInternetUpdater.isWifiEnabled() ? R.string.turn_off_wifi : R.string.turn_on_wifi);
    }

    @Override
    public void onClickCustomizedButton() {
        mContext.startActivity(getSeeMoreIntent());
    public void onClickCustomizedButton(FragmentActivity panelActivity) {
        // Don't finish the panel activity
        mWifiManager.setWifiEnabled(!mInternetUpdater.isWifiEnabled());
    }

    @Override
@@ -290,15 +284,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
            return;
        }
        updateSubtitleText();

        log("Subtitle:" + mSubtitle);
        if (mSubtitle != SUBTITLE_TEXT_NONE) {
        mCallback.onHeaderChanged();
        } else {
            // Other situations.
            //   Title: Airplane mode / Internet
            mCallback.onTitleChanged();
        }
        mCallback.onCustomizedButtonStateChanged();
    }

@@ -310,15 +296,23 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
    private void updateSubtitleText() {
        mSubtitle = SUBTITLE_TEXT_NONE;
        if (!mInternetUpdater.isWifiEnabled()) {
            if (!mInternetUpdater.isAirplaneModeOn()) {
                // When the airplane mode is off and Wi-Fi is disabled.
                //   Sub-Title: Wi-Fi is off
                log("Airplane mode off + Wi-Fi off.");
                mSubtitle = SUBTITLE_TEXT_WIFI_IS_OFF;
            }
            return;
        }

        if (mIsProgressBarVisible) {
            // When the Wi-Fi scan result callback is received
            //   Sub-Title: Searching for networks...
            mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
            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;
        }

@@ -330,13 +324,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
            return;
        }

        if (mIsProgressBarVisible) {
            // When the Wi-Fi scan result callback is received
            //   Sub-Title: Searching for networks...
            mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
            return;
        }

        // Sub-Title:
        // show non_carrier_network_unavailable
        //   - while Wi-Fi on + no Wi-Fi item
+5 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Intent;
import android.net.Uri;

import androidx.core.graphics.drawable.IconCompat;
import androidx.fragment.app.FragmentActivity;

import com.android.settingslib.core.instrumentation.Instrumentable;

@@ -94,8 +95,11 @@ public interface PanelContent extends Instrumentable {

    /**
     * Implement the click event for custom button.
     *
     * @param panelActivity the FragmentActivity from PanelFragment, the user can decide whether
     * to finish activity or not.
     */
    default void onClickCustomizedButton() {}
    default void onClickCustomizedButton(FragmentActivity panelActivity) {}

    /**
     * Register to start receiving callbacks for custom button events.
+2 −2
Original line number Diff line number Diff line
@@ -491,11 +491,11 @@ public class PanelFragment extends Fragment {
            mPanelClosedKey = PanelClosedKeys.KEY_SEE_MORE;
            final FragmentActivity activity = getActivity();
            if (mPanel.isCustomizedButtonUsed()) {
                mPanel.onClickCustomizedButton();
                mPanel.onClickCustomizedButton(activity);
            } else {
                activity.startActivityForResult(mPanel.getSeeMoreIntent(), 0);
            }
                activity.finish();
            }
        };
    }

Loading