package com.mogujie.tt.ui.utils; import java.util.List; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.IBinder; import com.mogujie.tt.imlib.IMActions; import com.mogujie.tt.imlib.IMContactManager; import com.mogujie.tt.imlib.service.IMService; import com.mogujie.tt.imlib.service.IMService.IMServiceBinder; import com.mogujie.tt.log.Logger; import com.mogujie.tt.ui.base.TTBaseFragment; public class IMServiceHelper { public static final int INTENT_NO_PRIORITY = -1; public static final int INTENT_MAX_PRIORITY = Integer.MAX_VALUE; public interface OnIMServiceListner { void onAction(String action, Intent intent, BroadcastReceiver broadcastReceiver); void onIMServiceConnected(); } private class IMBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); logger.d("im#receive action:%s", action); IMServiceHelper.this.listener.onAction(action, intent, this); } } protected static Logger logger = Logger.getLogger(IMServiceHelper.class); private IMBroadcastReceiver imReceiver = new IMBroadcastReceiver(); private IMService imService; public OnIMServiceListner listener; private boolean registered = false; public IMService getIMService() { return imService; } // todo eric when to release? private ServiceConnection imServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // todo eric when to unbind the service? // TODO Auto-generated method stub logger.i("onService(imService)Disconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub logger.i("im#onService(imService)Connected"); if (imService == null) { IMServiceBinder binder = (IMServiceBinder) service; imService = binder.getService(); if (imService == null) { logger.e("im#get imService failed"); return; } logger.d("im#get imService ok"); } listener.onIMServiceConnected(); } }; public boolean connect(Context ctx, List<String> actions, int intentPriority, OnIMServiceListner actionlistener) { registerActions(ctx, actions, intentPriority, actionlistener); return bindService(ctx); } public void disconnect(Context ctx) { unregisterActions(ctx); unbindService(ctx); } // todo eric could cause cyclic reference public void registerActions(Context ctx, List<String> actions, int intentPriority, OnIMServiceListner actionlistener) { logger.d("im#registerActions"); listener = actionlistener; if (actions != null) { IntentFilter intentFilter = new IntentFilter(); if (intentPriority != INTENT_NO_PRIORITY) { intentFilter.setPriority(intentPriority); logger.d("im#setPriority:%d", intentPriority); } for (String action : actions) { intentFilter.addAction(action); } // todo eric check return value ctx.registerReceiver(imReceiver, intentFilter); registered = true; } } public void unregisterActions(Context ctx) { if (registered) { registered = false; ctx.unregisterReceiver(imReceiver); } } public boolean bindService(Context ctx) { logger.d("im#bindService"); Intent intent = new Intent(); intent.setClass(ctx, IMService.class); if (!ctx.bindService(intent, imServiceConnection, android.content.Context.BIND_AUTO_CREATE)) { logger.e("im#bindService(imService) failed"); return false; } else { logger.i("im#bindService(imService) ok"); return true; } } public void unbindService(Context ctx) { // todo eric .check the return value .check the right place to call it ctx.unbindService(imServiceConnection); logger.i("unbindservice ok"); } }