Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 1 | package cx.ring.fragments; |
| 2 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 3 | import android.app.Activity; |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 4 | import android.content.Context; |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 5 | import android.content.DialogInterface; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 6 | import android.content.Intent; |
Aline Bonnet | 830c4c6 | 2016-12-27 14:02:02 -0500 | [diff] [blame] | 7 | import android.content.res.Configuration; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 8 | import android.graphics.Bitmap; |
| 9 | import android.os.Bundle; |
| 10 | import android.support.design.widget.Snackbar; |
| 11 | import android.support.v7.app.ActionBar; |
| 12 | import android.support.v7.app.AlertDialog; |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 13 | import android.support.v7.app.AppCompatActivity; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 14 | import android.support.v7.widget.DefaultItemAnimator; |
| 15 | import android.support.v7.widget.LinearLayoutManager; |
| 16 | import android.support.v7.widget.RecyclerView; |
| 17 | import android.util.Log; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 18 | import android.view.LayoutInflater; |
| 19 | import android.view.Menu; |
| 20 | import android.view.MenuInflater; |
| 21 | import android.view.MenuItem; |
| 22 | import android.view.View; |
| 23 | import android.view.ViewGroup; |
| 24 | import android.view.inputmethod.EditorInfo; |
| 25 | import android.widget.EditText; |
| 26 | import android.widget.Spinner; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 27 | |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 28 | import java.io.ByteArrayOutputStream; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 29 | |
| 30 | import javax.inject.Inject; |
| 31 | |
| 32 | import butterknife.BindView; |
| 33 | import butterknife.ButterKnife; |
| 34 | import butterknife.OnClick; |
| 35 | import butterknife.OnEditorAction; |
| 36 | import cx.ring.R; |
| 37 | import cx.ring.adapters.ContactDetailsTask; |
| 38 | import cx.ring.adapters.ConversationAdapter; |
| 39 | import cx.ring.adapters.NumberAdapter; |
| 40 | import cx.ring.application.RingApplication; |
| 41 | import cx.ring.client.CallActivity; |
Aline Bonnet | 830c4c6 | 2016-12-27 14:02:02 -0500 | [diff] [blame] | 42 | import cx.ring.client.ConversationActivity; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 43 | import cx.ring.client.HomeActivity; |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 44 | import cx.ring.conversation.ConversationPresenter; |
| 45 | import cx.ring.conversation.ConversationView; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 46 | import cx.ring.model.Account; |
| 47 | import cx.ring.model.CallContact; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 48 | import cx.ring.model.Conversation; |
| 49 | import cx.ring.model.Phone; |
| 50 | import cx.ring.model.Uri; |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 51 | import cx.ring.mvp.BaseFragment; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 52 | import cx.ring.service.LocalService; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 53 | import cx.ring.utils.ActionHelper; |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 54 | import cx.ring.utils.BitmapUtils; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 55 | import cx.ring.utils.ClipboardHelper; |
| 56 | import cx.ring.utils.ContentUriHandler; |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 57 | import cx.ring.utils.Tuple; |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 58 | import cx.ring.utils.VCardUtils; |
| 59 | import ezvcard.VCard; |
| 60 | import ezvcard.parameter.ImageType; |
| 61 | import ezvcard.property.Photo; |
| 62 | import ezvcard.property.RawProperty; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 63 | |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 64 | public class ConversationFragment extends BaseFragment<ConversationPresenter> implements |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 65 | Conversation.ConversationActionCallback, |
| 66 | ClipboardHelper.ClipboardHelperCallback, |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 67 | ContactDetailsTask.DetailsLoadedCallback, |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 68 | ConversationView { |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 69 | |
| 70 | private static final String TAG = ConversationFragment.class.getSimpleName(); |
| 71 | private static final String CONVERSATION_DELETE = "CONVERSATION_DELETE"; |
Aline Bonnet | 830c4c6 | 2016-12-27 14:02:02 -0500 | [diff] [blame] | 72 | private static final int MIN_SIZE_TABLET = 960; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 73 | |
| 74 | public static final int REQ_ADD_CONTACT = 42; |
| 75 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 76 | private LocalService.Callbacks mCallbacks = LocalService.DUMMY_CALLBACKS; |
| 77 | |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 78 | @Inject |
| 79 | protected ConversationPresenter conversationPresenter; |
| 80 | |
| 81 | @BindView(R.id.msg_input_txt) |
| 82 | protected EditText mMsgEditTxt; |
| 83 | |
| 84 | @BindView(R.id.ongoingcall_pane) |
| 85 | protected ViewGroup mBottomPane; |
| 86 | |
| 87 | @BindView(R.id.hist_list) |
| 88 | protected RecyclerView mHistList; |
| 89 | |
| 90 | @BindView(R.id.number_selector) |
| 91 | protected Spinner mNumberSpinner; |
| 92 | |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 93 | private AlertDialog mDeleteDialog; |
| 94 | private boolean mDeleteConversation = false; |
| 95 | |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 96 | private MenuItem mAddContactBtn = null; |
| 97 | |
| 98 | private ConversationAdapter mAdapter = null; |
| 99 | private NumberAdapter mNumberAdapter = null; |
| 100 | |
Aline Bonnet | 830c4c6 | 2016-12-27 14:02:02 -0500 | [diff] [blame] | 101 | public static Boolean isTabletMode(Context context) { |
| 102 | return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE |
| 103 | && context.getResources().getConfiguration().screenWidthDp >= MIN_SIZE_TABLET; |
| 104 | } |
| 105 | |
Thibault Wittemberg | e05a8e1 | 2016-12-12 15:39:36 -0500 | [diff] [blame] | 106 | static private int getIndex(Spinner spinner, Uri myString) { |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 107 | for (int i = 0, n = spinner.getCount(); i < n; i++) |
| 108 | if (((Phone) spinner.getItemAtPosition(i)).getNumber().equals(myString)) { |
| 109 | return i; |
| 110 | } |
| 111 | return 0; |
| 112 | } |
| 113 | |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 114 | @Override |
| 115 | public void refreshView(final Conversation conversation, Uri number) { |
| 116 | getActivity().runOnUiThread(new Runnable() { |
| 117 | @Override |
| 118 | public void run() { |
| 119 | final CallContact contact = conversation.getContact(); |
| 120 | if (contact != null) { |
| 121 | new ContactDetailsTask(getActivity(), contact, ConversationFragment.this).run(); |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 122 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 123 | |
| 124 | if (mAdapter != null) { |
| 125 | mAdapter.updateDataset(conversation.getAggregateHistory(), 0); |
| 126 | |
| 127 | if (mAdapter.getItemCount() > 0) { |
| 128 | mHistList.smoothScrollToPosition(mAdapter.getItemCount() - 1); |
| 129 | } |
| 130 | } |
| 131 | |
| 132 | getActivity().invalidateOptionsMenu(); |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 133 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 134 | }); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 135 | } |
| 136 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 137 | @Override |
| 138 | public void onAttach(Activity activity) { |
| 139 | Log.d(TAG, "onAttach"); |
| 140 | super.onAttach(activity); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 141 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 142 | if (!(activity instanceof LocalService.Callbacks)) { |
| 143 | throw new IllegalStateException("Activity must implement fragment's callbacks."); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 144 | } |
| 145 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 146 | mCallbacks = (LocalService.Callbacks) activity; |
| 147 | } |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 148 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 149 | @Override |
| 150 | public void onDetach() { |
| 151 | super.onDetach(); |
| 152 | Log.d(TAG, "onDetach"); |
| 153 | mCallbacks = LocalService.DUMMY_CALLBACKS; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 154 | } |
| 155 | |
| 156 | @Override |
| 157 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { |
| 158 | super.onCreateView(inflater, container, savedInstanceState); |
| 159 | |
| 160 | View inflatedView = inflater.inflate(R.layout.frag_conversation, container, false); |
| 161 | |
| 162 | ButterKnife.bind(this, inflatedView); |
| 163 | |
| 164 | // Dependency injection |
| 165 | ((RingApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this); |
| 166 | |
| 167 | if (mBottomPane != null) { |
| 168 | mBottomPane.setVisibility(View.GONE); |
| 169 | } |
| 170 | |
| 171 | LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); |
| 172 | mLayoutManager.setStackFromEnd(true); |
| 173 | |
| 174 | if (mHistList != null) { |
| 175 | mHistList.setLayoutManager(mLayoutManager); |
| 176 | mHistList.setAdapter(mAdapter); |
| 177 | mHistList.setItemAnimator(new DefaultItemAnimator()); |
| 178 | } |
| 179 | |
| 180 | // reload delete conversation state (before rotation) |
| 181 | mDeleteConversation = savedInstanceState != null && savedInstanceState.getBoolean(CONVERSATION_DELETE); |
| 182 | |
| 183 | setHasOptionsMenu(true); |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 184 | |
| 185 | LocalService service = mCallbacks.getService(); |
| 186 | if (service != null) { |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 187 | bindService(service); |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 188 | } |
| 189 | |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 190 | return inflatedView; |
| 191 | } |
| 192 | |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 193 | @Override |
| 194 | public void displaySendTrustRequest(final String accountId, final String contactId) { |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 195 | android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(getActivity()); |
| 196 | builder.setTitle(R.string.send_request_title); |
| 197 | builder.setMessage(R.string.send_request_msg); |
| 198 | |
| 199 | builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { |
| 200 | @Override |
| 201 | public void onClick(DialogInterface dialogInterface, int i) { |
| 202 | dialogInterface.cancel(); |
| 203 | } |
| 204 | }); |
| 205 | |
| 206 | builder.setPositiveButton(R.string.send_request_button, new DialogInterface.OnClickListener() { |
| 207 | @Override |
| 208 | public void onClick(DialogInterface dialogInterface, int i) { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 209 | VCard vcard = VCardUtils.loadLocalProfileFromDisk(getActivity().getFilesDir(), accountId); |
Alexandre Lision | 4511268 | 2017-03-31 13:49:49 -0400 | [diff] [blame] | 210 | if (vcard != null && !vcard.getPhotos().isEmpty()) { |
| 211 | // Reduce photo size to fit in one DHT packet |
| 212 | Bitmap photo = BitmapUtils.bytesToBitmap(vcard.getPhotos().get(0).getData()); |
| 213 | photo = BitmapUtils.reduceBitmap(photo, 30000); |
| 214 | ByteArrayOutputStream stream = new ByteArrayOutputStream(); |
| 215 | photo.compress(Bitmap.CompressFormat.PNG, 100, stream); |
| 216 | vcard.removeProperties(Photo.class); |
| 217 | vcard.addPhoto(new Photo(stream.toByteArray(), ImageType.PNG)); |
| 218 | vcard.removeProperties(RawProperty.class); |
| 219 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 220 | presenter.sendTrustRequest(accountId, contactId, vcard); |
Aline Bonnet | 8797053 | 2017-03-17 11:01:01 -0400 | [diff] [blame] | 221 | } |
| 222 | }); |
| 223 | |
| 224 | builder.show(); |
| 225 | } |
| 226 | |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 227 | public void bindService(final LocalService service) { |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 228 | mAdapter = new ConversationAdapter(getActivity(), |
| 229 | service.get40dpContactCache(), |
| 230 | service.getThreadPool()); |
| 231 | |
| 232 | if (mHistList != null) { |
| 233 | mHistList.setAdapter(mAdapter); |
| 234 | } |
| 235 | |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 236 | if (mDeleteConversation) { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 237 | presenter.deleteAction(); |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 238 | } |
| 239 | } |
| 240 | |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 241 | @OnClick(R.id.msg_send) |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 242 | public void sendMessageText() { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 243 | Uri number = mNumberAdapter == null ? |
| 244 | null : ((Phone) mNumberSpinner.getSelectedItem()).getNumber(); |
| 245 | presenter.sendTextMessage(mMsgEditTxt.getText().toString(), number); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 246 | } |
| 247 | |
| 248 | @OnEditorAction(R.id.msg_input_txt) |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 249 | public boolean actionSendMsgText(int actionId) { |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 250 | switch (actionId) { |
| 251 | case EditorInfo.IME_ACTION_SEND: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 252 | Uri number = mNumberAdapter == null ? |
| 253 | null : ((Phone) mNumberSpinner.getSelectedItem()).getNumber(); |
| 254 | presenter.sendTextMessage(mMsgEditTxt.getText().toString(), number); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 255 | return true; |
| 256 | } |
| 257 | return false; |
| 258 | } |
| 259 | |
| 260 | @OnClick(R.id.ongoingcall_pane) |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 261 | public void onClick() { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 262 | presenter.clickOnGoingPane(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 263 | } |
| 264 | |
| 265 | @Override |
| 266 | public void onPause() { |
| 267 | super.onPause(); |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 268 | presenter.pause(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | @Override |
| 272 | public void onResume() { |
| 273 | super.onResume(); |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 274 | presenter.resume(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 275 | } |
| 276 | |
| 277 | @Override |
| 278 | public void onDestroy() { |
| 279 | if (mDeleteConversation) { |
| 280 | mDeleteDialog.dismiss(); |
| 281 | } |
| 282 | |
| 283 | super.onDestroy(); |
| 284 | } |
| 285 | |
| 286 | @Override |
| 287 | public void onSaveInstanceState(Bundle outState) { |
| 288 | super.onSaveInstanceState(outState); |
| 289 | |
| 290 | // persist the delete popup state in case of Activity rotation |
| 291 | mDeleteConversation = mDeleteDialog != null && mDeleteDialog.isShowing(); |
| 292 | outState.putBoolean(CONVERSATION_DELETE, mDeleteConversation); |
| 293 | } |
| 294 | |
| 295 | @Override |
| 296 | public void onPrepareOptionsMenu(Menu menu) { |
| 297 | super.onPrepareOptionsMenu(menu); |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 298 | conversationPresenter.prepareMenu(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 299 | } |
| 300 | |
| 301 | @Override |
| 302 | public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 303 | inflater.inflate(R.menu.conversation_actions, menu); |
| 304 | mAddContactBtn = menu.findItem(R.id.menuitem_addcontact); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 305 | } |
| 306 | |
| 307 | @Override |
| 308 | public boolean onOptionsItemSelected(MenuItem item) { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 309 | Uri number; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 310 | switch (item.getItemId()) { |
| 311 | case android.R.id.home: |
| 312 | startActivity(new Intent(getActivity(), HomeActivity.class)); |
| 313 | return true; |
| 314 | case R.id.conv_action_audiocall: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 315 | number = mNumberAdapter == null ? |
| 316 | null : ((Phone) mNumberSpinner.getSelectedItem()).getNumber(); |
| 317 | conversationPresenter.callWithVideo(false, number); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 318 | return true; |
| 319 | case R.id.conv_action_videocall: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 320 | number = mNumberAdapter == null ? |
| 321 | null : ((Phone) mNumberSpinner.getSelectedItem()).getNumber(); |
| 322 | conversationPresenter.callWithVideo(true, number); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 323 | return true; |
| 324 | case R.id.menuitem_addcontact: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 325 | presenter.addContact(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 326 | return true; |
| 327 | case R.id.menuitem_delete: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 328 | presenter.deleteAction(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 329 | return true; |
| 330 | case R.id.menuitem_copy_content: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 331 | presenter.copyToClipboard(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 332 | return true; |
Aline Bonnet | 54cf69b | 2017-03-28 12:03:45 -0400 | [diff] [blame] | 333 | case R.id.menuitem_block: |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 334 | presenter.blockContact(); |
Aline Bonnet | 54cf69b | 2017-03-28 12:03:45 -0400 | [diff] [blame] | 335 | return true; |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 336 | default: |
| 337 | return super.onOptionsItemSelected(item); |
| 338 | } |
| 339 | } |
| 340 | |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 341 | @Override |
| 342 | public void deleteConversation(Conversation conversation) { |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 343 | presenter.deleteConversation(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 344 | } |
| 345 | |
| 346 | @Override |
| 347 | public void copyContactNumberToClipboard(String contactNumber) { |
| 348 | ClipboardHelper.copyNumberToClipboard(getActivity(), contactNumber, this); |
| 349 | } |
| 350 | |
| 351 | @Override |
| 352 | public void clipBoardDidCopyNumber(String copiedNumber) { |
| 353 | View view = getActivity().findViewById(android.R.id.content); |
| 354 | if (view != null) { |
| 355 | String snackbarText = getString(R.string.conversation_action_copied_peer_number_clipboard, |
Alexandre Lision | 6fd56c8 | 2017-01-30 09:05:54 -0500 | [diff] [blame] | 356 | ActionHelper.getShortenedNumber(copiedNumber)); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 357 | Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG).show(); |
| 358 | } |
| 359 | } |
| 360 | |
| 361 | @Override |
| 362 | public void onDetailsLoaded(Bitmap bmp, String formattedName) { |
Aline Bonnet | e8e87f6 | 2016-12-26 10:54:37 -0500 | [diff] [blame] | 363 | ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 364 | if (actionBar != null && formattedName != null) { |
| 365 | actionBar.setTitle(formattedName); |
| 366 | } |
| 367 | } |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 368 | |
| 369 | @Override |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 370 | protected ConversationPresenter createPresenter() { |
| 371 | return conversationPresenter; |
| 372 | } |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 373 | |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 374 | @Override |
| 375 | protected void initPresenter(ConversationPresenter presenter) { |
| 376 | super.initPresenter(presenter); |
| 377 | String conversationId = getArguments().getString("conversationID"); |
| 378 | Uri number = new Uri(getArguments().getString("number")); |
| 379 | conversationPresenter.init(conversationId, number); |
| 380 | } |
| 381 | |
| 382 | @Override |
| 383 | public void updateView(final String address, final String name, final int state) { |
| 384 | getActivity().runOnUiThread(new Runnable() { |
| 385 | @Override |
| 386 | public void run() { |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 387 | if (state != 0 || mNumberAdapter == null || mNumberAdapter.isEmpty()) { |
| 388 | return; |
| 389 | } |
| 390 | |
| 391 | for (int i = 0; i < mNumberAdapter.getCount(); i++) { |
| 392 | Phone phone = (Phone) mNumberAdapter.getItem(i); |
| 393 | if (phone.getNumber() != null) { |
| 394 | String ringID = phone.getNumber().getRawUriString(); |
| 395 | if (address.equals(ringID)) { |
| 396 | phone.getNumber().setUsername(name); |
| 397 | mNumberAdapter.notifyDataSetChanged(); |
| 398 | } |
| 399 | } |
| 400 | } |
| 401 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 402 | }); |
| 403 | } |
| 404 | |
| 405 | @Override |
| 406 | public void displayContactName(final String contactName) { |
| 407 | getActivity().runOnUiThread(new Runnable() { |
| 408 | @Override |
| 409 | public void run() { |
| 410 | if (((AppCompatActivity) getActivity()).getSupportActionBar() != null) { |
| 411 | ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(contactName); |
| 412 | } |
Alexandre Lision | 66a9f9a | 2017-02-26 20:28:27 -0500 | [diff] [blame] | 413 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 414 | }); |
| 415 | } |
| 416 | |
| 417 | @Override |
| 418 | public void displayOnGoingCallPane(final boolean display) { |
| 419 | getActivity().runOnUiThread(new Runnable() { |
| 420 | @Override |
| 421 | public void run() { |
| 422 | mBottomPane.setVisibility(display ? View.GONE : View.VISIBLE); |
| 423 | } |
| 424 | }); |
| 425 | } |
| 426 | |
| 427 | @Override |
| 428 | public void displayNumberSpinner(final Conversation conversation, final Uri number) { |
| 429 | getActivity().runOnUiThread(new Runnable() { |
| 430 | @Override |
| 431 | public void run() { |
| 432 | mNumberSpinner.setVisibility(View.VISIBLE); |
| 433 | mNumberAdapter = new NumberAdapter(getActivity(), |
| 434 | conversation.getContact(), |
| 435 | false); |
| 436 | mNumberSpinner.setAdapter(mNumberAdapter); |
| 437 | mNumberSpinner.setSelection(getIndex(mNumberSpinner, number)); |
| 438 | } |
| 439 | }); |
| 440 | } |
| 441 | |
| 442 | @Override |
| 443 | public void displayAddContact(final boolean display) { |
| 444 | getActivity().runOnUiThread(new Runnable() { |
| 445 | @Override |
| 446 | public void run() { |
| 447 | if (mAddContactBtn != null) { |
| 448 | mAddContactBtn.setVisible(display); |
| 449 | } |
| 450 | } |
| 451 | }); |
| 452 | } |
| 453 | |
| 454 | @Override |
| 455 | public void displayDeleteDialog(final Conversation conversation) { |
| 456 | getActivity().runOnUiThread(new Runnable() { |
| 457 | @Override |
| 458 | public void run() { |
| 459 | mDeleteDialog = ActionHelper.launchDeleteAction(getActivity(), |
| 460 | conversation, |
| 461 | ConversationFragment.this); |
| 462 | } |
| 463 | }); |
| 464 | } |
| 465 | |
| 466 | @Override |
| 467 | public void displayCopyToClipboard(CallContact callContact) { |
| 468 | ActionHelper.launchCopyNumberToClipboardFromContact(getActivity(), |
| 469 | callContact, |
| 470 | this); |
| 471 | } |
| 472 | |
| 473 | @Override |
| 474 | public void hideNumberSpinner() { |
| 475 | getActivity().runOnUiThread(new Runnable() { |
| 476 | @Override |
| 477 | public void run() { |
| 478 | mNumberSpinner.setVisibility(View.GONE); |
| 479 | } |
| 480 | }); |
| 481 | } |
| 482 | |
| 483 | @Override |
| 484 | public void clearMsgEdit() { |
| 485 | mMsgEditTxt.setText(""); |
| 486 | } |
| 487 | |
| 488 | @Override |
| 489 | public void goToHome() { |
| 490 | if (getActivity() instanceof ConversationActivity) { |
| 491 | getActivity().finish(); |
Aline Bonnet | eb5f7ff | 2017-01-17 11:09:17 -0500 | [diff] [blame] | 492 | } |
| 493 | } |
Hadrien De Sousa | ec95e5e | 2017-03-21 15:28:23 -0400 | [diff] [blame^] | 494 | |
| 495 | @Override |
| 496 | public void goToAddContact(CallContact callContact) { |
| 497 | startActivityForResult(ActionHelper.getAddNumberIntentForContact(callContact), REQ_ADD_CONTACT); |
| 498 | } |
| 499 | |
| 500 | @Override |
| 501 | public void goToCallActivity(String conferenceId) { |
| 502 | startActivity(new Intent(Intent.ACTION_VIEW) |
| 503 | .setClass(getActivity().getApplicationContext(), CallActivity.class) |
| 504 | .setData(android.net.Uri.withAppendedPath(ContentUriHandler.CONFERENCE_CONTENT_URI, conferenceId))); |
| 505 | } |
| 506 | |
| 507 | @Override |
| 508 | public void goToCallActivityWithResult(Tuple<Account, Uri> guess, boolean hasVideo) { |
| 509 | Intent intent = new Intent(CallActivity.ACTION_CALL) |
| 510 | .setClass(getActivity().getApplicationContext(), CallActivity.class) |
| 511 | .putExtra("account", guess.first.getAccountID()) |
| 512 | .putExtra("video", hasVideo) |
| 513 | .setData(android.net.Uri.parse(guess.second.getRawUriString())); |
| 514 | startActivityForResult(intent, HomeActivity.REQUEST_CODE_CALL); |
| 515 | } |
Aline Bonnet | 9c6defe | 2016-12-21 13:21:02 -0500 | [diff] [blame] | 516 | } |