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 
     18 /**
     19  * Various utility methods and generic defines that can be used throughout MAPS
     20  */
     21 public class BluetoothMapUtils {
     22 
     23     private static final String TAG = "MapUtils";
     24     private static final boolean V = BluetoothMapService.VERBOSE;
     25     /* We use the upper 5 bits for the type mask - avoid using the top bit, since it
     26      * indicates a negative value, hence corrupting the formatter when converting to
     27      * type String. (I really miss the unsigned type in Java:))
     28      */
     29     private static final long HANDLE_TYPE_MASK            = 0xf<<59;
     30     private static final long HANDLE_TYPE_MMS_MASK        = 0x1<<59;
     31     private static final long HANDLE_TYPE_EMAIL_MASK      = 0x2<<59;
     32     private static final long HANDLE_TYPE_SMS_GSM_MASK    = 0x4<<59;
     33     private static final long HANDLE_TYPE_SMS_CDMA_MASK   = 0x8<<59;
     34 
     35     /**
     36      * This enum is used to convert from the bMessage type property to a type safe
     37      * type. Hence do not change the names of the enum values.
     38      */
     39     public enum TYPE{
     40         EMAIL,
     41         SMS_GSM,
     42         SMS_CDMA,
     43         MMS
     44     }
     45 
     46     /**
     47      * Convert a Content Provider handle and a Messagetype into a unique handle
     48      * @param cpHandle content provider handle
     49      * @param messageType message type (TYPE_MMS/TYPE_SMS_GSM/TYPE_SMS_CDMA/TYPE_EMAIL)
     50      * @return String Formatted Map Handle
     51      */
     52     static public String getMapHandle(long cpHandle, TYPE messageType){
     53         String mapHandle = "-1";
     54         switch(messageType)
     55         {
     56             case MMS:
     57                 mapHandle = String.format("%016X",(cpHandle | HANDLE_TYPE_MMS_MASK));
     58                 break;
     59             case SMS_GSM:
     60                 mapHandle = String.format("%016X",cpHandle | HANDLE_TYPE_SMS_GSM_MASK);
     61                 break;
     62             case SMS_CDMA:
     63                 mapHandle = String.format("%016X",cpHandle | HANDLE_TYPE_SMS_CDMA_MASK);
     64                 break;
     65             case EMAIL:
     66                 mapHandle = String.format("%016X",(cpHandle | HANDLE_TYPE_EMAIL_MASK)); //TODO correct when email support is implemented
     67                 break;
     68                 default:
     69                     throw new IllegalArgumentException("Message type not supported");
     70         }
     71         return mapHandle;
     72 
     73     }
     74 
     75     /**
     76      * Convert a handle string the the raw long representation, including the type bit.
     77      * @param mapHandle the handle string
     78      * @return the handle value
     79      */
     80     static public long getMsgHandleAsLong(String mapHandle){
     81         return Long.parseLong(mapHandle, 16);
     82     }
     83     /**
     84      * Convert a Map Handle into a content provider Handle
     85      * @param mapHandle handle to convert from
     86      * @return content provider handle without message type mask
     87      */
     88     static public long getCpHandle(String mapHandle)
     89     {
     90         long cpHandle = getMsgHandleAsLong(mapHandle);
     91         /* remove masks as the call should already know what type of message this handle is for */
     92         cpHandle &= ~HANDLE_TYPE_MASK;
     93         return cpHandle;
     94     }
     95 
     96     /**
     97      * Extract the message type from the handle.
     98      * @param mapHandle
     99      * @return
    100      */
    101     static public TYPE getMsgTypeFromHandle(String mapHandle) {
    102         long cpHandle = getMsgHandleAsLong(mapHandle);
    103 
    104         if((cpHandle & HANDLE_TYPE_MMS_MASK) != 0)
    105             return TYPE.MMS;
    106         if((cpHandle & HANDLE_TYPE_EMAIL_MASK) != 0)
    107             return TYPE.EMAIL;
    108         if((cpHandle & HANDLE_TYPE_SMS_GSM_MASK) != 0)
    109             return TYPE.SMS_GSM;
    110         if((cpHandle & HANDLE_TYPE_SMS_CDMA_MASK) != 0)
    111             return TYPE.SMS_CDMA;
    112 
    113         throw new IllegalArgumentException("Message type not found in handle string.");
    114     }
    115 }
    116 
    117