/*
 * Copyright (C) 2019 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.compatibility.common.util;

import static com.android.compatibility.common.util.BlockedNumberService.DELETE_ACTION;
import static com.android.compatibility.common.util.BlockedNumberService.INSERT_ACTION;
import static com.android.compatibility.common.util.BlockedNumberService.PHONE_NUMBER_EXTRA;
import static com.android.compatibility.common.util.BlockedNumberService.RESULT_RECEIVER_EXTRA;
import static com.android.compatibility.common.util.BlockedNumberService.ROWS_EXTRA;
import static com.android.compatibility.common.util.BlockedNumberService.URI_EXTRA;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;

import junit.framework.TestCase;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * Utility for starting the blocked number service.
 */
public class BlockedNumberUtil {

    private static final int TIMEOUT = 2;

    private BlockedNumberUtil() {}

    /** Insert a phone number into the blocked number provider and returns the resulting Uri. */
    public static Uri insertBlockedNumber(Context context, String phoneNumber) {
        Intent intent = new Intent(INSERT_ACTION);
        intent.putExtra(PHONE_NUMBER_EXTRA, phoneNumber);

        return Uri.parse(runBlockedNumberService(context, intent).getString(URI_EXTRA));
    }

    /** Remove a number from the blocked number provider and returns the number of rows deleted. */
    public static int deleteBlockedNumber(Context context, Uri uri) {
        Intent intent = new Intent(DELETE_ACTION);
        intent.putExtra(URI_EXTRA, uri.toString());

        return runBlockedNumberService(context, intent).getInt(ROWS_EXTRA);
    }

    /** Start the blocked number service. */
    static Bundle runBlockedNumberService(Context context, Intent intent) {
        // Temporarily allow background service
        SystemUtil.runShellCommand("cmd deviceidle tempwhitelist " + context.getPackageName());

        final Semaphore semaphore = new Semaphore(0);
        final Bundle result = new Bundle();

        ResultReceiver receiver = new ResultReceiver(new Handler(Looper.getMainLooper())) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                result.putAll(resultData);
                semaphore.release();
            }
        };
        intent.putExtra(RESULT_RECEIVER_EXTRA, receiver);
        intent.setComponent(new ComponentName(context, BlockedNumberService.class));

        context.startService(intent);

        try {
            TestCase.assertTrue(semaphore.tryAcquire(TIMEOUT, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            TestCase.fail("Timed out waiting for result from BlockedNumberService");
        }
        return result;
    }
}
