/*
 * Copyright 2014, 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.annotation.Nullable;
import android.net.Uri;
import android.os.UserHandle;
import android.telecom.PhoneAccountHandle;

import android.telecom.CallerInfo;

/**
 * Creates a notification for calls that the user missed (neither answered nor rejected).
 */
public interface MissedCallNotifier extends CallsManager.CallsManagerListener {
    class CallInfoFactory {
        public CallInfo makeCallInfo(CallerInfo callerInfo, PhoneAccountHandle phoneAccountHandle,
                Uri handle, long creationTimeMillis) {
            return new CallInfo(callerInfo, phoneAccountHandle, handle, creationTimeMillis);
        }
    }

    class CallInfo {
        private CallerInfo mCallerInfo;
        private PhoneAccountHandle mPhoneAccountHandle;
        private Uri mHandle;
        private long mCreationTimeMillis;

        public CallInfo(CallerInfo callerInfo, PhoneAccountHandle phoneAccountHandle, Uri handle,
                long creationTimeMillis) {
            mCallerInfo = callerInfo;
            mPhoneAccountHandle = phoneAccountHandle;
            mHandle = handle;
            mCreationTimeMillis = creationTimeMillis;
        }

        public CallInfo(Call call) {
            mCallerInfo = call.getCallerInfo();
            mPhoneAccountHandle = call.getTargetPhoneAccount();
            mHandle = call.getHandle();
            mCreationTimeMillis = call.getCreationTimeMillis();
        }

        public CallerInfo getCallerInfo() {
            return mCallerInfo;
        }

        public PhoneAccountHandle getPhoneAccountHandle() {
            return mPhoneAccountHandle;
        }

        public Uri getHandle() {
            return mHandle;
        }

        public String getHandleSchemeSpecificPart() {
            return mHandle == null ? null : mHandle.getSchemeSpecificPart();
        }

        public long getCreationTimeMillis() {
            return mCreationTimeMillis;
        }

        public String getPhoneNumber() {
            return mCallerInfo == null ? null : mCallerInfo.getPhoneNumber();
        }

        public String getName() {
            return mCallerInfo == null ? null : mCallerInfo.getName();
        }
    }

    void clearMissedCalls(UserHandle userHandle);

    void showMissedCallNotification(CallInfo call, @Nullable Uri uri);

    void reloadAfterBootComplete(CallerInfoLookupHelper callerInfoLookupHelper,
            CallInfoFactory callInfoFactory);

    void reloadFromDatabase(CallerInfoLookupHelper callerInfoLookupHelper,
            CallInfoFactory callInfoFactory, UserHandle userHandle);

    void setCurrentUserHandle(UserHandle userHandle);
}
