Add timezone to the terminal response for provide local information command

If timezone is sent in the NITZ message it needs to be part of the
terminal response sent to the provide local information command for
Date and time Setting. This is as per TS 31.111 section 6.4.15/ETSI TS 102 223
and 3GPP spec 22.042.

Change-Id: I3516911223bd5655dbe8189bba307f0765c63fa1
This commit is contained in:
Naveen Kalla
2011-06-07 11:29:27 -07:00
committed by Wink Saville
parent df7332aad5
commit f976cf25f9

View File

@@ -19,6 +19,10 @@ package com.android.internal.telephony.cat;
import com.android.internal.telephony.EncodeException;
import com.android.internal.telephony.GsmAlphabet;
import java.util.Calendar;
import java.util.TimeZone;
import android.os.SystemProperties;
import android.text.TextUtils;
import com.android.internal.telephony.cat.AppInterface.CommandType;
import java.io.ByteArrayOutputStream;
@@ -209,7 +213,6 @@ class DTTZResponseData extends ResponseData {
buf.write(tag); // tag
byte[] data = new byte[8];
byte btmp; // temp variable
data[0] = 0x07; // Write length of DTTZ data
@@ -217,41 +220,62 @@ class DTTZResponseData extends ResponseData {
calendar = Calendar.getInstance();
}
// Fill year byte
btmp = (byte) (calendar.get(java.util.Calendar.YEAR) % 100);
data[1] = (byte) (btmp / 10);
data[1] += (byte) ((btmp % 10) << 4);
data[1] = byteToBCD(calendar.get(java.util.Calendar.YEAR) % 100);
// Fill month byte
btmp = (byte) (calendar.get(java.util.Calendar.MONTH) + 1);
data[2] = (byte) (btmp / 10);
data[2] += (byte) ((btmp % 10) << 4);
data[2] = byteToBCD(calendar.get(java.util.Calendar.MONTH) + 1);
// Fill day byte
btmp = (byte) (calendar.get(java.util.Calendar.DATE));
data[3] = (byte) (btmp / 10);
data[3] += (byte) ((btmp % 10) << 4);
data[3] = byteToBCD(calendar.get(java.util.Calendar.DATE));
// Fill hour byte
btmp = (byte) (calendar.get(java.util.Calendar.HOUR_OF_DAY));
data[4] = (byte) (btmp / 10);
data[4] += (byte) ((btmp % 10) << 4);
data[4] = byteToBCD(calendar.get(java.util.Calendar.HOUR_OF_DAY));
// Fill minute byte
btmp = (byte) (calendar.get(java.util.Calendar.MINUTE));
data[5] = (byte) (btmp / 10);
data[5] += (byte) ((btmp % 10) << 4);
data[5] = byteToBCD(calendar.get(java.util.Calendar.MINUTE));
// Fill second byte
btmp = (byte) (calendar.get(java.util.Calendar.SECOND));
data[6] = (byte) (btmp / 10);
data[6] += (byte) ((btmp % 10) << 4);
data[6] = byteToBCD(calendar.get(java.util.Calendar.SECOND));
// No time zone info
data[7] = (byte) 0xFF;
String tz = SystemProperties.get("persist.sys.timezone", "");
if (TextUtils.isEmpty(tz)) {
data[7] = (byte) 0xFF; // set FF in terminal response
} else {
TimeZone zone = TimeZone.getTimeZone(tz);
int zoneOffset = zone.getRawOffset() + zone.getDSTSavings();
data[7] = getTZOffSetByte(zoneOffset);
}
for (byte b : data) {
buf.write(b);
}
}
private byte byteToBCD(int value) {
if (value < 0 && value > 99) {
CatLog.d(this, "Err: byteToBCD conversion Value is " + value +
" Value has to be between 0 and 99");
return 0;
}
return (byte) ((value / 10) | ((value % 10) << 4));
}
private byte getTZOffSetByte(long offSetVal) {
boolean isNegative = (offSetVal < 0);
/*
* The 'offSetVal' is in milliseconds. Convert it to hours and compute
* offset While sending T.R to UICC, offset is expressed is 'quarters of
* hours'
*/
long tzOffset = offSetVal / (15 * 60 * 1000);
tzOffset = (isNegative ? -1 : 1) * tzOffset;
byte bcdVal = byteToBCD((int) tzOffset);
// For negative offsets, put '1' in the msb
return isNegative ? (bcdVal |= 0x08) : bcdVal;
}
}