1 
2 package com.example.android.wifidirect.discovery;
3 
4 import android.app.Fragment;
5 import android.content.Context;
6 import android.os.Bundle;
7 import android.os.Handler;
8 import android.view.LayoutInflater;
9 import android.view.View;
10 import android.view.ViewGroup;
11 import android.widget.ArrayAdapter;
12 import android.widget.ListView;
13 import android.widget.TextView;
14 
15 import java.util.ArrayList;
16 import java.util.List;
17 
18 /**
19  * This fragment handles chat related UI which includes a list view for messages
20  * and a message entry field with send button.
21  */
22 public class WiFiChatFragment extends Fragment {
23 
24     private View view;
25     private ChatManager chatManager;
26     private TextView chatLine;
27     private ListView listView;
28     ChatMessageAdapter adapter = null;
29     private List<String> items = new ArrayList<String>();
30 
31     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)32     public View onCreateView(LayoutInflater inflater, ViewGroup container,
33             Bundle savedInstanceState) {
34         view = inflater.inflate(R.layout.fragment_chat, container, false);
35         chatLine = (TextView) view.findViewById(R.id.txtChatLine);
36         listView = (ListView) view.findViewById(android.R.id.list);
37         adapter = new ChatMessageAdapter(getActivity(), android.R.id.text1,
38                 items);
39         listView.setAdapter(adapter);
40         view.findViewById(R.id.button1).setOnClickListener(
41                 new View.OnClickListener() {
42 
43                     @Override
44                     public void onClick(View arg0) {
45                         if (chatManager != null) {
46                             chatManager.write(chatLine.getText().toString()
47                                     .getBytes());
48                             pushMessage("Me: " + chatLine.getText().toString());
49                             chatLine.setText("");
50                             chatLine.clearFocus();
51                         }
52                     }
53                 });
54         return view;
55     }
56 
57     public interface MessageTarget {
getHandler()58         public Handler getHandler();
59     }
60 
setChatManager(ChatManager obj)61     public void setChatManager(ChatManager obj) {
62         chatManager = obj;
63     }
64 
pushMessage(String readMessage)65     public void pushMessage(String readMessage) {
66         adapter.add(readMessage);
67         adapter.notifyDataSetChanged();
68     }
69 
70     /**
71      * ArrayAdapter to manage chat messages.
72      */
73     public class ChatMessageAdapter extends ArrayAdapter<String> {
74 
75         List<String> messages = null;
76 
ChatMessageAdapter(Context context, int textViewResourceId, List<String> items)77         public ChatMessageAdapter(Context context, int textViewResourceId,
78                 List<String> items) {
79             super(context, textViewResourceId, items);
80         }
81 
82         @Override
getView(int position, View convertView, ViewGroup parent)83         public View getView(int position, View convertView, ViewGroup parent) {
84             View v = convertView;
85             if (v == null) {
86                 LayoutInflater vi = (LayoutInflater) getActivity()
87                         .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
88                 v = vi.inflate(android.R.layout.simple_list_item_1, null);
89             }
90             String message = items.get(position);
91             if (message != null && !message.isEmpty()) {
92                 TextView nameText = (TextView) v
93                         .findViewById(android.R.id.text1);
94 
95                 if (nameText != null) {
96                     nameText.setText(message);
97                     if (message.startsWith("Me: ")) {
98                         nameText.setTextAppearance(getActivity(),
99                                 R.style.normalText);
100                     } else {
101                         nameText.setTextAppearance(getActivity(),
102                                 R.style.boldText);
103                     }
104                 }
105             }
106             return v;
107         }
108     }
109 }
110