summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author xinhe <xinhe@google.com> 2016-01-26 10:32:03 -0800
committer xinhe <xinhe@google.com> 2016-01-27 14:50:42 -0800
commit584dc6b8b9628d930de4ea3ad94894886294b855 (patch)
tree16068042a5cc5d766d4394533cf3af64c6a5d877
parent4269239f865c55266e8ef7ef01b569c7fbfc1444 (diff)
Remodel Network Selection
There are two main changes in this CL: (1) Add user selection preference support. If user explicitly chooses a network, framework will remember it and consider user has a higher preference of this network over all other visible networks. (2) Seperate user set BSSID and framework chosen BSSID. The BSSID under WifiConfiguration is set by user and is not allowed to be overrided. The BSSID under Network selection status is the best BSSID chosen by the framework to associate with. BUG=26012244 BUG=26721725 Change-Id: Iece91d20b139ef1c6aec05828c734d1706d81007
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java211
1 files changed, 172 insertions, 39 deletions
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 8838f3fe2871..c6354bd6a5a7 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -703,24 +703,6 @@ public class WifiConfiguration implements Parcelable {
*/
public int numUserTriggeredJoinAttempts;
- /**
- * @hide
- * Connect choices
- *
- * remember the keys identifying the known WifiConfiguration over which this configuration
- * was preferred by user or a "WiFi Network Management app", that is,
- * a WifiManager.CONNECT_NETWORK or SELECT_NETWORK was received while this configuration
- * was visible to the user:
- * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
- *
- * The integer represents the configuration's RSSI at that time (useful?)
- *
- * The overall auto-join algorithm make use of past connect choice so as to sort configuration,
- * the exact algorithm still fluctuating as of 5/7/2014
- *
- */
- public HashMap<String, Integer> connectChoices;
-
/** @hide
* Boost given to RSSI on a home network for the purpose of calculating the score
* This adds stickiness to home networks, as defined by:
@@ -830,6 +812,16 @@ public class WifiConfiguration implements Parcelable {
*/
public static final long INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP = -1L;
+ /**
+ * This constant indicates the current configuration has connect choice set
+ */
+ private static final int CONNECT_CHOICE_EXISTS = 1;
+
+ /**
+ * This constant indicates the current configuration does not have connect choice set
+ */
+ private static final int CONNECT_CHOICE_NOT_EXISTS = -1;
+
// fields for QualityNetwork Selection
/**
* Network selection status, should be in one of three status: enable, temporaily disabled
@@ -853,7 +845,128 @@ public class WifiConfiguration implements Parcelable {
private int[] mNetworkSeclectionDisableCounter = new int[NETWORK_SELECTION_DISABLED_MAX];
/**
- * return current Quality network selection status in String (for debug purpose)
+ * Connect Choice over this configuration
+ *
+ * When current wifi configuration is visible to the user but user explicitly choose to
+ * connect to another network X, the another networks X's configure key will be stored here.
+ * We will consider user has a preference of X over this network. And in the future,
+ * network selection will always give X a higher preference over this configuration.
+ * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
+ */
+ private String mConnectChoice;
+
+ /**
+ * The system timestamp when we records the connectChoice. This value is obtained from
+ * System.currentTimeMillis
+ */
+ private long mConnectChoiceTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
+
+ /**
+ * Used to cache the temporary candidate during the network selection procedure. It will be
+ * kept updating once a new scan result has a higher score than current one
+ */
+ private ScanResult mCandidate;
+
+ /**
+ * Used to cache the score of the current temporary candidate during the network
+ * selection procedure.
+ */
+ private int mCandidateScore;
+
+ /**
+ * Indicate whether this network is visible in latest Qualified Network Selection. This
+ * means there is scan result found related to this Configuration and meet the minimum
+ * requirement. The saved network need not join latest Qualified Network Selection. For
+ * example, it is disabled. True means network is visible in latest Qualified Network
+ * Selection and false means network is invisible
+ */
+ private boolean mSeenInLastQualifiedNetworkSelection;
+
+ /**
+ * set whether this network is visible in latest Qualified Network Selection
+ * @param seen value set to candidate
+ */
+ public void setSeenInLastQualifiedNetworkSelection(boolean seen) {
+ mSeenInLastQualifiedNetworkSelection = seen;
+ }
+
+ /**
+ * get whether this network is visible in latest Qualified Network Selection
+ * @return returns true -- network is visible in latest Qualified Network Selection
+ * false -- network is invisible in latest Qualified Network Selection
+ */
+ public boolean getSeenInLastQualifiedNetworkSelection() {
+ return mSeenInLastQualifiedNetworkSelection;
+ }
+ /**
+ * set the temporary candidate of current network selection procedure
+ * @param scanCandidate {@link ScanResult} the candidate set to mCandidate
+ */
+ public void setCandidate(ScanResult scanCandidate) {
+ mCandidate = scanCandidate;
+ }
+
+ /**
+ * get the temporary candidate of current network selection procedure
+ * @return returns {@link ScanResult} temporary candidate of current network selection
+ * procedure
+ */
+ public ScanResult getCandidate() {
+ return mCandidate;
+ }
+
+ /**
+ * set the score of the temporary candidate of current network selection procedure
+ * @param score value set to mCandidateScore
+ */
+ public void setCandidateScore(int score) {
+ mCandidateScore = score;
+ }
+
+ /**
+ * get the score of the temporary candidate of current network selection procedure
+ * @return returns score of the temporary candidate of current network selection procedure
+ */
+ public int getCandidateScore() {
+ return mCandidateScore;
+ }
+
+ /**
+ * get user preferred choice over this configuration
+ *@return returns configKey of user preferred choice over this configuration
+ */
+ public String getConnectChoice() {
+ return mConnectChoice;
+ }
+
+ /**
+ * set user preferred choice over this configuration
+ * @param newConnectChoice, the configKey of user preferred choice over this configuration
+ */
+ public void setConnectChoice(String newConnectChoice) {
+ mConnectChoice = newConnectChoice;
+ }
+
+ /**
+ * get the timeStamp when user select a choice over this configuration
+ * @return returns when current connectChoice is set (time from System.currentTimeMillis)
+ */
+ public long getConnectChoiceTimestamp() {
+ return mConnectChoiceTimestamp;
+ }
+
+ /**
+ * set the timeStamp when user select a choice over this configuration
+ * @param timeStamp, the timestamp set to connectChoiceTimestamp, expected timestamp should
+ * be obtained from System.currentTimeMillis
+ */
+ public void setConnectChoiceTimestamp(long timeStamp) {
+ mConnectChoiceTimestamp = timeStamp;
+ }
+
+ /**
+ * get current Quality network selection status
+ * @return returns current Quality network selection status in String (for debug purpose)
*/
public String getNetworkStatusString() {
return QUALITY_NETWORK_SELECTION_STATUS[mStatus];
@@ -873,6 +986,7 @@ public class WifiConfiguration implements Parcelable {
}
}
/**
+ * get current network disable reason
* @return current network disable reason in String (for debug purpose)
*/
public String getNetworkDisableReasonString() {
@@ -881,6 +995,7 @@ public class WifiConfiguration implements Parcelable {
/**
* get current network network selection status
+ * @return return current network network selection status
*/
public int getNetworkSelectionStatus() {
return mStatus;
@@ -900,12 +1015,14 @@ public class WifiConfiguration implements Parcelable {
}
/**
- * return whether current network is permanently disabled
+ * @return returns whether current network is permanently disabled
*/
public boolean isNetworkPermanentlyDisabled() {
return mStatus == NETWORK_SELECTION_PERMANENTLY_DISABLED;
}
+
/**
+ * set current networ work selection status
* @param status network selection status to set
*/
public void setNetworkSelectionStatus(int status) {
@@ -913,14 +1030,16 @@ public class WifiConfiguration implements Parcelable {
mStatus = status;
}
}
+
/**
- * @return current network's disable reason
+ * @return returns current network's disable reason
*/
public int getNetworkSelectionDisableReason() {
return mNetworkSelectionDisableReason;
}
/**
+ * set Network disable reason
* @param reason Network disable reason
*/
public void setNetworkSelectionDisableReason(int reason) {
@@ -930,12 +1049,17 @@ public class WifiConfiguration implements Parcelable {
throw new IllegalArgumentException("Illegal reason value: " + reason);
}
}
+
/**
- * @param reason whether current network is disabled by this reason
+ * check whether network is disabled by this reason
+ * @param reason a specific disable reason
+ * @return true -- network is disabled for this reason
+ * false -- network is not disabled for this reason
*/
public boolean isDisabledByReason(int reason) {
return mNetworkSelectionDisableReason == reason;
}
+
/**
* @param timeStamp Set when current network is disabled in millisecond since January 1,
* 1970 00:00:00.0 UTC
@@ -945,7 +1069,7 @@ public class WifiConfiguration implements Parcelable {
}
/**
- * @return Get when current network is disabled in millisecond since January 1,
+ * @return returns when current network is disabled in millisecond since January 1,
* 1970 00:00:00.0 UTC
*/
public long getDisableTime() {
@@ -953,6 +1077,7 @@ public class WifiConfiguration implements Parcelable {
}
/**
+ * get the disable counter of a specific reason
* @param reason specific failure reason
* @exception throw IllegalArgumentException for illegal input
* @return counter number for specific error reason.
@@ -991,6 +1116,7 @@ public class WifiConfiguration implements Parcelable {
throw new IllegalArgumentException("Illegal reason value: " + reason);
}
}
+
/**
* clear the counter of a specific failure reason
* @hide
@@ -1004,6 +1130,7 @@ public class WifiConfiguration implements Parcelable {
throw new IllegalArgumentException("Illegal reason value: " + reason);
}
}
+
/**
* clear all the failure reason counters
*/
@@ -1042,6 +1169,8 @@ public class WifiConfiguration implements Parcelable {
}
mTemporarilyDisabledTimestamp = source.mTemporarilyDisabledTimestamp;
mNetworkSelectionBSSID = source.mNetworkSelectionBSSID;
+ setConnectChoice(source.getConnectChoice());
+ setConnectChoiceTimestamp(source.getConnectChoiceTimestamp());
}
public void writeToParcel(Parcel dest) {
@@ -1053,6 +1182,13 @@ public class WifiConfiguration implements Parcelable {
}
dest.writeLong(getDisableTime());
dest.writeString(getNetworkSelectionBSSID());
+ if (getConnectChoice() != null) {
+ dest.writeInt(CONNECT_CHOICE_EXISTS);
+ dest.writeString(getConnectChoice());
+ dest.writeLong(getConnectChoiceTimestamp());
+ } else {
+ dest.writeInt(CONNECT_CHOICE_NOT_EXISTS);
+ }
}
public void readFromParcel(Parcel in) {
@@ -1064,6 +1200,13 @@ public class WifiConfiguration implements Parcelable {
}
setDisableTime(in.readLong());
setNetworkSelectionBSSID(in.readString());
+ if (in.readInt() == CONNECT_CHOICE_EXISTS) {
+ setConnectChoice(in.readString());
+ setConnectChoiceTimestamp(in.readLong());
+ } else {
+ setConnectChoice(null);
+ setConnectChoiceTimestamp(INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
+ }
}
}
@@ -1183,7 +1326,11 @@ public class WifiConfiguration implements Parcelable {
}
}
}
-
+ if (mNetworkSelectionStatus.getConnectChoice() != null) {
+ sbuf.append(" connect choice: ").append(mNetworkSelectionStatus.getConnectChoice());
+ sbuf.append(" connect choice set time: ").append(mNetworkSelectionStatus
+ .getConnectChoiceTimestamp());
+ }
if (this.numAssociation > 0) {
sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
@@ -1335,16 +1482,7 @@ public class WifiConfiguration implements Parcelable {
sbuf.append('\n');
}
}
- if (this.connectChoices != null) {
- for(String key : this.connectChoices.keySet()) {
- Integer choice = this.connectChoices.get(key);
- if (choice != null) {
- sbuf.append(" choice: ").append(key);
- sbuf.append(" = ").append(choice);
- sbuf.append('\n');
- }
- }
- }
+
sbuf.append("triggeredLow: ").append(this.numUserTriggeredWifiDisableLowRSSI);
sbuf.append(" triggeredBad: ").append(this.numUserTriggeredWifiDisableBadRSSI);
sbuf.append(" triggeredNotHigh: ").append(this.numUserTriggeredWifiDisableNotHighRSSI);
@@ -1631,11 +1769,6 @@ public class WifiConfiguration implements Parcelable {
mIpConfiguration = new IpConfiguration(source.mIpConfiguration);
- if ((source.connectChoices != null) && (source.connectChoices.size() > 0)) {
- connectChoices = new HashMap<String, Integer>();
- connectChoices.putAll(source.connectChoices);
- }
-
if ((source.linkedConfigurations != null)
&& (source.linkedConfigurations.size() > 0)) {
linkedConfigurations = new HashMap<String, Integer>();