From 38b6999d9e7f6a1193fd3105235afa2502013740 Mon Sep 17 00:00:00 2001 From: Kazuhiro Ondo Date: Mon, 23 May 2011 14:29:41 -0500 Subject: [PATCH] Handle ProvideLocalInfo stk command. Change-Id: I4cb685f7d8e7442185e927fa0d49531b96eeab08 --- .../internal/telephony/cat/CatService.java | 17 ++- .../telephony/cat/CommandParamsFactory.java | 5 + .../internal/telephony/cat/ResponseData.java | 107 ++++++++++++++++++ 3 files changed, 127 insertions(+), 2 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/cat/CatService.java b/telephony/java/com/android/internal/telephony/cat/CatService.java index 2f3b1772b1ed4..df4735096c7e9 100644 --- a/telephony/java/com/android/internal/telephony/cat/CatService.java +++ b/telephony/java/com/android/internal/telephony/cat/CatService.java @@ -33,6 +33,7 @@ import com.android.internal.telephony.IccRecords; import android.util.Config; import java.io.ByteArrayOutputStream; +import java.util.Locale; /** * Enumeration for representing the tag value of COMPREHENSION-TLV objects. If @@ -274,8 +275,20 @@ public class CatService extends Handler implements AppInterface { sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null); break; case PROVIDE_LOCAL_INFORMATION: - sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null); - return; + ResponseData resp; + switch (cmdParams.cmdDet.commandQualifier) { + case CommandParamsFactory.DTTZ_SETTING: + resp = new DTTZResponseData(null); + sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, resp); + break; + case CommandParamsFactory.LANGUAGE_SETTING: + resp = new LanguageResponseData(Locale.getDefault().getLanguage()); + sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, resp); + break; + default: + sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null); + return; + } case LAUNCH_BROWSER: case SELECT_ITEM: case GET_INPUT: diff --git a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java index 12204a0090247..686fe4646542d 100644 --- a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java +++ b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java @@ -53,6 +53,7 @@ class CommandParamsFactory extends Handler { static final int REFRESH_UICC_RESET = 0x04; // Command Qualifier values for PLI command + static final int DTTZ_SETTING = 0x03; static final int LANGUAGE_SETTING = 0x04; static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, @@ -883,6 +884,10 @@ class CommandParamsFactory extends Handler { throws ResultException { CatLog.d(this, "process ProvideLocalInfo"); switch (cmdDet.commandQualifier) { + case DTTZ_SETTING: + CatLog.d(this, "PLI [DTTZ_SETTING]"); + mCmdParams = new CommandParams(cmdDet); + break; case LANGUAGE_SETTING: CatLog.d(this, "PLI [LANGUAGE_SETTING]"); mCmdParams = new CommandParams(cmdDet); diff --git a/telephony/java/com/android/internal/telephony/cat/ResponseData.java b/telephony/java/com/android/internal/telephony/cat/ResponseData.java index 677d66bb82655..4846a3ec0ec91 100644 --- a/telephony/java/com/android/internal/telephony/cat/ResponseData.java +++ b/telephony/java/com/android/internal/telephony/cat/ResponseData.java @@ -18,6 +18,8 @@ package com.android.internal.telephony.cat; import com.android.internal.telephony.EncodeException; import com.android.internal.telephony.GsmAlphabet; +import java.util.Calendar; +import com.android.internal.telephony.cat.AppInterface.CommandType; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; @@ -147,4 +149,109 @@ class GetInkeyInputResponseData extends ResponseData { } } +// For "PROVIDE LOCAL INFORMATION" command. +// See TS 31.111 section 6.4.15/ETSI TS 102 223 +// TS 31.124 section 27.22.4.15 for test spec +class LanguageResponseData extends ResponseData { + private String lang; + + public LanguageResponseData(String lang) { + super(); + this.lang = lang; + } + + @Override + public void format(ByteArrayOutputStream buf) { + if (buf == null) { + return; + } + + // Text string object + int tag = 0x80 | ComprehensionTlvTag.LANGUAGE.value(); + buf.write(tag); // tag + + byte[] data; + + if (lang != null && lang.length() > 0) { + data = GsmAlphabet.stringToGsm8BitPacked(lang); + } + else { + data = new byte[0]; + } + + buf.write(data.length); + + for (byte b : data) { + buf.write(b); + } + } +} + +// For "PROVIDE LOCAL INFORMATION" command. +// See TS 31.111 section 6.4.15/ETSI TS 102 223 +// TS 31.124 section 27.22.4.15 for test spec +class DTTZResponseData extends ResponseData { + private Calendar calendar; + + public DTTZResponseData(Calendar cal) { + super(); + calendar = cal; + } + + @Override + public void format(ByteArrayOutputStream buf) { + if (buf == null) { + return; + } + + // DTTZ object + int tag = 0x80 | CommandType.PROVIDE_LOCAL_INFORMATION.value(); + buf.write(tag); // tag + + byte[] data = new byte[8]; + byte btmp; // temp variable + + data[0] = 0x07; // Write length of DTTZ data + + if (calendar == null) { + 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); + + // Fill month byte + btmp = (byte) (calendar.get(java.util.Calendar.MONTH) + 1); + data[2] = (byte) (btmp / 10); + data[2] += (byte) ((btmp % 10) << 4); + + // Fill day byte + btmp = (byte) (calendar.get(java.util.Calendar.DATE)); + data[3] = (byte) (btmp / 10); + data[3] += (byte) ((btmp % 10) << 4); + + // Fill hour byte + btmp = (byte) (calendar.get(java.util.Calendar.HOUR_OF_DAY)); + data[4] = (byte) (btmp / 10); + data[4] += (byte) ((btmp % 10) << 4); + + // Fill minute byte + btmp = (byte) (calendar.get(java.util.Calendar.MINUTE)); + data[5] = (byte) (btmp / 10); + data[5] += (byte) ((btmp % 10) << 4); + + // Fill second byte + btmp = (byte) (calendar.get(java.util.Calendar.SECOND)); + data[6] = (byte) (btmp / 10); + data[6] += (byte) ((btmp % 10) << 4); + + // No time zone info + data[7] = (byte) 0xFF; + + for (byte b : data) { + buf.write(b); + } + } +}