1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2015 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.directshare;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity;
20*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
21*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
22*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
23*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView;
24*90c8c64dSAndroid Build Coastguard Worker import android.widget.Toast;
25*90c8c64dSAndroid Build Coastguard Worker 
26*90c8c64dSAndroid Build Coastguard Worker /**
27*90c8c64dSAndroid Build Coastguard Worker  * Provides the UI for sharing a text with a {@link Contact}.
28*90c8c64dSAndroid Build Coastguard Worker  */
29*90c8c64dSAndroid Build Coastguard Worker public class SendMessageActivity extends Activity {
30*90c8c64dSAndroid Build Coastguard Worker 
31*90c8c64dSAndroid Build Coastguard Worker     /**
32*90c8c64dSAndroid Build Coastguard Worker      * The request code for {@link SelectContactActivity}. This is used when the user doesn't select
33*90c8c64dSAndroid Build Coastguard Worker      * any of Direct Share icons.
34*90c8c64dSAndroid Build Coastguard Worker      */
35*90c8c64dSAndroid Build Coastguard Worker     private static final int REQUEST_SELECT_CONTACT = 1;
36*90c8c64dSAndroid Build Coastguard Worker 
37*90c8c64dSAndroid Build Coastguard Worker     /**
38*90c8c64dSAndroid Build Coastguard Worker      * The text to share.
39*90c8c64dSAndroid Build Coastguard Worker      */
40*90c8c64dSAndroid Build Coastguard Worker     private String mBody;
41*90c8c64dSAndroid Build Coastguard Worker 
42*90c8c64dSAndroid Build Coastguard Worker     /**
43*90c8c64dSAndroid Build Coastguard Worker      * The ID of the contact to share the text with.
44*90c8c64dSAndroid Build Coastguard Worker      */
45*90c8c64dSAndroid Build Coastguard Worker     private int mContactId;
46*90c8c64dSAndroid Build Coastguard Worker 
47*90c8c64dSAndroid Build Coastguard Worker     // View references.
48*90c8c64dSAndroid Build Coastguard Worker     private TextView mTextContactName;
49*90c8c64dSAndroid Build Coastguard Worker     private TextView mTextMessageBody;
50*90c8c64dSAndroid Build Coastguard Worker 
51*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)52*90c8c64dSAndroid Build Coastguard Worker     protected void onCreate(Bundle savedInstanceState) {
53*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
54*90c8c64dSAndroid Build Coastguard Worker         setContentView(R.layout.send_message);
55*90c8c64dSAndroid Build Coastguard Worker         setTitle(R.string.sending_message);
56*90c8c64dSAndroid Build Coastguard Worker         // View references.
57*90c8c64dSAndroid Build Coastguard Worker         mTextContactName = (TextView) findViewById(R.id.contact_name);
58*90c8c64dSAndroid Build Coastguard Worker         mTextMessageBody = (TextView) findViewById(R.id.message_body);
59*90c8c64dSAndroid Build Coastguard Worker         // Resolve the share Intent.
60*90c8c64dSAndroid Build Coastguard Worker         boolean resolved = resolveIntent(getIntent());
61*90c8c64dSAndroid Build Coastguard Worker         if (!resolved) {
62*90c8c64dSAndroid Build Coastguard Worker             finish();
63*90c8c64dSAndroid Build Coastguard Worker             return;
64*90c8c64dSAndroid Build Coastguard Worker         }
65*90c8c64dSAndroid Build Coastguard Worker         // Bind event handlers.
66*90c8c64dSAndroid Build Coastguard Worker         findViewById(R.id.send).setOnClickListener(mOnClickListener);
67*90c8c64dSAndroid Build Coastguard Worker         // Set up the UI.
68*90c8c64dSAndroid Build Coastguard Worker         prepareUi();
69*90c8c64dSAndroid Build Coastguard Worker         // The contact ID will not be passed on when the user clicks on the app icon rather than any
70*90c8c64dSAndroid Build Coastguard Worker         // of the Direct Share icons. In this case, we show another dialog for selecting a contact.
71*90c8c64dSAndroid Build Coastguard Worker         if (mContactId == Contact.INVALID_ID) {
72*90c8c64dSAndroid Build Coastguard Worker             selectContact();
73*90c8c64dSAndroid Build Coastguard Worker         }
74*90c8c64dSAndroid Build Coastguard Worker     }
75*90c8c64dSAndroid Build Coastguard Worker 
76*90c8c64dSAndroid Build Coastguard Worker     @Override
onActivityResult(int requestCode, int resultCode, Intent data)77*90c8c64dSAndroid Build Coastguard Worker     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
78*90c8c64dSAndroid Build Coastguard Worker         switch (requestCode) {
79*90c8c64dSAndroid Build Coastguard Worker             case REQUEST_SELECT_CONTACT:
80*90c8c64dSAndroid Build Coastguard Worker                 if (resultCode == RESULT_OK) {
81*90c8c64dSAndroid Build Coastguard Worker                     mContactId = data.getIntExtra(Contact.ID, Contact.INVALID_ID);
82*90c8c64dSAndroid Build Coastguard Worker                 }
83*90c8c64dSAndroid Build Coastguard Worker                 // Give up sharing the send_message if the user didn't choose a contact.
84*90c8c64dSAndroid Build Coastguard Worker                 if (mContactId == Contact.INVALID_ID) {
85*90c8c64dSAndroid Build Coastguard Worker                     finish();
86*90c8c64dSAndroid Build Coastguard Worker                     return;
87*90c8c64dSAndroid Build Coastguard Worker                 }
88*90c8c64dSAndroid Build Coastguard Worker                 prepareUi();
89*90c8c64dSAndroid Build Coastguard Worker                 break;
90*90c8c64dSAndroid Build Coastguard Worker             default:
91*90c8c64dSAndroid Build Coastguard Worker                 super.onActivityResult(requestCode, resultCode, data);
92*90c8c64dSAndroid Build Coastguard Worker         }
93*90c8c64dSAndroid Build Coastguard Worker     }
94*90c8c64dSAndroid Build Coastguard Worker 
95*90c8c64dSAndroid Build Coastguard Worker     /**
96*90c8c64dSAndroid Build Coastguard Worker      * Resolves the passed {@link Intent}. This method can only resolve intents for sharing a plain
97*90c8c64dSAndroid Build Coastguard Worker      * text. {@link #mBody} and {@link #mContactId} are modified accordingly.
98*90c8c64dSAndroid Build Coastguard Worker      *
99*90c8c64dSAndroid Build Coastguard Worker      * @param intent The {@link Intent}.
100*90c8c64dSAndroid Build Coastguard Worker      * @return True if the {@code intent} is resolved properly.
101*90c8c64dSAndroid Build Coastguard Worker      */
resolveIntent(Intent intent)102*90c8c64dSAndroid Build Coastguard Worker     private boolean resolveIntent(Intent intent) {
103*90c8c64dSAndroid Build Coastguard Worker         if (Intent.ACTION_SEND.equals(intent.getAction()) &&
104*90c8c64dSAndroid Build Coastguard Worker                 "text/plain".equals(intent.getType())) {
105*90c8c64dSAndroid Build Coastguard Worker             mBody = intent.getStringExtra(Intent.EXTRA_TEXT);
106*90c8c64dSAndroid Build Coastguard Worker             mContactId = intent.getIntExtra(Contact.ID, Contact.INVALID_ID);
107*90c8c64dSAndroid Build Coastguard Worker             return true;
108*90c8c64dSAndroid Build Coastguard Worker         }
109*90c8c64dSAndroid Build Coastguard Worker         return false;
110*90c8c64dSAndroid Build Coastguard Worker     }
111*90c8c64dSAndroid Build Coastguard Worker 
112*90c8c64dSAndroid Build Coastguard Worker     /**
113*90c8c64dSAndroid Build Coastguard Worker      * Sets up the UI.
114*90c8c64dSAndroid Build Coastguard Worker      */
prepareUi()115*90c8c64dSAndroid Build Coastguard Worker     private void prepareUi() {
116*90c8c64dSAndroid Build Coastguard Worker         if (mContactId != Contact.INVALID_ID) {
117*90c8c64dSAndroid Build Coastguard Worker             Contact contact = Contact.byId(mContactId);
118*90c8c64dSAndroid Build Coastguard Worker             ContactViewBinder.bind(contact, mTextContactName);
119*90c8c64dSAndroid Build Coastguard Worker         }
120*90c8c64dSAndroid Build Coastguard Worker         mTextMessageBody.setText(mBody);
121*90c8c64dSAndroid Build Coastguard Worker     }
122*90c8c64dSAndroid Build Coastguard Worker 
123*90c8c64dSAndroid Build Coastguard Worker     /**
124*90c8c64dSAndroid Build Coastguard Worker      * Delegates selection of a {@Contact} to {@link SelectContactActivity}.
125*90c8c64dSAndroid Build Coastguard Worker      */
selectContact()126*90c8c64dSAndroid Build Coastguard Worker     private void selectContact() {
127*90c8c64dSAndroid Build Coastguard Worker         Intent intent = new Intent(this, SelectContactActivity.class);
128*90c8c64dSAndroid Build Coastguard Worker         intent.setAction(SelectContactActivity.ACTION_SELECT_CONTACT);
129*90c8c64dSAndroid Build Coastguard Worker         startActivityForResult(intent, REQUEST_SELECT_CONTACT);
130*90c8c64dSAndroid Build Coastguard Worker     }
131*90c8c64dSAndroid Build Coastguard Worker 
132*90c8c64dSAndroid Build Coastguard Worker     private View.OnClickListener mOnClickListener = new View.OnClickListener() {
133*90c8c64dSAndroid Build Coastguard Worker         @Override
134*90c8c64dSAndroid Build Coastguard Worker         public void onClick(View view) {
135*90c8c64dSAndroid Build Coastguard Worker             switch (view.getId()) {
136*90c8c64dSAndroid Build Coastguard Worker                 case R.id.send:
137*90c8c64dSAndroid Build Coastguard Worker                     send();
138*90c8c64dSAndroid Build Coastguard Worker                     break;
139*90c8c64dSAndroid Build Coastguard Worker             }
140*90c8c64dSAndroid Build Coastguard Worker         }
141*90c8c64dSAndroid Build Coastguard Worker     };
142*90c8c64dSAndroid Build Coastguard Worker 
143*90c8c64dSAndroid Build Coastguard Worker     /**
144*90c8c64dSAndroid Build Coastguard Worker      * Pretends to send the text to the contact. This only shows a placeholder message.
145*90c8c64dSAndroid Build Coastguard Worker      */
send()146*90c8c64dSAndroid Build Coastguard Worker     private void send() {
147*90c8c64dSAndroid Build Coastguard Worker         Toast.makeText(this,
148*90c8c64dSAndroid Build Coastguard Worker                 getString(R.string.message_sent, mBody, Contact.byId(mContactId).getName()),
149*90c8c64dSAndroid Build Coastguard Worker                 Toast.LENGTH_SHORT).show();
150*90c8c64dSAndroid Build Coastguard Worker         finish();
151*90c8c64dSAndroid Build Coastguard Worker     }
152*90c8c64dSAndroid Build Coastguard Worker 
153*90c8c64dSAndroid Build Coastguard Worker }
154