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

Commit 1bb401dd authored by Evan Laird's avatar Evan Laird
Browse files

Re-internalize MobileState and State from SettingsLib

ConnectivityState (nee State) lived in SettingsLib because of the fact
that MobileMappings needed the MobileIconGroup class, which lived inside
of SignalIcon.java. The whole thing is a bit messy, but this CL moves
the state objects back into the connectivity package where they belong.

Also move MobileState and WifiState into their own kotlin classes.

Bug: 197851948
Test: atest SystemUITests
Change-Id: I2997c66dbffb5e44b8f53b9020cdeb8b614cea3b
parent e66d5ea4
Loading
Loading
Loading
Loading
+1 −198
Original line number Diff line number Diff line
@@ -15,13 +15,8 @@
 */
package com.android.settingslib;

import com.android.settingslib.mobile.TelephonyIcons;

import java.text.SimpleDateFormat;
import java.util.Objects;

/**
 * Icons and states for SysUI and Settings.
 * Icons for SysUI and Settings.
 */
public class SignalIcon {

@@ -70,92 +65,6 @@ public class SignalIcon {
        }
    }

    /**
     * Holds states for SysUI.
     */
    public static class State {
        // No locale as it's only used for logging purposes
        private static SimpleDateFormat sSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
        public boolean connected;
        public boolean enabled;
        public boolean activityIn;
        public boolean activityOut;
        public int level;
        public IconGroup iconGroup;
        public int inetCondition;
        public int rssi; // Only for logging.

        // Not used for comparison, just used for logging.
        public long time;

        /**
         * Generates a copy of the source state.
         */
        public void copyFrom(State state) {
            connected = state.connected;
            enabled = state.enabled;
            level = state.level;
            iconGroup = state.iconGroup;
            inetCondition = state.inetCondition;
            activityIn = state.activityIn;
            activityOut = state.activityOut;
            rssi = state.rssi;
            time = state.time;
        }

        @Override
        public String toString() {
            if (time != 0) {
                StringBuilder builder = new StringBuilder();
                toString(builder);
                return builder.toString();
            } else {
                return "Empty " + getClass().getSimpleName();
            }
        }

        protected void toString(StringBuilder builder) {
            builder.append("connected=").append(connected).append(',')
                .append("enabled=").append(enabled).append(',')
                .append("level=").append(level).append(',')
                .append("inetCondition=").append(inetCondition).append(',')
                .append("iconGroup=").append(iconGroup).append(',')
                .append("activityIn=").append(activityIn).append(',')
                .append("activityOut=").append(activityOut).append(',')
                .append("rssi=").append(rssi).append(',')
                .append("lastModified=").append(sSDF.format(time));
        }

        @Override
        public boolean equals(Object o) {
            if (!o.getClass().equals(getClass())) {
                return false;
            }
            State other = (State) o;
            return other.connected == connected
                    && other.enabled == enabled
                    && other.level == level
                    && other.inetCondition == inetCondition
                    && other.iconGroup == iconGroup
                    && other.activityIn == activityIn
                    && other.activityOut == activityOut
                    && other.rssi == rssi;
        }

        @Override
        public int hashCode() {
            return Objects.hash(
                    connected,
                    enabled,
                    level,
                    inetCondition,
                    iconGroup,
                    activityIn,
                    activityOut,
                    rssi);
        }
    }

    /**
     * Holds icons for a given MobileState.
     */
@@ -189,110 +98,4 @@ public class SignalIcon {
            this.dataType = dataType;
        }
    }

    /**
     * Holds mobile states for SysUI.
     */
    public static class MobileState extends State {
        public String networkName;
        public String networkNameData;
        public boolean dataSim;
        public boolean dataConnected;
        public boolean isEmergency;
        public boolean airplaneMode;
        public boolean carrierNetworkChangeMode;
        public boolean isDefault;
        public boolean userSetup;
        public boolean roaming;
        public boolean defaultDataOff;  // Tracks the on/off state of the defaultDataSubscription

        @Override
        public void copyFrom(State s) {
            super.copyFrom(s);
            MobileState state = (MobileState) s;
            dataSim = state.dataSim;
            networkName = state.networkName;
            networkNameData = state.networkNameData;
            dataConnected = state.dataConnected;
            isDefault = state.isDefault;
            isEmergency = state.isEmergency;
            airplaneMode = state.airplaneMode;
            carrierNetworkChangeMode = state.carrierNetworkChangeMode;
            userSetup = state.userSetup;
            roaming = state.roaming;
            defaultDataOff = state.defaultDataOff;
        }

        /** @return true if this state is disabled or not default data */
        public boolean isDataDisabledOrNotDefault() {
            return (iconGroup == TelephonyIcons.DATA_DISABLED
                    || (iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) && userSetup;
        }

        /** @return if this state is considered to have inbound activity */
        public boolean hasActivityIn() {
            return dataConnected && !carrierNetworkChangeMode && activityIn;
        }

        /** @return if this state is considered to have outbound activity */
        public boolean hasActivityOut() {
            return dataConnected && !carrierNetworkChangeMode && activityOut;
        }

        /** @return true if this state should show a RAT icon in quick settings */
        public boolean showQuickSettingsRatIcon() {
            return dataConnected || isDataDisabledOrNotDefault();
        }

        @Override
        protected void toString(StringBuilder builder) {
            super.toString(builder);
            builder.append(',');
            builder.append("dataSim=").append(dataSim).append(',');
            builder.append("networkName=").append(networkName).append(',');
            builder.append("networkNameData=").append(networkNameData).append(',');
            builder.append("dataConnected=").append(dataConnected).append(',');
            builder.append("roaming=").append(roaming).append(',');
            builder.append("isDefault=").append(isDefault).append(',');
            builder.append("isEmergency=").append(isEmergency).append(',');
            builder.append("airplaneMode=").append(airplaneMode).append(',');
            builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode)
                    .append(',');
            builder.append("userSetup=").append(userSetup).append(',');
            builder.append("defaultDataOff=").append(defaultDataOff).append(',');
            builder.append("showQuickSettingsRatIcon=").append(showQuickSettingsRatIcon());
        }

        @Override
        public boolean equals(Object o) {
            return super.equals(o)
                    && Objects.equals(((MobileState) o).networkName, networkName)
                    && Objects.equals(((MobileState) o).networkNameData, networkNameData)
                    && ((MobileState) o).dataSim == dataSim
                    && ((MobileState) o).dataConnected == dataConnected
                    && ((MobileState) o).isEmergency == isEmergency
                    && ((MobileState) o).airplaneMode == airplaneMode
                    && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
                    && ((MobileState) o).userSetup == userSetup
                    && ((MobileState) o).isDefault == isDefault
                    && ((MobileState) o).roaming == roaming
                    && ((MobileState) o).defaultDataOff == defaultDataOff;
        }

        @Override
        public int hashCode() {
            return Objects.hash(super.hashCode(),
                    networkName,
                    networkNameData,
                    dataSim,
                    dataConnected,
                    isEmergency,
                    airplaneMode,
                    carrierNetworkChangeMode,
                    userSetup,
                    isDefault,
                    roaming,
                    defaultDataOff);
        }
    }
}
+104 −0
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.systemui.statusbar.connectivity

import android.annotation.SuppressLint
import com.android.settingslib.SignalIcon.IconGroup
import java.text.SimpleDateFormat

/**
 * Base type for various connectivity states, for use with [SignalController] and its subtypes
 */
open class ConnectivityState {
    @JvmField var connected = false
    @JvmField var enabled = false
    @JvmField var activityIn = false
    @JvmField var activityOut = false
    @JvmField var level = 0
    @JvmField var iconGroup: IconGroup? = null
    @JvmField var inetCondition = 0
    // Only for logging.
    @JvmField var rssi = 0
    // Not used for comparison, just used for logging.
    @JvmField var time: Long = 0

    override fun toString(): String {
        return if (time != 0L) {
            val builder = StringBuilder()
            toString(builder)
            builder.toString()
        } else {
            "Empty " + javaClass.simpleName
        }
    }

    protected open fun copyFrom(other: ConnectivityState) {
        connected = other.connected
        enabled = other.enabled
        activityIn = other.activityIn
        activityOut = other.activityOut
        level = other.level
        iconGroup = other.iconGroup
        inetCondition = other.inetCondition
        rssi = other.rssi
        time = other.time
    }

    protected open fun toString(builder: StringBuilder) {
        builder.append("connected=$connected,")
                .append("enabled=$enabled,")
                .append("level=$level,")
                .append("inetCondition=$inetCondition,")
                .append("iconGroup=$iconGroup,")
                .append("activityIn=$activityIn,")
                .append("activityOut=$activityOut,")
                .append("rssi=$rssi,")
                .append("lastModified=${sSDF.format(time)}")
    }

    override fun equals(other: Any?): Boolean {
        if (other == null) return false
        if (other.javaClass != javaClass) return false

        val o = other as ConnectivityState
        return o.connected == connected &&
                o.enabled == enabled &&
                o.level == level &&
                o.inetCondition == inetCondition &&
                o.iconGroup === iconGroup &&
                o.activityIn == activityIn &&
                o.activityOut == activityOut &&
                o.rssi == rssi
    }

    override fun hashCode(): Int {
        var result = connected.hashCode()
        result = 31 * result + enabled.hashCode()
        result = 31 * result + activityIn.hashCode()
        result = 31 * result + activityOut.hashCode()
        result = 31 * result + level
        result = 31 * result + (iconGroup?.hashCode() ?: 0)
        result = 31 * result + inetCondition
        result = 31 * result + rssi
        result = 31 * result + time.hashCode()
        return result
    }
}

// No locale as it's only used for logging purposes
@SuppressLint("SimpleDateFormat")
private val sSDF = SimpleDateFormat("MM-dd HH:mm:ss.SSS")
+3 −4
Original line number Diff line number Diff line
@@ -20,13 +20,12 @@ import android.net.NetworkCapabilities;

import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.State;

import java.util.BitSet;

/** */
public class EthernetSignalController extends
        SignalController<State, IconGroup> {
        SignalController<ConnectivityState, IconGroup> {

    public EthernetSignalController(Context context,
            CallbackHandler callbackHandler, NetworkControllerImpl networkController) {
@@ -66,7 +65,7 @@ public class EthernetSignalController extends
    }

    @Override
    public State cleanState() {
        return new State();
    public ConnectivityState cleanState() {
        return new ConnectivityState();
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.SignalIcon.MobileState;
import com.android.settingslib.Utils;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.MobileMappings.Config;
+132 −0
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.systemui.statusbar.connectivity

import com.android.settingslib.mobile.TelephonyIcons
import java.lang.IllegalArgumentException

/**
 * Box for all policy-related state used in [MobileSignalController]
 */
internal class MobileState(
    @JvmField var networkName: String? = null,
    @JvmField var networkNameData: String? = null,
    @JvmField var dataSim: Boolean = false,
    @JvmField var dataConnected: Boolean = false,
    @JvmField var isEmergency: Boolean = false,
    @JvmField var airplaneMode: Boolean = false,
    @JvmField var carrierNetworkChangeMode: Boolean = false,
    @JvmField var isDefault: Boolean = false,
    @JvmField var userSetup: Boolean = false,
    @JvmField var roaming: Boolean = false,
    // Tracks the on/off state of the defaultDataSubscription
    @JvmField var defaultDataOff: Boolean = false
) : ConnectivityState() {

    /** @return true if this state is disabled or not default data */
    val isDataDisabledOrNotDefault: Boolean
        get() = (iconGroup === TelephonyIcons.DATA_DISABLED
                || iconGroup === TelephonyIcons.NOT_DEFAULT_DATA) && userSetup

    /** @return if this state is considered to have inbound activity */
    fun hasActivityIn(): Boolean {
        return dataConnected && !carrierNetworkChangeMode && activityIn
    }

    /** @return if this state is considered to have outbound activity */
    fun hasActivityOut(): Boolean {
        return dataConnected && !carrierNetworkChangeMode && activityOut
    }

    /** @return true if this state should show a RAT icon in quick settings */
    fun showQuickSettingsRatIcon(): Boolean {
        return dataConnected || isDataDisabledOrNotDefault
    }

    override fun copyFrom(other: ConnectivityState) {
        val o = other as? MobileState ?: throw IllegalArgumentException(
                "MobileState can only update from another MobileState")

        super.copyFrom(o)
        networkName = o.networkName
        networkNameData = o.networkNameData
        dataSim = o.dataSim
        dataConnected = o.dataConnected
        isEmergency = o.isEmergency
        airplaneMode = o.airplaneMode
        carrierNetworkChangeMode = o.carrierNetworkChangeMode
        isDefault = o.isDefault
        userSetup = o.userSetup
        roaming = o.roaming
        defaultDataOff = o.defaultDataOff
    }

    override fun toString(builder: StringBuilder) {
        builder.append("connected=$connected,")
                .append(',')
                .append("dataSim=$dataSim,")
                .append("networkName=$networkName,")
                .append("networkNameData=$networkNameData,")
                .append("dataConnected=$dataConnected,")
                .append("roaming=$roaming,")
                .append("isDefault=$isDefault,")
                .append("isEmergency=$isEmergency,")
                .append("airplaneMode=$airplaneMode,")
                .append("carrierNetworkChangeMode=$carrierNetworkChangeMode,")
                .append("userSetup=$userSetup,")
                .append("defaultDataOff=$defaultDataOff,")
                .append("showQuickSettingsRatIcon=${showQuickSettingsRatIcon()}")
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        if (!super.equals(other)) return false

        other as MobileState

        if (networkName != other.networkName) return false
        if (networkNameData != other.networkNameData) return false
        if (dataSim != other.dataSim) return false
        if (dataConnected != other.dataConnected) return false
        if (isEmergency != other.isEmergency) return false
        if (airplaneMode != other.airplaneMode) return false
        if (carrierNetworkChangeMode != other.carrierNetworkChangeMode) return false
        if (isDefault != other.isDefault) return false
        if (userSetup != other.userSetup) return false
        if (roaming != other.roaming) return false
        if (defaultDataOff != other.defaultDataOff) return false

        return true
    }

    override fun hashCode(): Int {
        var result = super.hashCode()
        result = 31 * result + (networkName?.hashCode() ?: 0)
        result = 31 * result + (networkNameData?.hashCode() ?: 0)
        result = 31 * result + dataSim.hashCode()
        result = 31 * result + dataConnected.hashCode()
        result = 31 * result + isEmergency.hashCode()
        result = 31 * result + airplaneMode.hashCode()
        result = 31 * result + carrierNetworkChangeMode.hashCode()
        result = 31 * result + isDefault.hashCode()
        result = 31 * result + userSetup.hashCode()
        result = 31 * result + roaming.hashCode()
        result = 31 * result + defaultDataOff.hashCode()
        return result
    }
}
Loading