/*
 * Copyright (C) 2015 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.server.telecom;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
import android.telecom.Log;
import android.telecom.TelecomManager;

import com.android.server.telecom.ui.TelecomDeveloperMenu;

/**
 * Receiver for "secret codes" broadcast by Dialer.
 */
public class DialerCodeReceiver extends BroadcastReceiver {
    // Copied from TelephonyIntents.java.
    public static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";

    // Enables extended logging for a period of time.
    public static final String TELECOM_SECRET_CODE_DEBUG_ON = "823241";

    // Disables extended logging.
    public static final String TELECOM_SECRET_CODE_DEBUG_OFF = "823240";

    // Writes a MARK to the Telecom log.
    public static final String TELECOM_SECRET_CODE_MARK = "826275";

    // Opens the Telecom developer menu.
    public static final String TELECOM_SECRET_CODE_MENU = "828282";

    private final CallsManager mCallsManager;

    DialerCodeReceiver(CallsManager callsManager) {
        mCallsManager = callsManager;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (SECRET_CODE_ACTION.equals(intent.getAction()) && intent.getData() != null &&
                intent.getData().getHost() != null) {
            if (intent.getData().getHost().equals(TELECOM_SECRET_CODE_DEBUG_ON)) {
                Log.i("DialerCodeReceiver", "Secret code used to enable extended logging mode");
                Log.setIsExtendedLoggingEnabled(true);
            } else if (intent.getData().getHost().equals(TELECOM_SECRET_CODE_DEBUG_OFF)) {
                Log.i("DialerCodeReceiver", "Secret code used to disable extended logging mode");
                Log.setIsExtendedLoggingEnabled(false);
            } else if (intent.getData().getHost().equals(TELECOM_SECRET_CODE_MARK)) {
                Log.i("DialerCodeReceiver", "Secret code used to mark logs.");

                // If there is an active call, add the "log mark" for that call; otherwise we will
                // add a non-call event.
                Call currentCall = mCallsManager.getActiveCall();
                Log.addEvent(currentCall, LogUtils.Events.USER_LOG_MARK);
            } else if (intent.getData().getHost().equals(TELECOM_SECRET_CODE_MENU)) {
                Log.i("DialerCodeReceiver", "Secret code used to open developer menu.");
                Intent confirmIntent = new Intent(context, TelecomDeveloperMenu.class);
                confirmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivityAsUser(confirmIntent, UserHandle.CURRENT);
            }
        }
    }
}
