blob: 3f8cc908b100ebf93e732962d6f70a8fcec13097 [file] [log] [blame]
Loïc Siret0202fbf2017-09-28 16:34:28 -04001/*
Sébastien Blinab53ada2019-01-02 17:23:00 -05002 * Copyright (C) 2004-2019 Savoir-faire Linux Inc.
Loïc Siret0202fbf2017-09-28 16:34:28 -04003 *
Adrien Béraud64538722018-03-15 17:34:00 -04004 * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
5 *
Loïc Siret0202fbf2017-09-28 16:34:28 -04006 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
Aline Bonnet9c6defe2016-12-21 13:21:02 -050020package cx.ring.fragments;
21
Pierre Duchemin4af6b392018-02-02 11:23:56 -050022import android.Manifest;
Adrien Béraud772e2162019-02-12 16:00:21 -050023import android.animation.ValueAnimator;
Adrien Béraud1b8ac9f2018-05-31 14:34:23 -040024import android.app.DownloadManager;
Rayan Osseirane4450272019-06-03 14:17:19 -040025import android.content.ActivityNotFoundException;
Adrien Béraudae45ffa2018-07-06 16:21:29 -040026import android.content.ClipData;
Adrien Béraud1b8ac9f2018-05-31 14:34:23 -040027import android.content.Context;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050028import android.content.Intent;
Adrien Béraud3a875a02018-07-18 17:54:17 -040029import android.content.SharedPreferences;
Adrien Béraud4f542f92019-01-03 12:17:53 -050030import android.content.pm.PackageManager;
Adrien Béraud78ae7b92018-08-25 19:04:17 -040031import android.graphics.drawable.BitmapDrawable;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050032import android.os.Bundle;
Adrien Béraud64538722018-03-15 17:34:00 -040033import android.provider.MediaStore;
Adrien Béraud3c483ce2019-01-02 17:33:49 -050034
35import androidx.annotation.NonNull;
Adrien Béraudb28c4912018-12-02 22:58:52 -050036import androidx.annotation.Nullable;
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -050037
Adrien Béraud8bc95102018-08-25 22:34:51 -040038import androidx.core.content.FileProvider;
39import androidx.appcompat.app.ActionBar;
Adrien Béraud8bc95102018-08-25 22:34:51 -040040import androidx.appcompat.app.AppCompatActivity;
41import androidx.recyclerview.widget.DefaultItemAnimator;
Adrien Béraud8bc95102018-08-25 22:34:51 -040042
Adrien Béraud3a875a02018-07-18 17:54:17 -040043import android.text.Editable;
Adrien Béraud58bd92b2018-08-23 10:54:25 -040044import android.text.TextUtils;
Adrien Béraud3a875a02018-07-18 17:54:17 -040045import android.text.TextWatcher;
Pierre Duchemine0c3a492018-02-01 16:22:45 -050046import android.util.Log;
Adrien Béraudb28c4912018-12-02 22:58:52 -050047import android.view.LayoutInflater;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050048import android.view.Menu;
49import android.view.MenuInflater;
50import android.view.MenuItem;
51import android.view.View;
52import android.view.ViewGroup;
53import android.view.inputmethod.EditorInfo;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050054import android.widget.Spinner;
Pierre Duchemine0c3a492018-02-01 16:22:45 -050055import android.widget.Toast;
56
Rayan Osseirane4450272019-06-03 14:17:19 -040057import com.google.android.material.snackbar.Snackbar;
58
Pierre Duchemine0c3a492018-02-01 16:22:45 -050059import java.io.File;
60import java.io.IOException;
Adrien Béraudace37a22018-06-22 14:58:36 -040061import java.util.List;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050062
Aline Bonnet9c6defe2016-12-21 13:21:02 -050063import butterknife.OnEditorAction;
Adrien Béraud5b47cb52018-07-06 16:24:14 -040064import cx.ring.BuildConfig;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050065import cx.ring.R;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050066import cx.ring.adapters.ConversationAdapter;
67import cx.ring.adapters.NumberAdapter;
Adrien Béraudb28c4912018-12-02 22:58:52 -050068import cx.ring.application.RingApplication;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050069import cx.ring.client.CallActivity;
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -050070import cx.ring.client.ContactDetailsActivity;
Aline Bonnet830c4c62016-12-27 14:02:02 -050071import cx.ring.client.ConversationActivity;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050072import cx.ring.client.HomeActivity;
Adrien Béraud78ae7b92018-08-25 19:04:17 -040073import cx.ring.contacts.AvatarFactory;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040074import cx.ring.conversation.ConversationPresenter;
75import cx.ring.conversation.ConversationView;
Adrien Béraudb28c4912018-12-02 22:58:52 -050076import cx.ring.databinding.FragConversationBinding;
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040077import cx.ring.dependencyinjection.RingInjectionComponent;
Adrien Béraud171ba362018-12-14 21:35:40 -050078import cx.ring.interfaces.Colorable;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050079import cx.ring.model.CallContact;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050080import cx.ring.model.Conversation;
Adrien Béraudace37a22018-06-22 14:58:36 -040081import cx.ring.model.ConversationElement;
Adrien Béraud21533292018-03-22 14:11:35 -040082import cx.ring.model.DataTransfer;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050083import cx.ring.model.Phone;
Pierre Duchemine0c3a492018-02-01 16:22:45 -050084import cx.ring.model.RingError;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050085import cx.ring.model.Uri;
Adrien Bérauda373e3b2018-12-12 11:14:50 -050086import cx.ring.mvp.BaseSupportFragment;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040087import cx.ring.services.NotificationService;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050088import cx.ring.utils.ActionHelper;
Adrien Béraud64538722018-03-15 17:34:00 -040089import cx.ring.utils.AndroidFileUtils;
Adrien Béraud64538722018-03-15 17:34:00 -040090import cx.ring.utils.ContentUriHandler;
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -050091import cx.ring.utils.MediaButtonsHelper;
Adrien Béraud44939482019-02-13 21:42:08 -050092import io.reactivex.Completable;
Adrien Béraud78ae7b92018-08-25 19:04:17 -040093import io.reactivex.android.schedulers.AndroidSchedulers;
94import io.reactivex.disposables.Disposable;
Aline Bonnet9c6defe2016-12-21 13:21:02 -050095
Pierre Duchemine0c3a492018-02-01 16:22:45 -050096import static android.app.Activity.RESULT_OK;
97
Adrien Bérauda373e3b2018-12-12 11:14:50 -050098public class ConversationFragment extends BaseSupportFragment<ConversationPresenter> implements
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -050099 MediaButtonsHelper.MediaButtonsHelperCallback,
Rayan Osseirane634a562019-05-29 13:44:55 -0400100 ConversationView, SharedPreferences.OnSharedPreferenceChangeListener {
Adrien Béraud64538722018-03-15 17:34:00 -0400101 protected static final String TAG = ConversationFragment.class.getSimpleName();
102
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400103 public static final int REQ_ADD_CONTACT = 42;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400104
Adrien Béraud6ac63632018-12-09 00:11:21 -0500105 public static final String KEY_CONTACT_RING_ID = BuildConfig.APPLICATION_ID + ".CONTACT_RING_ID";
106 public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + ".ACCOUNT_ID";
Adrien Béraud3a875a02018-07-18 17:54:17 -0400107 public static final String KEY_PREFERENCE_PENDING_MESSAGE = "pendingMessage";
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500108 public static final String KEY_PREFERENCE_CONVERSATION_COLOR = "color";
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500109
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500110 private static final int REQUEST_CODE_FILE_PICKER = 1000;
Pierre Duchemin4af6b392018-02-02 11:23:56 -0500111 private static final int REQUEST_PERMISSION_CAMERA = 1001;
Adrien Béraud64538722018-03-15 17:34:00 -0400112 private static final int REQUEST_CODE_TAKE_PICTURE = 1002;
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500113
Adrien Béraudb28c4912018-12-02 22:58:52 -0500114 private FragConversationBinding binding;
Adrien Béraud5b47cb52018-07-06 16:24:14 -0400115 private MenuItem mAudioCallBtn = null;
116 private MenuItem mVideoCallBtn = null;
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500117
118 private ConversationAdapter mAdapter = null;
119 private NumberAdapter mNumberAdapter = null;
Adrien Béraud772e2162019-02-12 16:00:21 -0500120 private int marginPx;
121 private final ValueAnimator animation = new ValueAnimator();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500122
Adrien Béraud3a875a02018-07-18 17:54:17 -0400123 private SharedPreferences mPreferences;
124
Adrien Béraud64538722018-03-15 17:34:00 -0400125 private File mCurrentPhoto = null;
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400126 private Disposable actionbarTarget = null;
Rayan Osseirane634a562019-05-29 13:44:55 -0400127 private static int position;
128
Adrien Béraud64538722018-03-15 17:34:00 -0400129
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500130 private static int getIndex(Spinner spinner, Uri myString) {
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500131 for (int i = 0, n = spinner.getCount(); i < n; i++)
132 if (((Phone) spinner.getItemAtPosition(i)).getNumber().equals(myString)) {
133 return i;
134 }
135 return 0;
136 }
137
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400138 @Override
Adrien Béraudace37a22018-06-22 14:58:36 -0400139 public void refreshView(final List<ConversationElement> conversation) {
Adrien Béraud20d42212018-03-02 14:40:38 -0500140 if (conversation == null) {
141 return;
142 }
Adrien Béraudb28c4912018-12-02 22:58:52 -0500143 if (binding != null)
144 binding.pbLoading.setVisibility(View.GONE);
Adrien Béraudace37a22018-06-22 14:58:36 -0400145 if (mAdapter != null) {
146 mAdapter.updateDataset(conversation);
147 }
148 getActivity().invalidateOptionsMenu();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500149 }
150
Aline Bonnete8e87f62016-12-26 10:54:37 -0500151 @Override
Adrien Béraud64538722018-03-15 17:34:00 -0400152 public void scrollToEnd() {
Adrien Béraudace37a22018-06-22 14:58:36 -0400153 if (mAdapter.getItemCount() > 0) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500154 binding.histList.scrollToPosition(mAdapter.getItemCount() - 1);
Adrien Béraudace37a22018-06-22 14:58:36 -0400155 }
Adrien Béraud64538722018-03-15 17:34:00 -0400156 }
157
158 @Override
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -0400159 public int getLayout() {
160 return R.layout.frag_conversation;
161 }
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500162
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -0400163 @Override
164 public void injectFragment(RingInjectionComponent component) {
165 component.inject(this);
166 }
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500167
Adrien Béraudb28c4912018-12-02 22:58:52 -0500168 @Nullable
169 @Override
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500170 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500171 injectFragment(((RingApplication) getActivity().getApplication()).getRingInjectionComponent());
Adrien Béraud772e2162019-02-12 16:00:21 -0500172 marginPx = getResources().getDimensionPixelSize(R.dimen.margin_message_input);
173 animation.setDuration(150);
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500174 binding = FragConversationBinding.inflate(inflater, container, false);
Adrien Béraudb28c4912018-12-02 22:58:52 -0500175 binding.setPresenter(this);
176 return binding.getRoot();
177 }
178
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -0400179 @Override
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500180 public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -0400181 super.onViewCreated(view, savedInstanceState);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500182
Adrien Béraud1af6c012019-05-25 23:20:29 -0400183 binding.msgInputTxt.setMediaListener(contentInfo -> startFileSend(AndroidFileUtils
184 .getCacheFile(requireContext(), contentInfo.getContentUri())
185 .flatMapCompletable(this::sendFile)
186 .doFinally(contentInfo::releasePermission)));
187
Adrien Béraud3a875a02018-07-18 17:54:17 -0400188 if (mPreferences != null) {
189 String pendingMessage = mPreferences.getString(KEY_PREFERENCE_PENDING_MESSAGE, null);
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400190 if (!TextUtils.isEmpty(pendingMessage)) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500191 binding.msgInputTxt.setText(pendingMessage);
192 binding.msgSend.setVisibility(View.VISIBLE);
193 binding.emojiSend.setVisibility(View.GONE);
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400194 }
Adrien Béraud3a875a02018-07-18 17:54:17 -0400195 }
Adrien Béraudb28c4912018-12-02 22:58:52 -0500196 binding.msgInputTxt.setOnEditorActionListener((v, actionId, event) -> actionSendMsgText(actionId));
197 binding.msgInputTxt.addTextChangedListener(new TextWatcher() {
Adrien Béraud3a875a02018-07-18 17:54:17 -0400198 @Override
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500199 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
200 }
Adrien Béraud3a875a02018-07-18 17:54:17 -0400201
202 @Override
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500203 public void onTextChanged(CharSequence s, int start, int before, int count) {
204 }
Adrien Béraud3a875a02018-07-18 17:54:17 -0400205
206 @Override
207 public void afterTextChanged(Editable s) {
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400208 String message = s.toString();
209 if (TextUtils.isEmpty(message)) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500210 binding.msgSend.setVisibility(View.GONE);
211 binding.emojiSend.setVisibility(View.VISIBLE);
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400212 } else {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500213 binding.msgSend.setVisibility(View.VISIBLE);
214 binding.emojiSend.setVisibility(View.GONE);
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400215 }
Adrien Béraud3a875a02018-07-18 17:54:17 -0400216 if (mPreferences != null) {
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400217 mPreferences.edit().putString(KEY_PREFERENCE_PENDING_MESSAGE, message).apply();
Adrien Béraud3a875a02018-07-18 17:54:17 -0400218 }
219 }
220 });
Adrien Béraud9d4a81f2018-07-09 01:19:52 -0400221
Adrien Béraud772e2162019-02-12 16:00:21 -0500222 animation.addUpdateListener(valueAnimator -> binding.histList.setPadding(
223 binding.histList.getPaddingLeft(),
224 binding.histList.getPaddingTop(),
225 binding.histList.getPaddingRight(),
226 Integer.parseInt(valueAnimator.getAnimatedValue().toString())));
227
228 binding.msgInputTxt.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
229 if (animation.isStarted())
230 animation.cancel();
231 animation.setIntValues(binding.histList.getPaddingBottom(), binding.msgInputTxt.getHeight() + marginPx);
232 animation.start();
233 });
234
Adrien Béraudb28c4912018-12-02 22:58:52 -0500235 if (binding != null) {
236 binding.ongoingcallPane.setVisibility(View.GONE);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500237 }
238
Adrien Béraudb28c4912018-12-02 22:58:52 -0500239 DefaultItemAnimator animator = (DefaultItemAnimator) binding.histList.getItemAnimator();
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500240 if (animator != null)
241 animator.setSupportsChangeAnimations(false);
Adrien Béraudb28c4912018-12-02 22:58:52 -0500242 binding.histList.setAdapter(mAdapter);
Adrien Béraude5ec8952018-07-11 15:14:44 -0400243 setHasOptionsMenu(true);
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500244 }
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500245
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500246 @Override
247 public void setConversationColor(int color) {
Adrien Béraud171ba362018-12-14 21:35:40 -0500248 Colorable activity = (Colorable) getActivity();
249 if (activity != null)
250 activity.setColor(color);
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500251 mAdapter.setPrimaryColor(color);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500252 }
253
Adrien Béraud7c505112018-03-20 16:03:28 -0400254 @Override
Adrien Béraud4030d2e2018-12-02 23:08:03 -0500255 public void onDestroyView() {
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500256 if (mPreferences != null)
257 mPreferences.unregisterOnSharedPreferenceChangeListener(this);
Adrien Béraud772e2162019-02-12 16:00:21 -0500258 animation.removeAllUpdateListeners();
Adrien Béraudb28c4912018-12-02 22:58:52 -0500259 binding.histList.setAdapter(null);
Adrien Béraud4030d2e2018-12-02 23:08:03 -0500260 super.onDestroyView();
261 }
262
263 @Override
Adrien Béraud7c505112018-03-20 16:03:28 -0400264 public boolean onContextItemSelected(MenuItem item) {
265 if (mAdapter.onContextItemSelected(item))
266 return true;
267 return super.onContextItemSelected(item);
268 }
269
Rayan Osseirane634a562019-05-29 13:44:55 -0400270 public void updateAdapterItem() {
271 if(position != -1) {
272 mAdapter.notifyItemChanged(position);
273 position = -1;
274 }
275 }
276
Alexandre Lision66a9f9a2017-02-26 20:28:27 -0500277 public void sendMessageText() {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500278 String message = binding.msgInputTxt.getText().toString();
Adrien Béraudace37a22018-06-22 14:58:36 -0400279 clearMsgEdit();
280 presenter.sendTextMessage(message);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500281 }
282
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400283 public void sendEmoji() {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500284 presenter.sendTextMessage(binding.emojiSend.getText().toString());
Adrien Béraud58bd92b2018-08-23 10:54:25 -0400285 }
286
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500287 public void selectFile() {
288 presenter.selectFile();
289 }
290
Rayan Osseirane634a562019-05-29 13:44:55 -0400291 /**
292 * Used to update with the past adapter position when a long click was registered
293 * @param position
294 */
295 public void updatePosition(int position) {
296 this.position = position;
297 }
298
Adrien Béraud64538722018-03-15 17:34:00 -0400299 public void takePicture() {
Adrien Béraud4f542f92019-01-03 12:17:53 -0500300 if (!presenter.getDeviceRuntimeService().hasVideoPermission()) {
301 requestPermissions(new String[]{Manifest.permission.CAMERA}, RingApplication.PERMISSIONS_REQUEST);
302 } else {
Adrien Béraudf5c32f92019-01-03 23:40:00 -0500303 Context c = getContext();
304 if (c == null)
305 return;
Adrien Béraud4f542f92019-01-03 12:17:53 -0500306 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Adrien Béraudf5c32f92019-01-03 23:40:00 -0500307 if (takePictureIntent.resolveActivity(c.getPackageManager()) != null) {
Adrien Béraud4f542f92019-01-03 12:17:53 -0500308 // Create the File where the photo should go
Adrien Béraud44939482019-02-13 21:42:08 -0500309 File photoFile;
Adrien Béraud4f542f92019-01-03 12:17:53 -0500310 try {
Adrien Béraudf5c32f92019-01-03 23:40:00 -0500311 photoFile = AndroidFileUtils.createImageFile(c);
Adrien Béraud4f542f92019-01-03 12:17:53 -0500312 } catch (IOException ex) {
313 Log.e(TAG, "takePicture: error creating temporary file", ex);
314 return;
315 }
316 Log.i(TAG, "takePicture: trying to save to " + photoFile);
317 mCurrentPhoto = photoFile;
Adrien Béraudf5c32f92019-01-03 23:40:00 -0500318 android.net.Uri photoURI = FileProvider.getUriForFile(c, ContentUriHandler.AUTHORITY_FILES, photoFile);
Adrien Béraud4f542f92019-01-03 12:17:53 -0500319 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
320 startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PICTURE);
Adrien Béraud64538722018-03-15 17:34:00 -0400321 }
Adrien Béraud64538722018-03-15 17:34:00 -0400322 }
323 }
324
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500325 @Override
Pierre Duchemin4af6b392018-02-02 11:23:56 -0500326 public void askWriteExternalStoragePermission() {
Adrien Béraud4f542f92019-01-03 12:17:53 -0500327 requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RingApplication.PERMISSIONS_REQUEST);
Pierre Duchemin4af6b392018-02-02 11:23:56 -0500328 }
329
330 @Override
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500331 public void openFilePicker() {
332 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
333 intent.addCategory(Intent.CATEGORY_OPENABLE);
334 intent.setType("*/*");
335
336 startActivityForResult(intent, REQUEST_CODE_FILE_PICKER);
337 }
338
Adrien Béraud44939482019-02-13 21:42:08 -0500339 private Completable sendFile(File file) {
340 return Completable.fromAction(() -> presenter.sendFile(file));
341 }
342
Adrien Béraud44939482019-02-13 21:42:08 -0500343 private void startFileSend(Completable op) {
344 setLoading(true);
Adrien Béraud1af6c012019-05-25 23:20:29 -0400345 op.observeOn(AndroidSchedulers.mainThread())
Adrien Béraud44939482019-02-13 21:42:08 -0500346 .doFinally(() -> setLoading(false))
347 .subscribe(() -> {}, e -> {
348 Log.e(TAG, "startFileSend: not able to create cache file", e);
349 displayErrorToast(RingError.INVALID_FILE);
350 });
351 }
352
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500353 @Override
Pierre Duchemin17542a72018-02-14 16:38:36 -0500354 public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
Adrien Béraud64538722018-03-15 17:34:00 -0400355 Log.w(TAG, "onActivityResult: " + requestCode + " " + resultCode + " " + resultData);
Pierre Duchemin17542a72018-02-14 16:38:36 -0500356 super.onActivityResult(requestCode, resultCode, resultData);
357
358 if (requestCode == REQUEST_CODE_FILE_PICKER && resultCode == RESULT_OK) {
Adrien Béraud64538722018-03-15 17:34:00 -0400359 if (resultData == null) {
360 return;
Pierre Duchemin17542a72018-02-14 16:38:36 -0500361 }
Adrien Béraud64538722018-03-15 17:34:00 -0400362 android.net.Uri uri = resultData.getData();
363 if (uri == null) {
364 return;
365 }
Adrien Béraud1af6c012019-05-25 23:20:29 -0400366 startFileSend(AndroidFileUtils.getCacheFile(requireContext(), uri)
367 .observeOn(AndroidSchedulers.mainThread())
368 .flatMapCompletable(this::sendFile));
Adrien Béraud64538722018-03-15 17:34:00 -0400369 } else if (requestCode == REQUEST_CODE_TAKE_PICTURE) {
370 if (resultCode != RESULT_OK) {
371 mCurrentPhoto = null;
372 return;
373 }
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500374 Log.w(TAG, "onActivityResult: mCurrentPhoto " + mCurrentPhoto.getAbsolutePath() + " " + mCurrentPhoto.exists() + " " + mCurrentPhoto.length());
Adrien Béraud64538722018-03-15 17:34:00 -0400375 if (mCurrentPhoto == null || !mCurrentPhoto.exists() || mCurrentPhoto.length() == 0) {
376 Toast.makeText(getActivity(), "Can't find picture", Toast.LENGTH_SHORT).show();
377 }
Adrien Béraud44939482019-02-13 21:42:08 -0500378 File file = mCurrentPhoto;
379 mCurrentPhoto = null;
380 startFileSend(sendFile(file));
Pierre Duchemin17542a72018-02-14 16:38:36 -0500381 }
382 }
383
384 @Override
Adrien Béraud4f542f92019-01-03 12:17:53 -0500385 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
386 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
387 for (int i = 0, n = permissions.length; i < n; i++) {
388 switch (permissions[i]) {
389 case Manifest.permission.CAMERA:
390 boolean granted = grantResults[i] == PackageManager.PERMISSION_GRANTED;
Rayan Osseiran38206c62019-05-15 14:49:03 -0400391 presenter.cameraPermissionChanged(granted);
Adrien Béraud4f542f92019-01-03 12:17:53 -0500392 if (granted) {
393 takePicture();
394 }
395 return;
396 default:
397 break;
398 }
399 }
400 }
401
402 @Override
Adrien Béraudace37a22018-06-22 14:58:36 -0400403 public void addElement(ConversationElement element) {
404 mAdapter.add(element);
405 scrollToEnd();
406 }
Adrien Béraud3cbc7fa2018-07-18 18:36:21 -0400407
Adrien Béraudace37a22018-06-22 14:58:36 -0400408 @Override
409 public void updateElement(ConversationElement element) {
410 mAdapter.update(element);
411 }
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500412
Adrien Béraudace37a22018-06-22 14:58:36 -0400413 @Override
414 public void removeElement(ConversationElement element) {
415 mAdapter.remove(element);
Adrien Béraud21533292018-03-22 14:11:35 -0400416 }
417
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400418 @Override
419 public void shareFile(File path) {
Adrien Béraud50549532019-01-03 12:22:16 -0500420 Context c = getContext();
421 if (c == null)
422 return;
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400423 android.net.Uri fileUri = null;
424 try {
Adrien Béraud50549532019-01-03 12:22:16 -0500425 fileUri = FileProvider.getUriForFile(c, ContentUriHandler.AUTHORITY_FILES, path);
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400426 } catch (IllegalArgumentException e) {
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500427 Log.e("File Selector", "The selected file can't be shared: " + path.getName());
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400428 }
429 if (fileUri != null) {
430 Intent sendIntent = new Intent();
431 sendIntent.setAction(Intent.ACTION_SEND);
432 sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Adrien Béraud50549532019-01-03 12:22:16 -0500433 String type = c.getContentResolver().getType(fileUri);
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400434 sendIntent.setDataAndType(fileUri, type);
435 sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
436 startActivity(Intent.createChooser(sendIntent, null));
437 }
438 }
439
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500440 @Override
441 public void openFile(File path) {
Adrien Béraud50549532019-01-03 12:22:16 -0500442 Context c = getContext();
443 if (c == null)
444 return;
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500445 android.net.Uri fileUri = null;
446 try {
Adrien Béraud50549532019-01-03 12:22:16 -0500447 fileUri = FileProvider.getUriForFile(c, ContentUriHandler.AUTHORITY_FILES, path);
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500448 } catch (IllegalArgumentException e) {
449 Log.e("File Selector", "The selected file can't be shared: " + path.getName());
450 }
451 if (fileUri != null) {
452 Intent sendIntent = new Intent();
453 sendIntent.setAction(Intent.ACTION_VIEW);
454 sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Adrien Béraud50549532019-01-03 12:22:16 -0500455 String type = c.getContentResolver().getType(fileUri);
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500456 sendIntent.setDataAndType(fileUri, type);
457 sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
458 //startActivity(Intent.createChooser(sendIntent, null));
Rayan Osseirane4450272019-06-03 14:17:19 -0400459 try {
460 startActivity(sendIntent);
461 } catch (ActivityNotFoundException e) {
462 Snackbar.make(getView(), R.string.conversation_open_file_error, Snackbar.LENGTH_LONG).show();
463 Log.e("File Loader", "File of unknown type, could not open: " + path.getName());
464 }
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500465 }
466 }
467
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500468 @OnEditorAction(R.id.msg_input_txt)
Adrien Béraud44939482019-02-13 21:42:08 -0500469 boolean actionSendMsgText(int actionId) {
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500470 switch (actionId) {
471 case EditorInfo.IME_ACTION_SEND:
Adrien Béraudace37a22018-06-22 14:58:36 -0400472 sendMessageText();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500473 return true;
474 }
475 return false;
476 }
477
Alexandre Lision66a9f9a2017-02-26 20:28:27 -0500478 public void onClick() {
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400479 presenter.clickOnGoingPane();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500480 }
481
482 @Override
483 public void onPause() {
484 super.onPause();
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400485 presenter.pause();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500486 }
487
488 @Override
489 public void onResume() {
490 super.onResume();
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400491 presenter.resume();
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500492 }
493
494 @Override
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400495 public void onDetach() {
496 if (actionbarTarget != null) {
497 actionbarTarget.dispose();
498 actionbarTarget = null;
499 }
500 super.onDetach();
501 }
502
503 @Override
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500504 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400505 inflater.inflate(R.menu.conversation_actions, menu);
Adrien Béraud5b47cb52018-07-06 16:24:14 -0400506 mAudioCallBtn = menu.findItem(R.id.conv_action_audiocall);
507 mVideoCallBtn = menu.findItem(R.id.conv_action_videocall);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500508 }
509
510 @Override
511 public boolean onOptionsItemSelected(MenuItem item) {
512 switch (item.getItemId()) {
513 case android.R.id.home:
514 startActivity(new Intent(getActivity(), HomeActivity.class));
515 return true;
516 case R.id.conv_action_audiocall:
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500517 presenter.callWithAudioOnly(true);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500518 return true;
519 case R.id.conv_action_videocall:
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500520 presenter.callWithAudioOnly(false);
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500521 return true;
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500522 case R.id.conv_contact_details:
523 presenter.openContact();
Aline Bonnet54cf69b2017-03-28 12:03:45 -0400524 return true;
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500525 default:
526 return super.onOptionsItemSelected(item);
527 }
528 }
529
Aline Bonnet9c6defe2016-12-21 13:21:02 -0500530 @Override
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400531 protected void initPresenter(ConversationPresenter presenter) {
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500532 Bundle args = getArguments();
533 if (args == null)
534 return;
535 Uri contactUri = new Uri(args.getString(KEY_CONTACT_RING_ID));
536 String accountId = args.getString(KEY_ACCOUNT_ID);
537 mAdapter = new ConversationAdapter(this, presenter);
538 presenter.init(contactUri, accountId);
Adrien Béraud56c34132018-11-29 13:32:00 -0500539 try {
Adrien Béraud44939482019-02-13 21:42:08 -0500540 mPreferences = requireActivity().getSharedPreferences(accountId + "_" + contactUri.getRawRingId(), Context.MODE_PRIVATE);
Adrien Béraud3c483ce2019-01-02 17:33:49 -0500541 mPreferences.registerOnSharedPreferenceChangeListener(this);
542 presenter.setConversationColor(mPreferences.getInt(KEY_PREFERENCE_CONVERSATION_COLOR, getResources().getColor(R.color.color_primary_light)));
Adrien Béraud56c34132018-11-29 13:32:00 -0500543 } catch (Exception e) {
544 Log.e(TAG, "Can't load conversation preferences");
545 }
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500546 }
547
548 @Override
549 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
550 switch (key) {
551 case KEY_PREFERENCE_CONVERSATION_COLOR:
552 presenter.setConversationColor(prefs.getInt(KEY_PREFERENCE_CONVERSATION_COLOR, getResources().getColor(R.color.color_primary_light)));
553 break;
554 }
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400555 }
556
557 @Override
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400558 public void displayContact(final CallContact contact) {
Adrien Béraud44939482019-02-13 21:42:08 -0500559 ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
Adrien Béraudace37a22018-06-22 14:58:36 -0400560 if (actionBar == null) {
561 return;
562 }
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400563 Context context = actionBar.getThemedContext();
Adrien Béraudace37a22018-06-22 14:58:36 -0400564 String displayName = contact.getDisplayName();
565 actionBar.setTitle(displayName);
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400566
567 if (actionbarTarget != null) {
568 actionbarTarget.dispose();
569 actionbarTarget = null;
570 }
571 int targetSize = (int) (AvatarFactory.SIZE_AB * context.getResources().getDisplayMetrics().density);
572 actionbarTarget = AvatarFactory.getBitmapAvatar(context, contact, targetSize)
573 .observeOn(AndroidSchedulers.mainThread())
574 .subscribe(b -> actionBar.setLogo(new BitmapDrawable(context.getResources(), b)));
575
Adrien Béraudace37a22018-06-22 14:58:36 -0400576 String identity = contact.getRingUsername();
577 if (identity != null && !identity.equals(displayName)) {
578 actionBar.setSubtitle(identity);
579 }
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400580
581 mAdapter.setPhoto();
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400582 }
583
584 @Override
585 public void displayOnGoingCallPane(final boolean display) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500586 binding.ongoingcallPane.setVisibility(display ? View.VISIBLE : View.GONE);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400587 }
588
589 @Override
590 public void displayNumberSpinner(final Conversation conversation, final Uri number) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500591 binding.numberSelector.setVisibility(View.VISIBLE);
Adrien Béraudace37a22018-06-22 14:58:36 -0400592 mNumberAdapter = new NumberAdapter(getActivity(),
593 conversation.getContact(),
594 false);
Adrien Béraudb28c4912018-12-02 22:58:52 -0500595 binding.numberSelector.setAdapter(mNumberAdapter);
596 binding.numberSelector.setSelection(getIndex(binding.numberSelector, number));
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400597 }
598
599 @Override
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400600 public void hideNumberSpinner() {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500601 binding.numberSelector.setVisibility(View.GONE);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400602 }
603
604 @Override
605 public void clearMsgEdit() {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500606 binding.msgInputTxt.setText("");
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400607 }
608
609 @Override
610 public void goToHome() {
611 if (getActivity() instanceof ConversationActivity) {
612 getActivity().finish();
Aline Bonneteb5f7ff2017-01-17 11:09:17 -0500613 }
614 }
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400615
616 @Override
617 public void goToAddContact(CallContact callContact) {
618 startActivityForResult(ActionHelper.getAddNumberIntentForContact(callContact), REQ_ADD_CONTACT);
619 }
620
621 @Override
622 public void goToCallActivity(String conferenceId) {
623 startActivity(new Intent(Intent.ACTION_VIEW)
Adrien Béraud44939482019-02-13 21:42:08 -0500624 .setClass(requireActivity().getApplicationContext(), CallActivity.class)
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400625 .putExtra(NotificationService.KEY_CALL_ID, conferenceId));
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400626 }
627
628 @Override
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500629 public void goToContactActivity(String accountId, String contactRingId) {
630 startActivity(new Intent(Intent.ACTION_VIEW, android.net.Uri.withAppendedPath(android.net.Uri.withAppendedPath(ContentUriHandler.CONTACT_CONTENT_URI, accountId), contactRingId))
Adrien Béraud44939482019-02-13 21:42:08 -0500631 .setClass(requireActivity().getApplicationContext(), ContactDetailsActivity.class));
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500632 }
633
634 @Override
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500635 public void goToCallActivityWithResult(String accountId, String contactRingId, boolean audioOnly) {
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400636 Intent intent = new Intent(CallActivity.ACTION_CALL)
Adrien Béraud44939482019-02-13 21:42:08 -0500637 .setClass(requireActivity().getApplicationContext(), CallActivity.class)
Hadrien De Sousa0dc83162017-11-10 16:15:18 -0500638 .putExtra(KEY_ACCOUNT_ID, accountId)
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500639 .putExtra(CallFragment.KEY_AUDIO_ONLY, audioOnly)
Hadrien De Sousa0dc83162017-11-10 16:15:18 -0500640 .putExtra(KEY_CONTACT_RING_ID, contactRingId);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400641 startActivityForResult(intent, HomeActivity.REQUEST_CODE_CALL);
642 }
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -0500643
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500644 public void blockContactRequest() {
645 presenter.onBlockIncomingContactRequest();
646 }
647
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500648 public void refuseContactRequest() {
649 presenter.onRefuseIncomingContactRequest();
650 }
651
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500652 public void acceptContactRequest() {
653 presenter.onAcceptIncomingContactRequest();
654 }
655
Adrien Béraudace37a22018-06-22 14:58:36 -0400656 public void addContact() {
657 presenter.onAddContact();
658 }
659
660 @Override
Adrien Béraud5b47cb52018-07-06 16:24:14 -0400661 public void onPrepareOptionsMenu(Menu menu) {
662 super.onPrepareOptionsMenu(menu);
Adrien Béraudb28c4912018-12-02 22:58:52 -0500663 boolean visible = binding.cvMessageInput.getVisibility() == View.VISIBLE;
Adrien Béraud5b47cb52018-07-06 16:24:14 -0400664 if (mAudioCallBtn != null)
665 mAudioCallBtn.setVisible(visible);
666 if (mVideoCallBtn != null)
667 mVideoCallBtn.setVisible(visible);
668 }
669
670 @Override
Adrien Béraudace37a22018-06-22 14:58:36 -0400671 public void switchToUnknownView(String contactDisplayName) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500672 binding.cvMessageInput.setVisibility(View.GONE);
673 binding.unknownContactPrompt.setVisibility(View.VISIBLE);
674 binding.trustRequestPrompt.setVisibility(View.GONE);
675 binding.tvTrustRequestMessage.setText(String.format(getString(R.string.message_contact_not_trusted), contactDisplayName));
676 binding.trustRequestMessageLayout.setVisibility(View.VISIBLE);
Adrien Béraud44939482019-02-13 21:42:08 -0500677 requireActivity().invalidateOptionsMenu();
Adrien Béraudace37a22018-06-22 14:58:36 -0400678 }
679
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500680 @Override
681 public void switchToIncomingTrustRequestView(String contactDisplayName) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500682 binding.cvMessageInput.setVisibility(View.GONE);
683 binding.unknownContactPrompt.setVisibility(View.GONE);
684 binding.trustRequestPrompt.setVisibility(View.VISIBLE);
685 binding.tvTrustRequestMessage.setText(String.format(getString(R.string.message_contact_not_trusted_yet), contactDisplayName));
686 binding.trustRequestMessageLayout.setVisibility(View.VISIBLE);
Adrien Béraud44939482019-02-13 21:42:08 -0500687 requireActivity().invalidateOptionsMenu();
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500688 }
689
690 @Override
691 public void switchToConversationView() {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500692 binding.cvMessageInput.setVisibility(View.VISIBLE);
693 binding.unknownContactPrompt.setVisibility(View.GONE);
694 binding.trustRequestPrompt.setVisibility(View.GONE);
695 binding.trustRequestMessageLayout.setVisibility(View.GONE);
Adrien Béraud44939482019-02-13 21:42:08 -0500696 requireActivity().invalidateOptionsMenu();
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500697 }
698
699 @Override
700 public void positiveMediaButtonClicked() {
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -0500701 presenter.clickOnGoingPane();
702 }
703
704 @Override
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500705 public void negativeMediaButtonClicked() {
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -0500706 presenter.clickOnGoingPane();
707 }
708
709 @Override
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500710 public void toggleMediaButtonClicked() {
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -0500711 presenter.clickOnGoingPane();
712 }
Pierre Duchemin17542a72018-02-14 16:38:36 -0500713
714 private void setLoading(boolean isLoading) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500715 if (binding == null)
Adrien Béraud5b47cb52018-07-06 16:24:14 -0400716 return;
Pierre Duchemin17542a72018-02-14 16:38:36 -0500717 if (isLoading) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500718 binding.btnTakePicture.setVisibility(View.GONE);
719 binding.sendData.setVisibility(View.GONE);
720 binding.pbDataTransfer.setVisibility(View.VISIBLE);
Pierre Duchemin17542a72018-02-14 16:38:36 -0500721 } else {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500722 binding.btnTakePicture.setVisibility(View.VISIBLE);
723 binding.sendData.setVisibility(View.VISIBLE);
724 binding.pbDataTransfer.setVisibility(View.GONE);
Pierre Duchemin17542a72018-02-14 16:38:36 -0500725 }
726 }
Adrien Béraud1b8ac9f2018-05-31 14:34:23 -0400727
728 @Override
729 public void displayCompletedDownload(DataTransfer transfer, File destination) {
Adrien Béraud44939482019-02-13 21:42:08 -0500730 DownloadManager downloadManager = (DownloadManager) requireContext().getSystemService(Context.DOWNLOAD_SERVICE);
Adrien Béraud1b8ac9f2018-05-31 14:34:23 -0400731 if (downloadManager != null) {
732 downloadManager.addCompletedDownload(transfer.getDisplayName(),
733 transfer.getDisplayName(),
734 true,
Adrien Béraud99aaade2018-07-09 13:34:30 -0400735 AndroidFileUtils.getMimeType(destination.getAbsolutePath()),
Adrien Béraud1b8ac9f2018-05-31 14:34:23 -0400736 destination.getAbsolutePath(),
737 destination.length(),
738 true);
739 }
740 }
Adrien Béraudae45ffa2018-07-06 16:21:29 -0400741
742 public void handleShareIntent(Intent intent) {
743 String type = intent.getType();
744 if (type == null) {
745 Log.w(TAG, "Can't share with no type");
746 return;
747 }
Rayan Osseirane4450272019-06-03 14:17:19 -0400748 if (type.startsWith("text/plain")) {
Adrien Béraudb28c4912018-12-02 22:58:52 -0500749 binding.msgInputTxt.setText(intent.getStringExtra(Intent.EXTRA_TEXT));
Rayan Osseirane4450272019-06-03 14:17:19 -0400750 } else {
Adrien Béraudae45ffa2018-07-06 16:21:29 -0400751 android.net.Uri uri = intent.getData();
752 ClipData clip = intent.getClipData();
753 if (uri == null && clip != null && clip.getItemCount() > 0)
754 uri = clip.getItemAt(0).getUri();
755 if (uri == null)
756 return;
Adrien Béraud1af6c012019-05-25 23:20:29 -0400757 startFileSend(AndroidFileUtils.getCacheFile(requireContext(), uri).flatMapCompletable(this::sendFile));
Adrien Béraudae45ffa2018-07-06 16:21:29 -0400758 }
759 }
Adrien Béraude32ab742018-08-25 21:15:08 -0400760}