/* * Copyright (C) 2010 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 android.net.sip; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.ConditionVariable; import android.os.IBinder; import android.os.IInterface; import android.os.Looper; import android.util.Log; // TODO: throw away this class after moving SIP classes to framework // This class helps to get IBinder instance of a service in a blocking call. // The method cannot be called in app's main thread as the ServiceConnection // callback will. class BinderHelper { private Context mContext; private IBinder mBinder; private Class mClass; BinderHelper(Context context, Class klass) { mContext = context; mClass = klass; } void startService() { mContext.startService(new Intent(mClass.getName())); } void stopService() { mContext.stopService(new Intent(mClass.getName())); } IBinder getBinder() { // cannot call this method in app's main thread if (Looper.getMainLooper().getThread() == Thread.currentThread()) { throw new RuntimeException( "This method cannot be called in app's main thread"); } final ConditionVariable cv = new ConditionVariable(); cv.close(); ServiceConnection c = new ServiceConnection() { public synchronized void onServiceConnected( ComponentName className, IBinder binder) { Log.v("BinderHelper", "service connected!"); mBinder = binder; cv.open(); mContext.unbindService(this); } public void onServiceDisconnected(ComponentName className) { cv.open(); mContext.unbindService(this); } }; if (mContext.bindService(new Intent(mClass.getName()), c, 0)) { cv.block(4500); } return mBinder; } }