/*
 * Copyright (C) 2024 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.phone;

import android.content.Context;
import android.net.KeepalivePacketData;
import android.net.LinkProperties;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Registrant;
import android.telephony.ImsiEncryptionInfo;
import android.telephony.NetworkScanRequest;
import android.telephony.SignalThresholdInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.DataProfile;
import android.telephony.data.NetworkSliceInfo;
import android.telephony.data.TrafficDescriptor;
import android.telephony.emergency.EmergencyNumber;

import com.android.internal.telephony.BaseCommands;
import com.android.internal.telephony.RadioCapability;
import com.android.internal.telephony.UUSInfo;
import com.android.internal.telephony.cat.CatService;
import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
import com.android.internal.telephony.uicc.UiccController;
import com.android.internal.telephony.uicc.UiccProfile;

import java.util.List;

/**
 * This class is a fake implementation of RIL.java. This is used to send RIL events to CatService
 * for testing purpose.
 */
class FakeRil extends BaseCommands {

    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private Registrant mProactiveCmdRegistrant;

    FakeRil(Context context) {
        super(context);
        mHandlerThread = new HandlerThread("FakeRilThread");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
    }

    /** Sends RIL_UNSOL_STK_PROACTIVE_COMMAND events to CatService. */
    public void sendProactiveCmdToCatService(int slotId, String tlv) {
        UiccProfile uiccProfile = UiccController.getInstance().getUiccProfileForPhone(slotId);
        mHandler.post(
                new Runnable() {
                    @Override
                    public void run() {
                        CatService catService = CatService.getInstance(null, null, null, slotId);
                        if (catService == null) {
                            return;
                        }
                        catService.dispose(); // dispose current object to attach FakeRil dependency
                        catService =
                                CatService.getInstance(FakeRil.this, mContext, uiccProfile, slotId);
                        mProactiveCmdRegistrant.notifyRegistrant(new AsyncResult(null, tlv, null));
                    }
                });
    }

    @Override
    public void setOnCatProactiveCmd(Handler h, int what, Object obj) {
        mProactiveCmdRegistrant = new Registrant(h, what, obj);
    }

    @Override
    public void setOnNITZTime(Handler h, int what, Object obj) {}

    @Override
    public void getIccCardStatus(Message result) {}

    @Override
    public void supplyIccPin(String pin, Message result) {}

    @Override
    public void changeIccPin(String oldPin, String newPin, Message result) {}

    @Override
    public void changeBarringPassword(
            String facility, String oldPwd, String newPwd, Message result) {}

    @Override
    public void supplyNetworkDepersonalization(String netpin, Message result) {}

    @Override
    public void supplySimDepersonalization(
            PersoSubState persoType, String controlKey, Message result) {}

    @Override
    public void getCurrentCalls(Message result) {}

    @Override
    public void getDataCallList(Message result) {}

    @Override
    public void dial(
            String address,
            boolean isEmergencyCall,
            EmergencyNumber emergencyNumberInfo,
            boolean hasKnownUserIntentEmergency,
            int clirMode,
            Message result) {}

    @Override
    public void dial(
            String address,
            boolean isEmergencyCall,
            EmergencyNumber emergencyNumberInfo,
            boolean hasKnownUserIntentEmergency,
            int clirMode,
            UUSInfo uusInfo,
            Message result) {}

    @Override
    public void getIMSI(Message result) {}

    @Override
    public void getIMSIForApp(String aid, Message result) {}

    @Override
    public void hangupConnection(int gsmIndex, Message result) {}

    @Override
    public void hangupWaitingOrBackground(Message result) {}

    @Override
    public void hangupForegroundResumeBackground(Message result) {}

    @Override
    public void switchWaitingOrHoldingAndActive(Message result) {}

    @Override
    public void conference(Message result) {}

    @Override
    public void setPreferredVoicePrivacy(boolean enable, Message result) {}

    @Override
    public void getPreferredVoicePrivacy(Message result) {}

    @Override
    public void separateConnection(int gsmIndex, Message result) {}

    @Override
    public void acceptCall(Message result) {}

    @Override
    public void rejectCall(Message result) {}

    @Override
    public void explicitCallTransfer(Message result) {}

    @Override
    public void getLastCallFailCause(Message result) {}

    @Override
    public void setMute(boolean enableMute, Message response) {}

    @Override
    public void getMute(Message response) {}

    @Override
    public void getSignalStrength(Message result) {}

    @Override
    public void getVoiceRegistrationState(Message result) {}

    @Override
    public void getDataRegistrationState(Message result) {}

    @Override
    public void getOperator(Message result) {}

    @Override
    public void sendDtmf(char c, Message result) {}

    @Override
    public void startDtmf(char c, Message result) {}

    @Override
    public void stopDtmf(Message result) {}

    @Override
    public void sendBurstDtmf(String dtmfString, int on, int off, Message result) {}

    @Override
    public void sendSMS(String smscPDU, String pdu, Message result) {}

    @Override
    public void sendSMSExpectMore(String smscPDU, String pdu, Message result) {}

    @Override
    public void sendCdmaSms(byte[] pdu, Message result) {}

    @Override
    public void sendCdmaSMSExpectMore(byte[] pdu, Message result) {}

    @Override
    public void sendImsGsmSms(
            String smscPDU, String pdu, int retry, int messageRef, Message response) {}

    @Override
    public void sendImsCdmaSms(byte[] pdu, int retry, int messageRef, Message response) {}

    @Override
    public void getImsRegistrationState(Message result) {}

    @Override
    public void deleteSmsOnSim(int index, Message response) {}

    @Override
    public void writeSmsToSim(int status, String smsc, String pdu, Message response) {}

    @Override
    public void writeSmsToRuim(int status, byte[] pdu, Message response) {}

    @Override
    public void setupDataCall(
            int accessNetworkType,
            DataProfile dataProfile,
            boolean allowRoaming,
            int reason,
            LinkProperties linkProperties,
            int pduSessionId,
            NetworkSliceInfo sliceInfo,
            TrafficDescriptor trafficDescriptor,
            boolean matchAllRuleAllowed,
            Message result) {}

    @Override
    public void deactivateDataCall(int cid, int reason, Message result) {}

    @Override
    public void setRadioPower(boolean on, Message result) {}

    @Override
    public void acknowledgeLastIncomingGsmSms(boolean success, int cause, Message result) {}

    @Override
    public void acknowledgeLastIncomingCdmaSms(boolean success, int cause, Message result) {}

    @Override
    public void acknowledgeIncomingGsmSmsWithPdu(boolean success, String ackPdu, Message result) {}

    @Override
    public void iccIO(
            int command,
            int fileid,
            String path,
            int p1,
            int p2,
            int p3,
            String data,
            String pin2,
            Message result) {}

    @Override
    public void iccIOForApp(
            int command,
            int fileid,
            String path,
            int p1,
            int p2,
            int p3,
            String data,
            String pin2,
            String aid,
            Message result) {}

    @Override
    public void getCLIR(Message result) {}

    @Override
    public void setCLIR(int clirMode, Message result) {}

    @Override
    public void queryCallWaiting(int serviceClass, Message response) {}

    @Override
    public void setCallWaiting(boolean enable, int serviceClass, Message response) {}

    @Override
    public void setNetworkSelectionModeAutomatic(Message response) {}

    @Override
    public void setNetworkSelectionModeManual(String operatorNumeric, int ran, Message response) {}

    @Override
    public void getNetworkSelectionMode(Message response) {}

    @Override
    public void getAvailableNetworks(Message response) {}

    @Override
    public void startNetworkScan(NetworkScanRequest nsr, Message response) {}

    @Override
    public void stopNetworkScan(Message response) {}

    @Override
    public void setCallForward(
            int action,
            int cfReason,
            int serviceClass,
            String number,
            int timeSeconds,
            Message response) {}

    @Override
    public void queryCallForwardStatus(
            int cfReason, int serviceClass, String number, Message response) {}

    @Override
    public void queryCLIP(Message response) {}

    @Override
    public void getBasebandVersion(Message response) {}

    @Override
    public void queryFacilityLock(
            String facility, String password, int serviceClass, Message response) {}

    @Override
    public void queryFacilityLockForApp(
            String facility, String password, int serviceClass, String appId, Message response) {}

    @Override
    public void setFacilityLock(
            String facility,
            boolean lockState,
            String password,
            int serviceClass,
            Message response) {}

    @Override
    public void setFacilityLockForApp(
            String facility,
            boolean lockState,
            String password,
            int serviceClass,
            String appId,
            Message response) {}

    @Override
    public void sendUSSD(String ussdString, Message response) {}

    @Override
    public void cancelPendingUssd(Message response) {}

    @Override
    public void sendTerminalResponse(String contents, Message response) {}

    @Override
    public void sendEnvelope(String contents, Message response) {}

    @Override
    public void sendEnvelopeWithStatus(String contents, Message response) {}

    @Override
    public void handleCallSetupRequestFromSim(boolean accept, Message response) {}

    @Override
    public void setPreferredNetworkType(int networkType, Message response) {}

    @Override
    public void getPreferredNetworkType(Message response) {}

    @Override
    public void setAllowedNetworkTypesBitmap(
            @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask, Message response) {}

    @Override
    public void getAllowedNetworkTypesBitmap(Message response) {}

    @Override
    public void setLocationUpdates(boolean enable, Message response) {}

    @Override
    public void getSmscAddress(Message result) {}

    @Override
    public void setSmscAddress(String address, Message result) {}

    @Override
    public void reportSmsMemoryStatus(boolean available, Message result) {}

    @Override
    public void reportStkServiceIsRunning(Message result) {}

    @Override
    public void getGsmBroadcastConfig(Message response) {}

    @Override
    public void setGsmBroadcastConfig(SmsBroadcastConfigInfo[] config, Message response) {}

    @Override
    public void setGsmBroadcastActivation(boolean activate, Message response) {}

    // ***** Methods for CDMA support
    @Override
    public void getDeviceIdentity(Message response) {}

    @Override
    public void getImei(Message response) {}

    @Override
    public void setPhoneType(int phoneType) {}

    @Override
    public void queryTTYMode(Message response) {}

    @Override
    public void setTTYMode(int ttyMode, Message response) {}

    @Override
    public void getCdmaBroadcastConfig(Message response) {}

    @Override
    public void setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs, Message response) {}

    @Override
    public void setCdmaBroadcastActivation(boolean activate, Message response) {}

    @Override
    public void exitEmergencyCallbackMode(Message response) {}

    @Override
    public void supplyIccPinForApp(String pin, String aid, Message response) {}

    @Override
    public void supplyIccPukForApp(String puk, String newPin, String aid, Message response) {}

    @Override
    public void supplyIccPin2ForApp(String pin2, String aid, Message response) {}

    @Override
    public void supplyIccPuk2ForApp(String puk2, String newPin2, String aid, Message response) {}

    @Override
    public void changeIccPinForApp(String oldPin, String newPin, String aidPtr, Message response) {}

    @Override
    public void changeIccPin2ForApp(
            String oldPin2, String newPin2, String aidPtr, Message response) {}

    @Override
    public void requestIccSimAuthentication(
            int authContext, String data, String aid, Message response) {}

    @Override
    public void getVoiceRadioTechnology(Message result) {}

    @Override
    public void setInitialAttachApn(DataProfile dataProfile, Message result) {}

    @Override
    public void setDataProfile(DataProfile[] dps, Message result) {}

    @Override
    public void iccOpenLogicalChannel(String aid, int p2, Message response) {}

    @Override
    public void iccCloseLogicalChannel(int channel, boolean isEs10, Message response) {}

    @Override
    public void iccTransmitApduLogicalChannel(
            int channel,
            int cla,
            int instruction,
            int p1,
            int p2,
            int p3,
            String data,
            boolean isEs10Command,
            Message response) {}

    @Override
    public void iccTransmitApduBasicChannel(
            int cla, int instruction, int p1, int p2, int p3, String data, Message response) {}

    @Override
    public void nvResetConfig(int resetType, Message response) {}

    @Override
    public void getHardwareConfig(Message result) {}

    @Override
    public void requestShutdown(Message result) {}

    @Override
    public void setRadioCapability(RadioCapability rc, Message response) {}

    @Override
    public void getRadioCapability(Message response) {}

    @Override
    public void setCarrierInfoForImsiEncryption(
            ImsiEncryptionInfo imsiEncryptionInfo, Message result) {}

    @Override
    public void sendDeviceState(int stateType, boolean state, Message result) {}

    @Override
    public void setUnsolResponseFilter(int filter, Message result) {}

    @Override
    public void setSignalStrengthReportingCriteria(
            List<SignalThresholdInfo> signalThresholdInfo, Message result) {}

    @Override
    public void setLinkCapacityReportingCriteria(
            int hysteresisMs,
            int hysteresisDlKbps,
            int hysteresisUlKbps,
            int[] thresholdsDlKbps,
            int[] thresholdsUlKbps,
            int ran,
            Message result) {}

    @Override
    public void startNattKeepalive(
            int contextId, KeepalivePacketData packetData, int intervalMillis, Message result) {}

    @Override
    public void stopNattKeepalive(int sessionHandle, Message result) {}

    @Override
    public void allocatePduSessionId(Message result) {}

    @Override
    public void releasePduSessionId(Message result, int pduSessionId) {}

    @Override
    public void startHandover(Message result, int callId) {}

    @Override
    public void cancelHandover(Message result, int callId) {}
}
