package com.yyquan.jzh.activity; import android.app.Notification; import android.content.AsyncQueryHandler; import android.content.ContentValues; import android.content.Context; import android.content.IntentFilter; import android.database.Cursor; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentActivity; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.BaseAdapter; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.rockerhieu.emojicon.EmojiconEditText; import com.rockerhieu.emojicon.EmojiconGridFragment; import com.rockerhieu.emojicon.EmojiconTextView; import com.rockerhieu.emojicon.EmojiconsFragment; import com.rockerhieu.emojicon.emoji.Emojicon; import com.squareup.picasso.Picasso; import com.yyquan.jzh.R; import com.yyquan.jzh.entity.Ip; import com.yyquan.jzh.entity.User; import com.yyquan.jzh.entity.XmppChat; import com.yyquan.jzh.entity.XmppFriend; import com.yyquan.jzh.entity.XmppMessage; import com.yyquan.jzh.entity.XmppUser; import com.yyquan.jzh.util.SaveUserUtil; import com.yyquan.jzh.util.SharedPreferencesUtil; import com.yyquan.jzh.util.TimeUtil; import com.yyquan.jzh.util.ToastUtil; import com.yyquan.jzh.view.CircleImageView; import com.yyquan.jzh.xmpp.XmppContentProvider; import com.yyquan.jzh.xmpp.XmppFriendMessageProvider; import com.yyquan.jzh.xmpp.XmppReceiver; import com.yyquan.jzh.xmpp.XmppService; import com.yyquan.jzh.xmpp.XmppTool; import com.yyquan.jzh.xmpp.view.listview.MsgListView; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Message; import java.util.ArrayList; import java.util.Date; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; /** * Created by Administrator on 2016/1/19. */ public class ChatActivity extends FragmentActivity implements View.OnClickListener, EmojiconGridFragment.OnEmojiconClickedListener, EmojiconsFragment.OnEmojiconBackspaceClickedListener, MsgListView.IXListViewListener { @Bind(R.id.msg_listView) MsgListView msgListView; @Bind(R.id.iv_icon) ImageView ivIcon; @Bind(R.id.editEmojicon) EmojiconEditText editEmojicon; @Bind(R.id.emojicons) FrameLayout emojicons; @Bind(R.id.aboutme_layout_back) LinearLayout aboutmeLayoutBack; @Bind(R.id.tv_title) TextView tvTitle; @Bind(R.id.btn_send) TextView btnSend; boolean bool = false; List<XmppChat> list; public static XmppFriend xf; ChatAdapter adapter; private ChatManager chatManager; private Chat chat; User user; XmppReceiver receiver; public static ChatActivity ca; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); ca = this; ButterKnife.bind(this); initialView(); initialData(); connection_chat(); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } /** * 初始化控件 */ public void initialView() { receiver = new XmppReceiver(uc); registerReceiver(receiver, new IntentFilter("xmpp_receiver")); user = SaveUserUtil.loadAccount(this); msgListView.setXListViewListener(this); ivIcon.setOnClickListener(this); btnSend.setOnClickListener(this); aboutmeLayoutBack.setOnClickListener(this); btnSend.setEnabled(false); editEmojicon.setOnClickListener(this); xf = (XmppFriend) getIntent().getSerializableExtra("xmpp_friend"); tvTitle.setText(xf.getUser().getNickname()); setEmojiconFragment(false); msgListView.setPullLoadEnable(false); msgListView.setPullRefreshEnable(false); editEmojicon.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (s.toString().length() < 1) { btnSend.setEnabled(false); btnSend.setBackgroundResource(R.drawable.chat_text_send_nomal); } else { btnSend.setEnabled(true); btnSend.setBackgroundResource(R.drawable.chat_text_send_foc); } } }); } /** * 初始化数据 */ public void initialData() { new AsyncQueryHandler(getContentResolver()) { @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { list = new ArrayList<>(); while (cursor.moveToNext()) { String main = cursor.getString(cursor.getColumnIndex("main")); String user = cursor.getString(cursor.getColumnIndex("user")); String nickname = cursor.getString(cursor.getColumnIndex("nickname")); String icon = cursor.getString(cursor.getColumnIndex("icon")); int type = cursor.getInt(cursor.getColumnIndex("type")); String content = cursor.getString(cursor.getColumnIndex("content")); String sex = cursor.getString(cursor.getColumnIndex("sex")); String too = cursor.getString(cursor.getColumnIndex("too")); String times = cursor.getString(cursor.getColumnIndex("time")); long time = Long.parseLong(times); int viewType = cursor.getInt(cursor.getColumnIndex("viewtype")); XmppChat xm = new XmppChat(main, user, nickname, icon, type, content, sex, too, viewType, time); Log.i("chat》》》》》》》》》》》", too + "\n" + user.toLowerCase()); list.add(xm); } adapter = new ChatAdapter(); msgListView.setAdapter(adapter); msgListView.setSelection(adapter.getCount() - 1); } }.startQuery(0, null, XmppFriendMessageProvider.CONTENT_CHATS_URI, null, "main=?", new String[]{user.getUser() + xf.getUser().getUser()}, null); } /** * 建立聊天 */ private void connection_chat() { chatManager = XmppTool.getInstance().getCon().getChatManager(); chat = chatManager.createChat(xf.getUser().getUser().toLowerCase() + "@" + XmppTool.getInstance().getCon().getServiceName(), null); Log.i("chat》》》》》》》》》》》", xf.getUser().getUser().toLowerCase() + "@" + XmppTool.getInstance().getCon().getServiceName()); } private Handler handler = new Handler() { public void handleMessage(android.os.Message m) { } }; XmppReceiver.updateActivity uc = new XmppReceiver.updateActivity() { @Override public void update(String type) { } @Override public void update(XmppChat xc) { if (list != null) { list.add(xc); adapter.setData(list); } } }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_icon: if (!bool) { hintKbTwo(); emojicons.setVisibility(View.VISIBLE); bool = true; } else { emojicons.setVisibility(View.GONE); bool = false; } break; case R.id.btn_send: if (XmppTool.getInstance().isConnection() == false) { ToastUtil.show(ChatActivity.this, "已断开,正在重连中...."); return; } try { chat.sendMessage(editEmojicon.getText().toString()); ContentValues values = new ContentValues(); values.put("content", editEmojicon.getText().toString()); values.put("time", TimeUtil.getDate()); values.put("result", 0); XmppService.resolver.update(XmppContentProvider.CONTENT_MESSAGES_URI, values, "main=? and type=?", new String[]{user.getUser() + xf.getUser().getUser(), "chat"}); btnSend.setEnabled(false); XmppChat xc = new XmppChat(user.getUser() + xf.getUser().getUser(), user.getUser(), user.getNickname(), user.getIcon(), 1, editEmojicon.getText().toString(), user.getSex(), xf.getUser().getUser(), 1, new Date().getTime()); list.add(xc); XmppFriendMessageProvider.add_message(xc); adapter.setData(list); editEmojicon.setText(""); } catch (XMPPException e) { e.printStackTrace(); ToastUtil.show(ChatActivity.this, "发送失败,请检查网络是否异常"); } break; case R.id.editEmojicon: if (bool) { emojicons.setVisibility(View.GONE); bool = false; } break; case R.id.aboutme_layout_back: ca = null; if (MainActivity.main != null) { if (MainActivity.main.message_fragment != null) { ContentValues values = new ContentValues(); values.put("result", 0); XmppService.resolver.update(XmppContentProvider.CONTENT_MESSAGES_URI, values, "main=? and type=?", new String[]{user.getUser() + xf.getUser().getUser(), "chat"}); MainActivity.main.message_fragment.initialData(); } } finish(); break; } } @Override public void onRefresh() { } @Override public void onLoadMore() { } class ChatAdapter extends BaseAdapter { private LayoutInflater mInflater; public ChatAdapter() { this.mInflater = LayoutInflater.from(ChatActivity.this); } public void setData(List<XmppChat> lists) { list = lists; adapter.notifyDataSetChanged(); msgListView.setSelection(lists.size()); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return list.get(position).getViewType(); } @Override public View getView(int position, View convertView, ViewGroup parent) { String url_icon = Ip.ip + "/YfriendService/DoGetIcon?name="; ViewHolder viewHolder; int type = list.get(position).getType(); if (convertView == null || convertView.getTag(R.mipmap.ic_launcher + type) == null) { if (type == 2) { convertView = mInflater.inflate(R.layout.chat_intput, parent, false); } else { convertView = mInflater.inflate(R.layout.chat_output, parent, false); } viewHolder = buildHolder(convertView); convertView.setTag(R.mipmap.ic_launcher + type, viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(R.mipmap.ic_launcher + type); } viewHolder.tv_content.setText(list.get(position).getContent()); viewHolder.tv_name.setText(list.get(position).getNickname()); if (list.get(position).getTime() == 0) { viewHolder.tv_time.setText(""); } else { viewHolder.tv_time.setText(TimeUtil.getChatTime(list.get(position).getTime())); } if (list.get(position).getIcon().equals("")) { if (list.get(position).getSex().equals("男")) { viewHolder.iv_icon.setImageResource(R.mipmap.me_icon_man); } else { viewHolder.iv_icon.setImageResource(R.mipmap.me_icon_woman); } } else { if (list.get(position).getIcon().substring(0, 4).equals("http")) { Picasso.with(ChatActivity.this).load(list.get(position).getIcon()).resize(200, 200).placeholder(R.mipmap.qq_addfriend_search_friend).error(R.mipmap.qq_addfriend_search_friend).centerInside().into(viewHolder.iv_icon); } else { Picasso.with(ChatActivity.this).load(url_icon + list.get(position).getIcon()).resize(200, 200).placeholder(R.mipmap.qq_addfriend_search_friend).error(R.mipmap.qq_addfriend_search_friend).centerInside().into(viewHolder.iv_icon); } } return convertView; } } private ViewHolder buildHolder(View convertView) { ViewHolder holder = new ViewHolder(); holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); holder.tv_content = (EmojiconTextView) convertView.findViewById(R.id.tv_content); holder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); holder.iv_icon = (CircleImageView) convertView.findViewById(R.id.iv_icon); return holder; } private static class ViewHolder { EmojiconTextView tv_content; TextView tv_name; TextView tv_time; CircleImageView iv_icon; } private void setEmojiconFragment(boolean useSystemDefault) { getSupportFragmentManager() .beginTransaction() .replace(R.id.emojicons, EmojiconsFragment.newInstance(useSystemDefault)) .commit(); } @Override public void onEmojiconBackspaceClicked(View v) { EmojiconsFragment.backspace(editEmojicon); } @Override public void onEmojiconClicked(Emojicon emojicon) { EmojiconsFragment.input(editEmojicon, emojicon); } @Override public void onBackPressed() { if (bool) { emojicons.setVisibility(View.GONE); bool = false; } else { ca = null; if (MainActivity.main != null) { if (MainActivity.main.message_fragment != null) { ContentValues values = new ContentValues(); values.put("result", 0); XmppService.resolver.update(XmppContentProvider.CONTENT_MESSAGES_URI, values, "main=? and type=?", new String[]{user.getUser() + xf.getUser().getUser(), "chat"}); MainActivity.main.message_fragment.initialData(); } } finish(); } } //此方法只是关闭软键盘 private void hintKbTwo() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm.isActive() && getCurrentFocus() != null) { if (getCurrentFocus().getWindowToken() != null) { imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } } }