10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.gsm;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.HandlerThread;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Looper;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
2599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.GSMPhone;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.test.SimulatedCommands;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TestPhoneNotifier;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This class creates a HandlerThread which waits for the various messages.
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class GSMTestHandler extends HandlerThread implements Handler.Callback {
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Handler mHandler;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message mCurrentMessage;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Boolean mMsgConsumed;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private SimulatedCommands sc;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private GSMPhone mGSMPhone;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Context mContext;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int FAIL_TIMEOUT_MILLIS = 5 * 1000;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public GSMTestHandler(Context context) {
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super("GSMPhoneTest");
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMsgConsumed = false;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext = context;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville   }
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void onLooperPrepared() {
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sc = new SimulatedCommands();
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mGSMPhone = new GSMPhone(mContext, sc, new TestPhoneNotifier(), true);
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mHandler = new Handler(getLooper(), this);
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized (this) {
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifyAll();
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handleMessage(Message msg) {
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized (this) {
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCurrentMessage = msg;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.notifyAll();
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            while(!mMsgConsumed) {
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    this.wait();
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (InterruptedException e) {}
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMsgConsumed = false;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void cleanup() {
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Looper looper = getLooper();
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (looper != null) looper.quit();
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mHandler = null;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Handler getHandler() {
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mHandler;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SimulatedCommands getSimulatedCommands() {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sc;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public GSMPhone getGSMPhone() {
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mGSMPhone;
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Message waitForMessage(int code) {
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message msg;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        while(true) {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            msg = null;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            synchronized (this) {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    this.wait(FAIL_TIMEOUT_MILLIS);
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (InterruptedException e) {
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Check if timeout has occurred.
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mCurrentMessage != null) {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Consume the message
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    msg = Message.obtain();
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    msg.copyFrom(mCurrentMessage);
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCurrentMessage = null;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mMsgConsumed = true;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    this.notifyAll();
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (msg == null || code == GSMPhoneTest.ANY_MESSAGE || msg.what == code) return msg;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
119