1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settingslib; 17 18 import java.text.SimpleDateFormat; 19 import java.util.Objects; 20 21 /** 22 * Icons and states for SysUI and Settings. 23 */ 24 public class SignalIcon { 25 26 /** 27 * Holds icons for a given state. Arrays are generally indexed as inet 28 * state (full connectivity or not) first, and second dimension as 29 * signal strength. 30 */ 31 public static class IconGroup { 32 public final int[][] sbIcons; 33 public final int[][] qsIcons; 34 public final int[] contentDesc; 35 public final int sbNullState; 36 public final int qsNullState; 37 public final int sbDiscState; 38 public final int qsDiscState; 39 public final int discContentDesc; 40 // For logging. 41 public final String name; 42 IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, int discContentDesc)43 public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, 44 int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, 45 int discContentDesc) { 46 this.name = name; 47 this.sbIcons = sbIcons; 48 this.qsIcons = qsIcons; 49 this.contentDesc = contentDesc; 50 this.sbNullState = sbNullState; 51 this.qsNullState = qsNullState; 52 this.sbDiscState = sbDiscState; 53 this.qsDiscState = qsDiscState; 54 this.discContentDesc = discContentDesc; 55 } 56 57 @Override toString()58 public String toString() { 59 return "IconGroup(" + name + ")"; 60 } 61 } 62 63 /** 64 * Holds states for SysUI. 65 */ 66 public static class State { 67 // No locale as it's only used for logging purposes 68 private static SimpleDateFormat sSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); 69 public boolean connected; 70 public boolean enabled; 71 public boolean activityIn; 72 public boolean activityOut; 73 public int level; 74 public IconGroup iconGroup; 75 public int inetCondition; 76 public int rssi; // Only for logging. 77 78 // Not used for comparison, just used for logging. 79 public long time; 80 81 /** 82 * Generates a copy of the source state. 83 */ copyFrom(State state)84 public void copyFrom(State state) { 85 connected = state.connected; 86 enabled = state.enabled; 87 level = state.level; 88 iconGroup = state.iconGroup; 89 inetCondition = state.inetCondition; 90 activityIn = state.activityIn; 91 activityOut = state.activityOut; 92 rssi = state.rssi; 93 time = state.time; 94 } 95 96 @Override toString()97 public String toString() { 98 if (time != 0) { 99 StringBuilder builder = new StringBuilder(); 100 toString(builder); 101 return builder.toString(); 102 } else { 103 return "Empty " + getClass().getSimpleName(); 104 } 105 } 106 toString(StringBuilder builder)107 protected void toString(StringBuilder builder) { 108 builder.append("connected=").append(connected).append(',') 109 .append("enabled=").append(enabled).append(',') 110 .append("level=").append(level).append(',') 111 .append("inetCondition=").append(inetCondition).append(',') 112 .append("iconGroup=").append(iconGroup).append(',') 113 .append("activityIn=").append(activityIn).append(',') 114 .append("activityOut=").append(activityOut).append(',') 115 .append("rssi=").append(rssi).append(',') 116 .append("lastModified=").append(sSDF.format(time)); 117 } 118 119 @Override equals(Object o)120 public boolean equals(Object o) { 121 if (!o.getClass().equals(getClass())) { 122 return false; 123 } 124 State other = (State) o; 125 return other.connected == connected 126 && other.enabled == enabled 127 && other.level == level 128 && other.inetCondition == inetCondition 129 && other.iconGroup == iconGroup 130 && other.activityIn == activityIn 131 && other.activityOut == activityOut 132 && other.rssi == rssi; 133 } 134 } 135 136 /** 137 * Holds icons for a given MobileState. 138 */ 139 public static class MobileIconGroup extends IconGroup { 140 public final int dataContentDescription; // mContentDescriptionDataType 141 public final int dataType; 142 public final boolean isWide; 143 public final int qsDataType; 144 MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, int discContentDesc, int dataContentDesc, int dataType, boolean isWide)145 public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, 146 int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, 147 int discContentDesc, int dataContentDesc, int dataType, boolean isWide) { 148 super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, 149 qsDiscState, discContentDesc); 150 this.dataContentDescription = dataContentDesc; 151 this.dataType = dataType; 152 this.isWide = isWide; 153 this.qsDataType = dataType; // TODO: remove this field 154 } 155 } 156 157 /** 158 * Holds mobile states for SysUI. 159 */ 160 public static class MobileState extends State { 161 public String networkName; 162 public String networkNameData; 163 public boolean dataSim; 164 public boolean dataConnected; 165 public boolean isEmergency; 166 public boolean airplaneMode; 167 public boolean carrierNetworkChangeMode; 168 public boolean isDefault; 169 public boolean userSetup; 170 public boolean roaming; 171 public boolean defaultDataOff; // Tracks the on/off state of the defaultDataSubscription 172 173 @Override copyFrom(State s)174 public void copyFrom(State s) { 175 super.copyFrom(s); 176 MobileState state = (MobileState) s; 177 dataSim = state.dataSim; 178 networkName = state.networkName; 179 networkNameData = state.networkNameData; 180 dataConnected = state.dataConnected; 181 isDefault = state.isDefault; 182 isEmergency = state.isEmergency; 183 airplaneMode = state.airplaneMode; 184 carrierNetworkChangeMode = state.carrierNetworkChangeMode; 185 userSetup = state.userSetup; 186 roaming = state.roaming; 187 defaultDataOff = state.defaultDataOff; 188 } 189 190 @Override toString(StringBuilder builder)191 protected void toString(StringBuilder builder) { 192 super.toString(builder); 193 builder.append(','); 194 builder.append("dataSim=").append(dataSim).append(','); 195 builder.append("networkName=").append(networkName).append(','); 196 builder.append("networkNameData=").append(networkNameData).append(','); 197 builder.append("dataConnected=").append(dataConnected).append(','); 198 builder.append("roaming=").append(roaming).append(','); 199 builder.append("isDefault=").append(isDefault).append(','); 200 builder.append("isEmergency=").append(isEmergency).append(','); 201 builder.append("airplaneMode=").append(airplaneMode).append(','); 202 builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) 203 .append(','); 204 builder.append("userSetup=").append(userSetup).append(','); 205 builder.append("defaultDataOff=").append(defaultDataOff); 206 } 207 208 @Override equals(Object o)209 public boolean equals(Object o) { 210 return super.equals(o) 211 && Objects.equals(((MobileState) o).networkName, networkName) 212 && Objects.equals(((MobileState) o).networkNameData, networkNameData) 213 && ((MobileState) o).dataSim == dataSim 214 && ((MobileState) o).dataConnected == dataConnected 215 && ((MobileState) o).isEmergency == isEmergency 216 && ((MobileState) o).airplaneMode == airplaneMode 217 && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode 218 && ((MobileState) o).userSetup == userSetup 219 && ((MobileState) o).isDefault == isDefault 220 && ((MobileState) o).roaming == roaming 221 && ((MobileState) o).defaultDataOff == defaultDataOff; 222 } 223 } 224 } 225