Home | History | Annotate | Download | only in map
      1 /*
      2 * Copyright (C) 2013 Samsung System LSI
      3 * Licensed under the Apache License, Version 2.0 (the "License");
      4 * you may not use this file except in compliance with the License.
      5 * You may obtain a copy of the License at
      6 *
      7 *      http://www.apache.org/licenses/LICENSE-2.0
      8 *
      9 * Unless required by applicable law or agreed to in writing, software
     10 * distributed under the License is distributed on an "AS IS" BASIS,
     11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 * See the License for the specific language governing permissions and
     13 * limitations under the License.
     14 */
     15 package com.android.bluetooth.map;
     16 
     17 import android.util.Log;
     18 
     19 
     20 /**
     21  * Various utility methods and generic defines that can be used throughout MAPS
     22  */
     23 public class BluetoothMapUtils {
     24 
     25     private static final String TAG = "MapUtils";
     26     private static final boolean D = BluetoothMapService.DEBUG;
     27     private static final boolean V = BluetoothMapService.VERBOSE;
     28     /* We use the upper 4 bits for the type mask.
     29      * TODO: When more types are needed, consider just using a number
     30      *       in stead of a bit to indicate the message type. Then 4
     31      *       bit can be use for 16 different message types.
     32      */
     33     private static final long HANDLE_TYPE_MASK            = (((long)0xf)<<56);
     34     private static final long HANDLE_TYPE_MMS_MASK        = (((long)0x1)<<56);
     35     private static final long HANDLE_TYPE_EMAIL_MASK      = (((long)0x2)<<56);
     36     private static final long HANDLE_TYPE_SMS_GSM_MASK    = (((long)0x4)<<56);
     37     private static final long HANDLE_TYPE_SMS_CDMA_MASK   = (((long)0x8)<<56);
     38 
     39     /**
     40      * This enum is used to convert from the bMessage type property to a type safe
     41      * type. Hence do not change the names of the enum values.
     42      */
     43     public enum TYPE{
     44         EMAIL,
     45         SMS_GSM,
     46         SMS_CDMA,
     47         MMS
     48     }
     49 
     50     public static String getLongAsString(long v) {
     51         char[] result = new char[16];
     52         int v1 = (int) (v & 0xffffffff);
     53         int v2 = (int) ((v>>32) & 0xffffffff);
     54         int c;
     55         for (int i = 0; i < 8; i++) {
     56             c = v2 & 0x0f;
     57             c += (c < 10) ? '0' : ('A'-10);
     58             result[7 - i] = (char) c;
     59             v2 >>= 4;
     60             c = v1 & 0x0f;
     61             c += (c < 10) ? '0' : ('A'-10);
     62             result[15 - i] = (char)c;
     63             v1 >>= 4;
     64         }
     65         return new String(result);
     66     }
     67 
     68     /**
     69      * Convert a Content Provider handle and a Messagetype into a unique handle
     70      * @param cpHandle content provider handle
     71      * @param messageType message type (TYPE_MMS/TYPE_SMS_GSM/TYPE_SMS_CDMA/TYPE_EMAIL)
     72      * @return String Formatted Map Handle
     73      */
     74     public static String getMapHandle(long cpHandle, TYPE messageType){
     75         String mapHandle = "-1";
     76         switch(messageType)
     77         {
     78 
     79             case MMS:
     80                 mapHandle = getLongAsString(cpHandle | HANDLE_TYPE_MMS_MASK);
     81                 break;
     82             case SMS_GSM:
     83                 mapHandle = getLongAsString(cpHandle | HANDLE_TYPE_SMS_GSM_MASK);
     84                 break;
     85             case SMS_CDMA:
     86                 mapHandle = getLongAsString(cpHandle | HANDLE_TYPE_SMS_CDMA_MASK);
     87                 break;
     88             case EMAIL:
     89                 mapHandle = getLongAsString(cpHandle | HANDLE_TYPE_EMAIL_MASK);
     90                 break;
     91                 default:
     92                     throw new IllegalArgumentException("Message type not supported");
     93         }
     94         return mapHandle;
     95 
     96     }
     97 
     98     /**
     99      * Convert a handle string the the raw long representation, including the type bit.
    100      * @param mapHandle the handle string
    101      * @return the handle value
    102      */
    103     static public long getMsgHandleAsLong(String mapHandle){
    104         return Long.parseLong(mapHandle, 16);
    105     }
    106     /**
    107      * Convert a Map Handle into a content provider Handle
    108      * @param mapHandle handle to convert from
    109      * @return content provider handle without message type mask
    110      */
    111     static public long getCpHandle(String mapHandle)
    112     {
    113         long cpHandle = getMsgHandleAsLong(mapHandle);
    114         if(D)Log.d(TAG,"-> MAP handle:"+mapHandle);
    115         /* remove masks as the call should already know what type of message this handle is for */
    116         cpHandle &= ~HANDLE_TYPE_MASK;
    117         if(D)Log.d(TAG,"->CP handle:"+cpHandle);
    118 
    119         return cpHandle;
    120     }
    121 
    122     /**
    123      * Extract the message type from the handle.
    124      * @param mapHandle
    125      * @return
    126      */
    127     static public TYPE getMsgTypeFromHandle(String mapHandle) {
    128         long cpHandle = getMsgHandleAsLong(mapHandle);
    129 
    130         if((cpHandle & HANDLE_TYPE_MMS_MASK) != 0)
    131             return TYPE.MMS;
    132         if((cpHandle & HANDLE_TYPE_EMAIL_MASK) != 0)
    133             return TYPE.EMAIL;
    134         if((cpHandle & HANDLE_TYPE_SMS_GSM_MASK) != 0)
    135             return TYPE.SMS_GSM;
    136         if((cpHandle & HANDLE_TYPE_SMS_CDMA_MASK) != 0)
    137             return TYPE.SMS_CDMA;
    138 
    139         throw new IllegalArgumentException("Message type not found in handle string.");
    140     }
    141 }
    142 
    143