blob: 6aaadf56bff82476e8900711ddef59e5d46635fc [file] [log] [blame]
/*
* Copyright (C) 2017 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.internal.telephony.dataconnection;
import java.util.HashSet;
/**
* The class to describe the reasons of allowing or disallowing to establish a data connection.
*/
public class DataConnectionReasons {
private HashSet<DataDisallowedReasonType> mDataDisallowedReasonSet = new HashSet<>();
private DataAllowedReasonType mDataAllowedReason = DataAllowedReasonType.NONE;
public DataConnectionReasons() {}
void add(DataDisallowedReasonType reason) {
// Adding a disallowed reason will clean up the allowed reason because they are
// mutual exclusive.
mDataAllowedReason = DataAllowedReasonType.NONE;
mDataDisallowedReasonSet.add(reason);
}
void add(DataAllowedReasonType reason) {
// Adding an allowed reason will clean up the disallowed reasons because they are
// mutual exclusive.
mDataDisallowedReasonSet.clear();
// Only higher priority allowed reason can overwrite the old one. See
// DataAllowedReasonType for the oder.
if (reason.ordinal() > mDataAllowedReason.ordinal()) {
mDataAllowedReason = reason;
}
}
@Override
public String toString() {
StringBuilder reasonStr = new StringBuilder();
if (mDataDisallowedReasonSet.size() > 0) {
reasonStr.append("Data disallowed, reasons:");
for (DataDisallowedReasonType reason : mDataDisallowedReasonSet) {
reasonStr.append(" ").append(reason);
}
} else {
reasonStr.append("Data allowed, reason:");
reasonStr.append(" ").append(mDataAllowedReason);
}
return reasonStr.toString();
}
void copyFrom(DataConnectionReasons reasons) {
this.mDataDisallowedReasonSet = reasons.mDataDisallowedReasonSet;
this.mDataAllowedReason = reasons.mDataAllowedReason;
}
boolean allowed() {
return mDataDisallowedReasonSet.size() == 0;
}
boolean contains(DataDisallowedReasonType reason) {
return mDataDisallowedReasonSet.contains(reason);
}
/**
* Check if only one disallowed reason prevent data connection.
*
* @param reason The given reason to check
* @return True if the given reason is the only one that prevents data connection
*/
public boolean containsOnly(DataDisallowedReasonType reason) {
return mDataDisallowedReasonSet.size() == 1 && contains(reason);
}
boolean contains(DataAllowedReasonType reason) {
return reason == mDataAllowedReason;
}
boolean containsHardDisallowedReasons() {
for (DataDisallowedReasonType reason : mDataDisallowedReasonSet) {
if (reason.isHardReason()) {
return true;
}
}
return false;
}
// Disallowed reasons. There could be multiple reasons if data connection is not allowed.
public enum DataDisallowedReasonType {
// Soft failure reasons. Normally the reasons from users or policy settings.
DATA_DISABLED(false), // Data is disabled by the user or policy.
ROAMING_DISABLED(false), // Data roaming is disabled by the user.
DEFAULT_DATA_UNSELECTED(false), // Default data not selected.
// Belows are all hard failure reasons.
NOT_ATTACHED(true),
SIM_NOT_READY(true),
INVALID_PHONE_STATE(true),
CONCURRENT_VOICE_DATA_NOT_ALLOWED(true),
PS_RESTRICTED(true),
UNDESIRED_POWER_STATE(true),
INTERNAL_DATA_DISABLED(true),
RADIO_DISABLED_BY_CARRIER(true),
APN_NOT_CONNECTABLE(true),
ON_IWLAN(true),
IN_ECBM(true),
ON_OTHER_TRANSPORT(true); // When data retry occurs, the given APN type's preferred
// transport might be already changed. In this case we
// should disallow data retry.
private boolean mIsHardReason;
boolean isHardReason() {
return mIsHardReason;
}
DataDisallowedReasonType(boolean isHardReason) {
mIsHardReason = isHardReason;
}
}
// Data allowed reasons. There will be only one reason if data is allowed.
enum DataAllowedReasonType {
// Note that unlike disallowed reasons, we only have one allowed reason every time
// when we check data is allowed or not. The order of these allowed reasons is very
// important. The lower ones take precedence over the upper ones.
NONE,
NORMAL,
UNMETERED_APN,
RESTRICTED_REQUEST,
EMERGENCY_APN,
}
}