/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.stk;

import com.android.internal.telephony.cat.AppInterface;
import com.android.internal.telephony.uicc.IccRefreshResponse;
import com.android.internal.telephony.cat.CatLog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import com.android.internal.telephony.cat.AppInterface;

/**
 * Receiver class to get STK intents, broadcasted by telephony layer.
 *
 */
public class StkCmdReceiver extends BroadcastReceiver {
    private static final String LOG_TAG = StkCmdReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action == null) {
            return;
        }

        if (action.equals(AppInterface.CAT_CMD_ACTION)) {
            handleAction(context, intent, StkAppService.OP_CMD);
        } else if (action.equals(AppInterface.CAT_SESSION_END_ACTION)) {
            handleAction(context, intent, StkAppService.OP_END_SESSION);
        } else if (action.equals(AppInterface.CAT_ICC_STATUS_CHANGE)) {
            handleAction(context, intent, StkAppService.OP_CARD_STATUS_CHANGED);
        } else if (action.equals(AppInterface.CAT_ALPHA_NOTIFY_ACTION)) {
            handleAction(context, intent, StkAppService.OP_ALPHA_NOTIFY);
        }
    }

    private void handleAction(Context context, Intent intent, int op) {
        Bundle args = new Bundle();
        int slot_id = intent.getIntExtra(StkAppService.SLOT_ID, 0);

        args.putInt(StkAppService.OPCODE, op);
        args.putInt(StkAppService.SLOT_ID, slot_id);

        if (StkAppService.OP_CMD == op) {
            args.putParcelable(StkAppService.CMD_MSG, intent
                    .getParcelableExtra(StkAppService.STK_CMD));
        } else if (StkAppService.OP_CARD_STATUS_CHANGED == op) {
            // If the Card is absent then check if the StkAppService is even
            // running before starting it to stop it right away
            if ((intent.getBooleanExtra(AppInterface.CARD_STATUS, false) == false)
                    && StkAppService.getInstance() == null) {
                return;
            }

            args.putBoolean(AppInterface.CARD_STATUS,
                    intent.getBooleanExtra(AppInterface.CARD_STATUS, true));
            args.putInt(AppInterface.REFRESH_RESULT,
                    intent.getIntExtra(AppInterface.REFRESH_RESULT,
                    IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE));
        } else if (StkAppService.OP_ALPHA_NOTIFY == op) {
            String alphaString = intent.getStringExtra(AppInterface.ALPHA_STRING);
            args.putString(AppInterface.ALPHA_STRING, alphaString);
        }

        CatLog.d(LOG_TAG, "handleAction, op: " + op +
                "args: " + args + ", slot id: " + slot_id);
        Intent toService = new Intent(context, StkAppService.class);
        toService.putExtras(args);
        context.startService(toService);
    }
}
