/* * Copyright (C) 2009 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.internal.telephony.gsm; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import com.android.internal.telephony.gsm.GSMPhone; import com.android.internal.telephony.test.SimulatedCommands; import com.android.internal.telephony.TestPhoneNotifier; /** * This class creates a HandlerThread which waits for the various messages. */ public class GSMTestHandler extends HandlerThread implements Handler.Callback { private Handler mHandler; private Message mCurrentMessage; private Boolean mMsgConsumed; private SimulatedCommands sc; private GSMPhone mGSMPhone; private Context mContext; private static final int FAIL_TIMEOUT_MILLIS = 5 * 1000; public GSMTestHandler(Context context) { super("GSMPhoneTest"); mMsgConsumed = false; mContext = context; } @Override protected void onLooperPrepared() { sc = new SimulatedCommands(); mGSMPhone = new GSMPhone(mContext, sc, new TestPhoneNotifier(), true); mHandler = new Handler(getLooper(), this); synchronized (this) { notifyAll(); } } public boolean handleMessage(Message msg) { synchronized (this) { mCurrentMessage = msg; this.notifyAll(); while(!mMsgConsumed) { try { this.wait(); } catch (InterruptedException e) {} } mMsgConsumed = false; } return true; } public void cleanup() { Looper looper = getLooper(); if (looper != null) looper.quit(); mHandler = null; } public Handler getHandler() { return mHandler; } public SimulatedCommands getSimulatedCommands() { return sc; } public GSMPhone getGSMPhone() { return mGSMPhone; } public Message waitForMessage(int code) { Message msg; while(true) { msg = null; synchronized (this) { try { this.wait(FAIL_TIMEOUT_MILLIS); } catch (InterruptedException e) { } // Check if timeout has occurred. if (mCurrentMessage != null) { // Consume the message msg = Message.obtain(); msg.copyFrom(mCurrentMessage); mCurrentMessage = null; mMsgConsumed = true; this.notifyAll(); } } if (msg == null || code == GSMPhoneTest.ANY_MESSAGE || msg.what == code) return msg; } } }