Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f976cf25 authored by Naveen Kalla's avatar Naveen Kalla Committed by Wink Saville
Browse files

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
parent df7332aa
Loading
Loading
Loading
Loading
+45 −21
Original line number Original line Diff line number Diff line
@@ -19,6 +19,10 @@ package com.android.internal.telephony.cat;
import com.android.internal.telephony.EncodeException;
import com.android.internal.telephony.EncodeException;
import com.android.internal.telephony.GsmAlphabet;
import com.android.internal.telephony.GsmAlphabet;
import java.util.Calendar;
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 com.android.internal.telephony.cat.AppInterface.CommandType;


import java.io.ByteArrayOutputStream;
import java.io.ByteArrayOutputStream;
@@ -209,7 +213,6 @@ class DTTZResponseData extends ResponseData {
        buf.write(tag); // tag
        buf.write(tag); // tag


        byte[] data = new byte[8];
        byte[] data = new byte[8];
        byte btmp; // temp variable


        data[0] = 0x07; // Write length of DTTZ data
        data[0] = 0x07; // Write length of DTTZ data


@@ -217,41 +220,62 @@ class DTTZResponseData extends ResponseData {
            calendar = Calendar.getInstance();
            calendar = Calendar.getInstance();
        }
        }
        // Fill year byte
        // Fill year byte
        btmp = (byte) (calendar.get(java.util.Calendar.YEAR) % 100);
        data[1] = byteToBCD(calendar.get(java.util.Calendar.YEAR) % 100);
        data[1] = (byte) (btmp / 10);
        data[1] += (byte) ((btmp % 10) << 4);


        // Fill month byte
        // Fill month byte
        btmp = (byte) (calendar.get(java.util.Calendar.MONTH) + 1);
        data[2] = byteToBCD(calendar.get(java.util.Calendar.MONTH) + 1);
        data[2] = (byte) (btmp / 10);
        data[2] += (byte) ((btmp % 10) << 4);


        // Fill day byte
        // Fill day byte
        btmp = (byte) (calendar.get(java.util.Calendar.DATE));
        data[3] = byteToBCD(calendar.get(java.util.Calendar.DATE));
        data[3] = (byte) (btmp / 10);
        data[3] += (byte) ((btmp % 10) << 4);


        // Fill hour byte
        // Fill hour byte
        btmp = (byte) (calendar.get(java.util.Calendar.HOUR_OF_DAY));
        data[4] = byteToBCD(calendar.get(java.util.Calendar.HOUR_OF_DAY));
        data[4] = (byte) (btmp / 10);
        data[4] += (byte) ((btmp % 10) << 4);


        // Fill minute byte
        // Fill minute byte
        btmp = (byte) (calendar.get(java.util.Calendar.MINUTE));
        data[5] = byteToBCD(calendar.get(java.util.Calendar.MINUTE));
        data[5] = (byte) (btmp / 10);
        data[5] += (byte) ((btmp % 10) << 4);


        // Fill second byte
        // Fill second byte
        btmp = (byte) (calendar.get(java.util.Calendar.SECOND));
        data[6] = byteToBCD(calendar.get(java.util.Calendar.SECOND));
        data[6] = (byte) (btmp / 10);
        data[6] += (byte) ((btmp % 10) << 4);


        // No time zone info
        String tz = SystemProperties.get("persist.sys.timezone", "");
        data[7] = (byte) 0xFF;
        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) {
        for (byte b : data) {
            buf.write(b);
            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;
    }

}
}