1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.messagingservice;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.app.Fragment;
20*90c8c64dSAndroid Build Coastguard Worker import android.content.ComponentName;
21*90c8c64dSAndroid Build Coastguard Worker import android.content.Context;
22*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
23*90c8c64dSAndroid Build Coastguard Worker import android.content.ServiceConnection;
24*90c8c64dSAndroid Build Coastguard Worker import android.content.SharedPreferences;
25*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
26*90c8c64dSAndroid Build Coastguard Worker import android.os.IBinder;
27*90c8c64dSAndroid Build Coastguard Worker import android.os.Message;
28*90c8c64dSAndroid Build Coastguard Worker import android.os.Messenger;
29*90c8c64dSAndroid Build Coastguard Worker import android.os.RemoteException;
30*90c8c64dSAndroid Build Coastguard Worker import android.text.method.ScrollingMovementMethod;
31*90c8c64dSAndroid Build Coastguard Worker import android.util.Log;
32*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
33*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
34*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
35*90c8c64dSAndroid Build Coastguard Worker import android.widget.Button;
36*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView;
37*90c8c64dSAndroid Build Coastguard Worker 
38*90c8c64dSAndroid Build Coastguard Worker /**
39*90c8c64dSAndroid Build Coastguard Worker  * The main fragment that shows the buttons and the text view containing the log.
40*90c8c64dSAndroid Build Coastguard Worker  */
41*90c8c64dSAndroid Build Coastguard Worker public class MessagingFragment extends Fragment implements View.OnClickListener {
42*90c8c64dSAndroid Build Coastguard Worker 
43*90c8c64dSAndroid Build Coastguard Worker     private static final String TAG = MessagingFragment.class.getSimpleName();
44*90c8c64dSAndroid Build Coastguard Worker 
45*90c8c64dSAndroid Build Coastguard Worker     private Button mSendSingleConversation;
46*90c8c64dSAndroid Build Coastguard Worker     private Button mSendTwoConversations;
47*90c8c64dSAndroid Build Coastguard Worker     private Button mSendConversationWithThreeMessages;
48*90c8c64dSAndroid Build Coastguard Worker     private TextView mDataPortView;
49*90c8c64dSAndroid Build Coastguard Worker     private Button mClearLogButton;
50*90c8c64dSAndroid Build Coastguard Worker 
51*90c8c64dSAndroid Build Coastguard Worker     private Messenger mService;
52*90c8c64dSAndroid Build Coastguard Worker     private boolean mBound;
53*90c8c64dSAndroid Build Coastguard Worker 
54*90c8c64dSAndroid Build Coastguard Worker     private final ServiceConnection mConnection = new ServiceConnection() {
55*90c8c64dSAndroid Build Coastguard Worker         @Override
56*90c8c64dSAndroid Build Coastguard Worker         public void onServiceConnected(ComponentName componentName, IBinder service) {
57*90c8c64dSAndroid Build Coastguard Worker             mService = new Messenger(service);
58*90c8c64dSAndroid Build Coastguard Worker             mBound = true;
59*90c8c64dSAndroid Build Coastguard Worker             setButtonsState(true);
60*90c8c64dSAndroid Build Coastguard Worker         }
61*90c8c64dSAndroid Build Coastguard Worker 
62*90c8c64dSAndroid Build Coastguard Worker         @Override
63*90c8c64dSAndroid Build Coastguard Worker         public void onServiceDisconnected(ComponentName componentName) {
64*90c8c64dSAndroid Build Coastguard Worker             mService = null;
65*90c8c64dSAndroid Build Coastguard Worker             mBound = false;
66*90c8c64dSAndroid Build Coastguard Worker             setButtonsState(false);
67*90c8c64dSAndroid Build Coastguard Worker         }
68*90c8c64dSAndroid Build Coastguard Worker     };
69*90c8c64dSAndroid Build Coastguard Worker 
70*90c8c64dSAndroid Build Coastguard Worker     private final SharedPreferences.OnSharedPreferenceChangeListener listener =
71*90c8c64dSAndroid Build Coastguard Worker             new SharedPreferences.OnSharedPreferenceChangeListener() {
72*90c8c64dSAndroid Build Coastguard Worker         @Override
73*90c8c64dSAndroid Build Coastguard Worker         public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
74*90c8c64dSAndroid Build Coastguard Worker             if (MessageLogger.LOG_KEY.equals(key)) {
75*90c8c64dSAndroid Build Coastguard Worker                 mDataPortView.setText(MessageLogger.getAllMessages(getActivity()));
76*90c8c64dSAndroid Build Coastguard Worker             }
77*90c8c64dSAndroid Build Coastguard Worker         }
78*90c8c64dSAndroid Build Coastguard Worker     };
79*90c8c64dSAndroid Build Coastguard Worker 
MessagingFragment()80*90c8c64dSAndroid Build Coastguard Worker     public MessagingFragment() {
81*90c8c64dSAndroid Build Coastguard Worker     }
82*90c8c64dSAndroid Build Coastguard Worker 
83*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)84*90c8c64dSAndroid Build Coastguard Worker     public View onCreateView(LayoutInflater inflater, ViewGroup container,
85*90c8c64dSAndroid Build Coastguard Worker                              Bundle savedInstanceState) {
86*90c8c64dSAndroid Build Coastguard Worker         View rootView = inflater.inflate(R.layout.fragment_message_me, container, false);
87*90c8c64dSAndroid Build Coastguard Worker 
88*90c8c64dSAndroid Build Coastguard Worker         mSendSingleConversation = (Button) rootView.findViewById(R.id.send_1_conversation);
89*90c8c64dSAndroid Build Coastguard Worker         mSendSingleConversation.setOnClickListener(this);
90*90c8c64dSAndroid Build Coastguard Worker 
91*90c8c64dSAndroid Build Coastguard Worker         mSendTwoConversations = (Button) rootView.findViewById(R.id.send_2_conversations);
92*90c8c64dSAndroid Build Coastguard Worker         mSendTwoConversations.setOnClickListener(this);
93*90c8c64dSAndroid Build Coastguard Worker 
94*90c8c64dSAndroid Build Coastguard Worker         mSendConversationWithThreeMessages =
95*90c8c64dSAndroid Build Coastguard Worker                 (Button) rootView.findViewById(R.id.send_1_conversation_3_messages);
96*90c8c64dSAndroid Build Coastguard Worker         mSendConversationWithThreeMessages.setOnClickListener(this);
97*90c8c64dSAndroid Build Coastguard Worker 
98*90c8c64dSAndroid Build Coastguard Worker         mDataPortView = (TextView) rootView.findViewById(R.id.data_port);
99*90c8c64dSAndroid Build Coastguard Worker         mDataPortView.setMovementMethod(new ScrollingMovementMethod());
100*90c8c64dSAndroid Build Coastguard Worker 
101*90c8c64dSAndroid Build Coastguard Worker         mClearLogButton = (Button) rootView.findViewById(R.id.clear);
102*90c8c64dSAndroid Build Coastguard Worker         mClearLogButton.setOnClickListener(this);
103*90c8c64dSAndroid Build Coastguard Worker 
104*90c8c64dSAndroid Build Coastguard Worker         setButtonsState(false);
105*90c8c64dSAndroid Build Coastguard Worker 
106*90c8c64dSAndroid Build Coastguard Worker         return rootView;
107*90c8c64dSAndroid Build Coastguard Worker     }
108*90c8c64dSAndroid Build Coastguard Worker 
109*90c8c64dSAndroid Build Coastguard Worker     @Override
onClick(View view)110*90c8c64dSAndroid Build Coastguard Worker     public void onClick(View view) {
111*90c8c64dSAndroid Build Coastguard Worker         if (view == mSendSingleConversation) {
112*90c8c64dSAndroid Build Coastguard Worker             sendMsg(1, 1);
113*90c8c64dSAndroid Build Coastguard Worker         } else if (view == mSendTwoConversations) {
114*90c8c64dSAndroid Build Coastguard Worker             sendMsg(2, 1);
115*90c8c64dSAndroid Build Coastguard Worker         } else if (view == mSendConversationWithThreeMessages) {
116*90c8c64dSAndroid Build Coastguard Worker             sendMsg(1, 3);
117*90c8c64dSAndroid Build Coastguard Worker         } else if (view == mClearLogButton) {
118*90c8c64dSAndroid Build Coastguard Worker             MessageLogger.clear(getActivity());
119*90c8c64dSAndroid Build Coastguard Worker             mDataPortView.setText(MessageLogger.getAllMessages(getActivity()));
120*90c8c64dSAndroid Build Coastguard Worker         }
121*90c8c64dSAndroid Build Coastguard Worker     }
122*90c8c64dSAndroid Build Coastguard Worker 
123*90c8c64dSAndroid Build Coastguard Worker     @Override
onStart()124*90c8c64dSAndroid Build Coastguard Worker     public void onStart() {
125*90c8c64dSAndroid Build Coastguard Worker         super.onStart();
126*90c8c64dSAndroid Build Coastguard Worker         getActivity().bindService(new Intent(getActivity(), MessagingService.class), mConnection,
127*90c8c64dSAndroid Build Coastguard Worker                 Context.BIND_AUTO_CREATE);
128*90c8c64dSAndroid Build Coastguard Worker     }
129*90c8c64dSAndroid Build Coastguard Worker 
130*90c8c64dSAndroid Build Coastguard Worker     @Override
onPause()131*90c8c64dSAndroid Build Coastguard Worker     public void onPause() {
132*90c8c64dSAndroid Build Coastguard Worker         super.onPause();
133*90c8c64dSAndroid Build Coastguard Worker         MessageLogger.getPrefs(getActivity()).unregisterOnSharedPreferenceChangeListener(listener);
134*90c8c64dSAndroid Build Coastguard Worker     }
135*90c8c64dSAndroid Build Coastguard Worker 
136*90c8c64dSAndroid Build Coastguard Worker     @Override
onResume()137*90c8c64dSAndroid Build Coastguard Worker     public void onResume() {
138*90c8c64dSAndroid Build Coastguard Worker         super.onResume();
139*90c8c64dSAndroid Build Coastguard Worker         mDataPortView.setText(MessageLogger.getAllMessages(getActivity()));
140*90c8c64dSAndroid Build Coastguard Worker         MessageLogger.getPrefs(getActivity()).registerOnSharedPreferenceChangeListener(listener);
141*90c8c64dSAndroid Build Coastguard Worker     }
142*90c8c64dSAndroid Build Coastguard Worker 
143*90c8c64dSAndroid Build Coastguard Worker     @Override
onStop()144*90c8c64dSAndroid Build Coastguard Worker     public void onStop() {
145*90c8c64dSAndroid Build Coastguard Worker         super.onStop();
146*90c8c64dSAndroid Build Coastguard Worker         if (mBound) {
147*90c8c64dSAndroid Build Coastguard Worker             getActivity().unbindService(mConnection);
148*90c8c64dSAndroid Build Coastguard Worker             mBound = false;
149*90c8c64dSAndroid Build Coastguard Worker         }
150*90c8c64dSAndroid Build Coastguard Worker     }
151*90c8c64dSAndroid Build Coastguard Worker 
sendMsg(int howManyConversations, int messagesPerConversation)152*90c8c64dSAndroid Build Coastguard Worker     private void sendMsg(int howManyConversations, int messagesPerConversation) {
153*90c8c64dSAndroid Build Coastguard Worker         if (mBound) {
154*90c8c64dSAndroid Build Coastguard Worker             Message msg = Message.obtain(null, MessagingService.MSG_SEND_NOTIFICATION,
155*90c8c64dSAndroid Build Coastguard Worker                     howManyConversations, messagesPerConversation);
156*90c8c64dSAndroid Build Coastguard Worker             try {
157*90c8c64dSAndroid Build Coastguard Worker                 mService.send(msg);
158*90c8c64dSAndroid Build Coastguard Worker             } catch (RemoteException e) {
159*90c8c64dSAndroid Build Coastguard Worker                 Log.e(TAG, "Error sending a message", e);
160*90c8c64dSAndroid Build Coastguard Worker                 MessageLogger.logMessage(getActivity(), "Error occurred while sending a message.");
161*90c8c64dSAndroid Build Coastguard Worker             }
162*90c8c64dSAndroid Build Coastguard Worker         }
163*90c8c64dSAndroid Build Coastguard Worker     }
164*90c8c64dSAndroid Build Coastguard Worker 
setButtonsState(boolean enable)165*90c8c64dSAndroid Build Coastguard Worker     private void setButtonsState(boolean enable) {
166*90c8c64dSAndroid Build Coastguard Worker         mSendSingleConversation.setEnabled(enable);
167*90c8c64dSAndroid Build Coastguard Worker         mSendTwoConversations.setEnabled(enable);
168*90c8c64dSAndroid Build Coastguard Worker         mSendConversationWithThreeMessages.setEnabled(enable);
169*90c8c64dSAndroid Build Coastguard Worker     }
170*90c8c64dSAndroid Build Coastguard Worker }
171