package com.openims.view.chat.widget;
import java.util.HashMap;
import org.jivesoftware.smack.XMPPConnection;
import android.app.Activity;
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.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.widget.ToggleButton;
import com.openims.model.MyApplication;
import com.openims.service.IMService;
import com.openims.utility.LogUtil;
import com.openims.utility.PushServiceUtil;
import com.openims.view.chat.OnAvater;
import com.openims.view.chat.UserManageActivity;
import com.openims.view.chat.UserSearchActivity;
import com.openims.view.setting.Setting.InnerReceiver;
import com.smit.EasyLauncher.LoginActivity;
import com.smit.EasyLauncher.R;
public class IMWidgetFragment extends Fragment
implements OnClickListener,OnAvater{
private static final String TAG = LogUtil.makeLogTag(IMWidgetFragment.class);
private static final String PRE = "IMWidgetFragment--";
/** Messenger for communicating with service. */
private Messenger mService = null;
/** Flag indicating whether we have called bind on the service. */
boolean mIsBound;
/**
* Target we publish for clients to send messages to IncomingHandler.
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
private final HashMap<String,OnAvaterListener> avaterListeners =
new HashMap<String,OnAvaterListener>();
private FriendListFragment mFriendFragment;
private ToggleButton mBtnFriend;
private ToggleButton mBtnRecent;
private Activity mActivity;
private MyApplication myApplication;
private IMStatusReceiver statusReceiver;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity = activity;
Log.d(TAG, PRE + "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, PRE + "onCreate");
myApplication = (MyApplication)mActivity.getApplication();
statusReceiver = new IMStatusReceiver();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, PRE + "onCreateView");
View v = inflater.inflate(R.layout.im_widget_fragment, container, false);
mBtnFriend = (ToggleButton)v.findViewById(R.id.btn_friend);
mBtnFriend.setOnClickListener(this);
mBtnFriend.setChecked(true);
mBtnRecent = (ToggleButton)v.findViewById(R.id.btn_recent);
View btnSetting = v.findViewById(R.id.btn_im_setting);
View btnAddFriend = v.findViewById(R.id.btn_add_friend);
View contentLayout = v.findViewById(R.id.im_center);
View loginTips = v.findViewById(R.id.im_unlogin);
if(isLogin()){
btnSetting.setVisibility(View.VISIBLE);
btnAddFriend.setVisibility(View.VISIBLE);
contentLayout.setVisibility(View.VISIBLE);
loginTips.setVisibility(View.GONE);
}else{
btnSetting.setVisibility(View.GONE);
btnAddFriend.setVisibility(View.GONE);
contentLayout.setVisibility(View.GONE);
loginTips.setVisibility(View.VISIBLE);
}
btnSetting.setOnClickListener(this);
mBtnRecent.setOnClickListener(this);
btnAddFriend.setOnClickListener(this);
v.findViewById(R.id.im_btn_login).setOnClickListener(this);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFriendFragment = (FriendListFragment)getFragmentManager()
.findFragmentById(R.id.friend_list_fragment);
mFriendFragment.setOnAvater(this);
doBindService();
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, PRE + "onStart");
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(PushServiceUtil.ACTION_STATUS);
mActivity.registerReceiver(statusReceiver, intentFilter);
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, PRE + "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, PRE + "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, PRE + "onStop");
mActivity.unregisterReceiver(statusReceiver);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, PRE + "onDestroy");
doUnbindService();
mConnection = null;
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, PRE + "onDetach");
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_friend:
if(mBtnFriend.isChecked() == false){
mBtnFriend.setChecked(true);
return;
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.im_center, mFriendFragment);
ft.commit();
mBtnFriend.setChecked(true);
mBtnRecent.setChecked(false);
break;
case R.id.btn_recent:
if(mBtnRecent.isChecked() == false){
mBtnRecent.setChecked(true);
return;
}
FragmentTransaction ft1 = getFragmentManager().beginTransaction();
ft1.replace(R.id.im_center, new RecentChatListFragment());
ft1.commit();
mBtnFriend.setChecked(false);
mBtnRecent.setChecked(true);
break;
case R.id.btn_add_friend:
Intent intent = new Intent(mActivity,UserSearchActivity.class);
mActivity.startActivity(intent);
break;
case R.id.btn_im_setting:
mActivity.startActivity(new Intent(mActivity,UserManageActivity.class));
break;
case R.id.im_btn_login:
mActivity.startActivity(new Intent(mActivity,LoginActivity.class));
break;
}
}
/**
* Handler of incoming messages from service.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case PushServiceUtil.MSG_REQUEST_VCARD:
String jid = (String)msg.obj;
OnAvaterListener listener = avaterListeners.get(jid);
if(listener != null){
listener.avater(jid, null);
avaterListeners.remove(jid);
}
break;
case PushServiceUtil.MSG_ROSTER_UPDATED:
mFriendFragment.reRoadData();
break;
case PushServiceUtil.MSG_ROSTER_DELETE:
mFriendFragment.reRoadData();
break;
default:
super.handleMessage(msg);
}
}
}
/**
* Class for interacting with the main interface of the service.
*/
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mService = new Messenger(service);
try {
Message msg = Message.obtain(null,
PushServiceUtil.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
}
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
}
};
private void doBindService() {
IMWidgetFragment.this.mActivity.bindService(
new Intent(IMWidgetFragment.this.mActivity,
IMService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
Log.i(TAG,PRE + "Binding.");
}
private void doUnbindService() {
if (mIsBound) {
if (mService != null) {
try {
Message msg = Message.obtain(null,
PushServiceUtil.MSG_UNREGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
} catch (RemoteException e) {
}
}
// Detach our existing connection.
IMWidgetFragment.this.mActivity.unbindService(mConnection);
mIsBound = false;
Log.d(TAG, PRE + "Unbinding.");
}
}
@Override
public Drawable getAvater(String avaterJid, OnAvaterListener listener) {
Drawable d = myApplication.getAvater(avaterJid);
if(d != null){
return d;
}
// Request vcard from service
Resources r = getResources();
d = r.getDrawable(R.drawable.icon);
if(avaterListeners.containsKey(avaterJid) == false){
Message msg = Message.obtain(null,
PushServiceUtil.MSG_REQUEST_VCARD);
msg.replyTo = mMessenger;
msg.obj = avaterJid;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
return d;
} catch (Exception e){
e.printStackTrace();
return d;
}
avaterListeners.put(avaterJid, listener);
}
return d;
}
private boolean isLogin(){
XMPPConnection connection = myApplication.getConnection();
if(connection != null && connection.isAuthenticated()){
return true;
}
return false;
}
/**
* refresh UI after login
*/
private void refreshUI(){
myApplication = (MyApplication)mActivity.getApplication();
View v = getView();
if(v != null){
View btnSetting = v.findViewById(R.id.btn_im_setting);
View btnAddFriend = v.findViewById(R.id.btn_add_friend);
View contentLayout = v.findViewById(R.id.im_center);
View loginTips = v.findViewById(R.id.im_unlogin);;
if(isLogin()){
btnSetting.setVisibility(View.VISIBLE);
btnAddFriend.setVisibility(View.VISIBLE);
contentLayout.setVisibility(View.VISIBLE);
loginTips.setVisibility(View.GONE);
if(mFriendFragment != null){
mFriendFragment.reRoadData();
}
}else{
btnSetting.setVisibility(View.GONE);
btnAddFriend.setVisibility(View.GONE);
contentLayout.setVisibility(View.GONE);
loginTips.setVisibility(View.VISIBLE);
}
}
}
public class IMStatusReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
String status = intent.getStringExtra(PushServiceUtil.PUSH_STATUS);
Log.d(TAG,PRE+"STATUSE:"+status);
if(PushServiceUtil.PUSH_STATUS_LOGIN_SUC.equals(status) ||
PushServiceUtil.PUSH_STATUS_LOGOUT.equals(status) ){
refreshUI();
}
}
}
}