[MS06] Add carrier template fields into cloud backup/restore

NetworkTemplate with MATCH_CARRIER can be created in NPMS,
and can be backup by SettingsBackupAgent. However, since
the meteredness is not stored in the backup. After incorrectly
deducing from match rule, meteredness always becomes
METERED_ALL after restoring from backup.

This change also adds debug log if any non-persistable template
is being backed up.

Test: TH, dedicated test is included in the follow-up CL.
Bug: 204830222

Change-Id: I865b1d6e571ed998a75b776f01afc7c2534af2dc
This commit is contained in:
Junyu Lai
2021-11-15 09:20:37 +00:00
parent ba9fa56fc2
commit 7d7e1ca87b

View File

@@ -69,10 +69,18 @@ import java.util.Objects;
public class NetworkTemplate implements Parcelable { public class NetworkTemplate implements Parcelable {
private static final String TAG = "NetworkTemplate"; private static final String TAG = "NetworkTemplate";
/**
* Initial Version of the backup serializer.
*/
public static final int BACKUP_VERSION_1_INIT = 1;
/**
* Version of the backup serializer that added carrier template support.
*/
public static final int BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE = 2;
/** /**
* Current Version of the Backup Serializer. * Current Version of the Backup Serializer.
*/ */
private static final int BACKUP_VERSION = 1; private static final int BACKUP_VERSION = BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE;
public static final int MATCH_MOBILE = 1; public static final int MATCH_MOBILE = 1;
public static final int MATCH_WIFI = 4; public static final int MATCH_WIFI = 4;
@@ -285,6 +293,10 @@ public class NetworkTemplate implements Parcelable {
private final int mRoaming; private final int mRoaming;
private final int mDefaultNetwork; private final int mDefaultNetwork;
private final int mSubType; private final int mSubType;
/**
* The subscriber Id match rule defines how the template should match networks with
* specific subscriberId(s). See NetworkTemplate#SUBSCRIBER_ID_MATCH_RULE_* for more detail.
*/
private final int mSubscriberIdMatchRule; private final int mSubscriberIdMatchRule;
// Bitfield containing OEM network properties{@code NetworkIdentity#OEM_*}. // Bitfield containing OEM network properties{@code NetworkIdentity#OEM_*}.
@@ -348,7 +360,7 @@ public class NetworkTemplate implements Parcelable {
mSubscriberIdMatchRule = subscriberIdMatchRule; mSubscriberIdMatchRule = subscriberIdMatchRule;
checkValidSubscriberIdMatchRule(); checkValidSubscriberIdMatchRule();
if (!isKnownMatchRule(matchRule)) { if (!isKnownMatchRule(matchRule)) {
Log.e(TAG, "Unknown network template rule " + matchRule throw new IllegalArgumentException("Unknown network template rule " + matchRule
+ " will not match any identity."); + " will not match any identity.");
} }
} }
@@ -842,11 +854,17 @@ public class NetworkTemplate implements Parcelable {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos); DataOutputStream out = new DataOutputStream(baos);
if (!isPersistable()) {
Log.wtf(TAG, "Trying to backup non-persistable template: " + this);
}
out.writeInt(BACKUP_VERSION); out.writeInt(BACKUP_VERSION);
out.writeInt(mMatchRule); out.writeInt(mMatchRule);
BackupUtils.writeString(out, mSubscriberId); BackupUtils.writeString(out, mSubscriberId);
BackupUtils.writeString(out, mNetworkId); BackupUtils.writeString(out, mNetworkId);
out.writeInt(mMetered);
out.writeInt(mSubscriberIdMatchRule);
return baos.toByteArray(); return baos.toByteArray();
} }
@@ -854,7 +872,7 @@ public class NetworkTemplate implements Parcelable {
public static NetworkTemplate getNetworkTemplateFromBackup(DataInputStream in) public static NetworkTemplate getNetworkTemplateFromBackup(DataInputStream in)
throws IOException, BackupUtils.BadVersionException { throws IOException, BackupUtils.BadVersionException {
int version = in.readInt(); int version = in.readInt();
if (version < 1 || version > BACKUP_VERSION) { if (version < BACKUP_VERSION_1_INIT || version > BACKUP_VERSION) {
throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version"); throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version");
} }
@@ -862,11 +880,27 @@ public class NetworkTemplate implements Parcelable {
String subscriberId = BackupUtils.readString(in); String subscriberId = BackupUtils.readString(in);
String networkId = BackupUtils.readString(in); String networkId = BackupUtils.readString(in);
if (!isKnownMatchRule(matchRule)) { final int metered;
throw new BackupUtils.BadVersionException( final int subscriberIdMatchRule;
"Restored network template contains unknown match rule " + matchRule); if (version >= BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE) {
metered = in.readInt();
subscriberIdMatchRule = in.readInt();
} else {
// For backward compatibility, fill the missing filters from match rules.
metered = (matchRule == MATCH_MOBILE || matchRule == MATCH_MOBILE_WILDCARD
|| matchRule == MATCH_CARRIER) ? METERED_YES : METERED_ALL;
subscriberIdMatchRule = SUBSCRIBER_ID_MATCH_RULE_EXACT;
} }
return new NetworkTemplate(matchRule, subscriberId, networkId); try {
return new NetworkTemplate(matchRule,
subscriberId, new String[] { subscriberId },
networkId, metered, NetworkStats.ROAMING_ALL,
NetworkStats.DEFAULT_NETWORK_ALL, NetworkTemplate.NETWORK_TYPE_ALL,
NetworkTemplate.OEM_MANAGED_ALL, subscriberIdMatchRule);
} catch (IllegalArgumentException e) {
throw new BackupUtils.BadVersionException(
"Restored network template contains unknown match rule " + matchRule, e);
}
} }
} }