Home | History | Annotate | Download | only in settings
      1 /**
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.phone.settings;
     18 
     19 import android.os.Message;
     20 import android.util.Log;
     21 
     22 import com.android.internal.telephony.CallForwardInfo;
     23 import com.android.internal.telephony.CommandsInterface;
     24 import com.android.internal.telephony.Phone;
     25 import com.android.phone.PhoneGlobals;
     26 
     27 public class CallForwardInfoUtil {
     28     private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
     29     private static final String LOG_TAG = CallForwardInfoUtil.class.getSimpleName();
     30 
     31     /**
     32      * @see CallForwardInfo#status
     33      */
     34     private static final int CALL_FORWARD_INFO_INACTIVE_STATUS = 0;
     35     private static final int CALL_FORWARD_INFO_ACTIVE_STATUS = 1;
     36 
     37     /**
     38      * Returns the first CallForwardInfo in infos which has the specified reason.
     39      * @param infos array of CallForwardInfo objects.
     40      * @param reason The reason we want to find a CallForwardInfo for.
     41      */
     42     public static CallForwardInfo infoForReason(CallForwardInfo[] infos, int reason) {
     43         if (infos == null) {
     44             return null;
     45         }
     46 
     47         CallForwardInfo result = null;
     48         for (int i = 0; i < infos.length; i++) {
     49             if (infos[i].reason == reason) {
     50                 return infos[i];
     51             }
     52         }
     53 
     54         return null;
     55     }
     56 
     57     /**
     58      * Update, unless we're disabling a type of forwarding and it's already disabled.
     59      */
     60     public static boolean isUpdateRequired(CallForwardInfo oldInfo, CallForwardInfo newInfo) {
     61         if (oldInfo == null) {
     62             return true;
     63         }
     64 
     65         if (newInfo.status == CALL_FORWARD_INFO_INACTIVE_STATUS
     66                 && oldInfo.status == CALL_FORWARD_INFO_INACTIVE_STATUS) {
     67             return false;
     68         }
     69 
     70         return true;
     71     }
     72 
     73     /**
     74      * Sets the call forwarding option on the phone, with the command interface action set to the
     75      * appropriate value depending on whether the CallForwardInfo is active or inactive.
     76      */
     77     public static void setCallForwardingOption(Phone phone, CallForwardInfo info, Message message) {
     78         int commandInterfaceCfAction = info.status == CALL_FORWARD_INFO_ACTIVE_STATUS
     79                 ? CommandsInterface.CF_ACTION_REGISTRATION
     80                 : CommandsInterface.CF_ACTION_DISABLE;
     81 
     82         phone.setCallForwardingOption(commandInterfaceCfAction,
     83                 info.reason,
     84                 info.number,
     85                 info.timeSeconds,
     86                 message);
     87     }
     88 
     89     /**
     90      * Retrieves a CallForwardInfo object of type {@link CommandInterface.SERVICE_CLASS_VOICE} from
     91      * the array of CallForwardInfo objects. If one does not exist, instantiates an CallForwardInfo
     92      * object which disables the specified reason.
     93      */
     94     public static CallForwardInfo getCallForwardInfo(CallForwardInfo[] infos, int reason) {
     95         CallForwardInfo info = null;
     96         for (int i = 0 ; i < infos.length; i++) {
     97             if (isServiceClassVoice(infos[i])) {
     98                 info = infos[i];
     99                 break;
    100             }
    101         }
    102 
    103         if (info == null) {
    104             // If there is  no info, create a CallForwardInfo to disable this reason.
    105             info = new CallForwardInfo();
    106             info.status = CALL_FORWARD_INFO_INACTIVE_STATUS;
    107             info.reason = reason;
    108             info.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
    109 
    110             if (DBG) Log.d(LOG_TAG, "Created default info for reason: " + reason);
    111         } else {
    112             if (!hasForwardingNumber(info)) {
    113                 info.status = CALL_FORWARD_INFO_INACTIVE_STATUS;
    114             }
    115 
    116             if (DBG) Log.d(LOG_TAG, "Retrieved  " + info.toString() + " for " + reason);
    117         }
    118 
    119         return info;
    120     }
    121 
    122     private static boolean isServiceClassVoice(CallForwardInfo info) {
    123         return (info.serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0;
    124     }
    125 
    126     private static boolean hasForwardingNumber(CallForwardInfo info) {
    127         return info.number != null && info.number.length() > 0;
    128     }
    129 }
    130