From 20df00c2817205b93506b218e0a23af1e6e8da5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Fri, 1 May 2020 19:35:10 -0400
Subject: [PATCH] various fixes

Change-Id: I84b3d78d8e8ef8dc3edc5df79dc38f9f93de4f6e
---
 .../java/cx/ring/about/AboutFragment.java     |  2 +-
 .../ring/account/AccountEditionFragment.java  | 31 ++++++++--------
 .../java/cx/ring/client/HomeActivity.java     | 12 ++++---
 .../ContactRequestsFragment.java              | 13 +++----
 .../ring/fragments/ConversationFragment.java  | 24 ++++++-------
 .../fragments/LocationSharingFragment.java    |  9 +++--
 .../java/cx/ring/mvp/BaseSupportFragment.java |  9 +++--
 .../tv/account/TVJamiLinkAccountFragment.java |  4 +--
 .../cx/ring/tv/account/TVShareFragment.java   |  2 +-
 .../conversation/TvConversationFragment.java  | 36 +++++++++++--------
 .../java/cx/ring/utils/ContentUriHandler.java |  1 -
 .../app/src/main/res/values/strings.xml       |  3 +-
 12 files changed, 76 insertions(+), 70 deletions(-)

diff --git a/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java b/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
index 4b2b67bcb..8781a701c 100644
--- a/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
@@ -100,7 +100,7 @@ public class AboutFragment extends BaseSupportFragment<RootPresenter> {
         }
 
         FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
-        Fragment existingFragment = fragmentManager.findFragmentByTag(AboutFragment.TAG);
+        Fragment existingFragment = fragmentManager.findFragmentByTag(TAG);
         if (existingFragment == null) {
             ((HomeActivity) getActivity()).goToAbout();
         }
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java b/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
index a6e7c61b3..0329a4f64 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
@@ -137,7 +137,7 @@ public class AccountEditionFragment extends BaseSupportFragment<AccountEditionPr
 
     @Override
     public void displaySummary(String accountId) {
-        toggleView(accountId);
+        toggleView(accountId, true);
         FragmentManager fragmentManager = requireFragmentManager();
         Fragment existingFragment = fragmentManager.findFragmentByTag(JamiAccountSummaryFragment.TAG);
         if (existingFragment == null) {
@@ -157,7 +157,7 @@ public class AccountEditionFragment extends BaseSupportFragment<AccountEditionPr
 
     @Override
     public void displaySIPView(String accountId) {
-        toggleView(accountId);
+        toggleView(accountId, false);
     }
 
     @Override
@@ -230,8 +230,8 @@ public class AccountEditionFragment extends BaseSupportFragment<AccountEditionPr
         if (getActivity() instanceof HomeActivity)
             ((HomeActivity) getActivity()).setToolbarOutlineState(true);
         if (binding.fragmentContainer.getVisibility() != View.VISIBLE) {
-            toggleView(mAccountId);
-            return  true;
+            // toggleView(mAccountId);
+            return true;
         }
         FragmentManager fragmentManager = requireFragmentManager();
         JamiAccountSummaryFragment summaryFragment = (JamiAccountSummaryFragment) fragmentManager.findFragmentByTag(JamiAccountSummaryFragment.TAG);
@@ -244,22 +244,21 @@ public class AccountEditionFragment extends BaseSupportFragment<AccountEditionPr
         return fragment instanceof JamiAccountSummaryFragment;
     }
 
-    private void toggleView(String accountId) {
+    private void toggleView(String accountId, boolean isJami) {
         mAccountId = accountId;
-        boolean isRing = presenter.getAccount(mAccountId).isRing();
-
-        binding.slidingTabs.setVisibility(isRing? View.GONE : View.VISIBLE);
-        binding.pager.setVisibility(isRing? View.GONE : View.VISIBLE);
-        binding.fragmentContainer.setVisibility(isRing? View.VISIBLE : View.GONE);
+        binding.slidingTabs.setVisibility(isJami? View.GONE : View.VISIBLE);
+        binding.pager.setVisibility(isJami? View.GONE : View.VISIBLE);
+        binding.fragmentContainer.setVisibility(isJami? View.VISIBLE : View.GONE);
         presenter.prepareOptionsMenu();
-        setBackListenerEnabled(isRing);
+        setBackListenerEnabled(isJami);
 
         FragmentManager fragmentManager = requireFragmentManager();
-        JamiAccountSummaryFragment fragment = (JamiAccountSummaryFragment) fragmentManager.findFragmentByTag(JamiAccountSummaryFragment.TAG);
-        if (fragment != null) {
-            fragment.setFragmentVisibility(isRing);
-            if (isRing)
-                fragment.setAccount(accountId);
+        Fragment fragment = fragmentManager.findFragmentByTag(JamiAccountSummaryFragment.TAG);
+        if (fragment instanceof JamiAccountSummaryFragment) {
+            JamiAccountSummaryFragment f = (JamiAccountSummaryFragment) fragment;
+            f.setFragmentVisibility(isJami);
+            if (isJami)
+                f.setAccount(accountId);
         }
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index 5de849727..4c8fb60e2 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -371,7 +371,7 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
         bundle.putString(ContactRequestsFragment.ACCOUNT_ID, accountID);
         mNotificationService.cancelTrustRequestNotification(accountID);
         if (fContent instanceof ContactRequestsFragment) {
-            ((ContactRequestsFragment) fContent).presentForAccount(bundle);
+            ((ContactRequestsFragment) fContent).presentForAccount(accountID);
             return;
         }
         fContent = new ContactRequestsFragment();
@@ -486,17 +486,20 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
 
     @Override
     public boolean onNavigationItemSelected(@NonNull MenuItem item) {
-        Bundle bundle = new Bundle();
+        Account account = mAccountService.getCurrentAccount();
+        if (account == null)
+            return false;
 
+        Bundle bundle = new Bundle();
         switch (item.getItemId()) {
             case R.id.navigation_requests:
-                bundle.putString(ContactRequestsFragment.ACCOUNT_ID, mAccountService.getCurrentAccount().getAccountID());
                 if (fContent instanceof ContactRequestsFragment) {
-                    ((ContactRequestsFragment) fContent).presentForAccount(bundle);
+                    ((ContactRequestsFragment) fContent).presentForAccount(account.getAccountID());
                     break;
                 }
                 popCustomBackStack();
                 fContent = new ContactRequestsFragment();
+                bundle.putString(ContactRequestsFragment.ACCOUNT_ID, account.getAccountID());
                 fContent.setArguments(bundle);
                 getSupportFragmentManager().beginTransaction()
                         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
@@ -521,7 +524,6 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
                 showToolbarSpinner();
                 break;
             case R.id.navigation_settings:
-                Account account = mAccountService.getCurrentAccount();
 
                 if (account.needsMigration()) {
                     Log.d(TAG, "launchAccountMigrationActivity: Launch account migration activity");
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
index 85b71ba7e..415ccd568 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
@@ -75,14 +75,11 @@ public class ContactRequestsFragment extends BaseSupportFragment<ContactRequests
         binding = null;
     }
 
-    public void presentForAccount(Bundle bundle) {
-        if (bundle != null && bundle.containsKey(ACCOUNT_ID)) {
-            String accountId = bundle.getString(ACCOUNT_ID);
-            presenter.updateAccount(accountId);
-            Bundle arguments = getArguments();
-            if (arguments != null)
-                arguments.putString(ACCOUNT_ID, accountId);
-        }
+    public void presentForAccount(@NonNull String accountId) {
+        presenter.updateAccount(accountId);
+        Bundle arguments = getArguments();
+        if (arguments != null)
+            arguments.putString(ACCOUNT_ID, accountId);
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 2c57c92cb..ce0dd800f 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -519,21 +519,19 @@ public class ConversationFragment extends BaseSupportFragment<ConversationPresen
             Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
             if (takePictureIntent.resolveActivity(c.getPackageManager()) != null) {
                 // Create the File where the photo should go
-                File photoFile;
                 try {
-                    photoFile = AndroidFileUtils.createImageFile(c);
-                } catch (IOException ex) {
-                    Log.e(TAG, "takePicture: error creating temporary file", ex);
-                    return;
+                    File photoFile = AndroidFileUtils.createImageFile(c);
+                    Log.i(TAG, "takePicture: trying to save to " + photoFile);
+                    android.net.Uri photoURI = ContentUriHandler.getUriForFile(c, ContentUriHandler.AUTHORITY_FILES, photoFile);
+                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
+                            .putExtra("android.intent.extras.CAMERA_FACING", 1)
+                            .putExtra("android.intent.extras.LENS_FACING_FRONT", 1)
+                            .putExtra("android.intent.extra.USE_FRONT_CAMERA", true);
+                    mCurrentPhoto = photoFile;
+                    startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PICTURE);
+                } catch (Exception e) {
+                    Toast.makeText(c, "Error taking picture: " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                 }
-                Log.i(TAG, "takePicture: trying to save to " + photoFile);
-                mCurrentPhoto = photoFile;
-                android.net.Uri photoURI = ContentUriHandler.getUriForFile(c, ContentUriHandler.AUTHORITY_FILES, photoFile);
-                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
-                takePictureIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);
-                takePictureIntent.putExtra("android.intent.extras.LENS_FACING_FRONT", 1);
-                takePictureIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);
-                startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PICTURE);
             }
         }
     }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
index 958d22923..a1c4d17c0 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
@@ -263,8 +263,13 @@ public class LocationSharingFragment extends Fragment {
     public void onResume() {
         super.onResume();
         mMap.onResume();
-        if (overlay != null)
-            overlay.enableMyLocation();
+        if (overlay != null) {
+            try {
+                overlay.enableMyLocation();
+            } catch (Exception e) {
+                Log.w(TAG, e);
+            }
+        }
     }
 
     public void onPause(){
diff --git a/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java b/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
index 3a32c2106..d80166c81 100644
--- a/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
@@ -29,7 +29,6 @@ import androidx.annotation.IdRes;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import cx.ring.R;
-import cx.ring.account.JamiAccountCreationFragment;
 import cx.ring.model.Error;
 
 public abstract class BaseSupportFragment<T extends RootPresenter> extends Fragment implements BaseView {
@@ -86,16 +85,16 @@ public abstract class BaseSupportFragment<T extends RootPresenter> extends Fragm
                 .beginTransaction()
                 .setCustomAnimations(R.anim.slide_in_right,
                         R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
-                .replace(content, fragment, JamiAccountCreationFragment.TAG)
-                .addToBackStack(JamiAccountCreationFragment.TAG)
+                .replace(content, fragment, TAG)
+                .addToBackStack(TAG)
                 .commit();
     }
 
     protected void replaceFragment(Fragment fragment, @IdRes int content) {
         getFragmentManager()
                 .beginTransaction()
-                .replace(content, fragment, JamiAccountCreationFragment.TAG)
-                .addToBackStack(JamiAccountCreationFragment.TAG)
+                .replace(content, fragment, TAG)
+                .addToBackStack(TAG)
                 .commit();
     }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
index 45d822c53..5c02f93b8 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
@@ -45,7 +45,7 @@ public class TVJamiLinkAccountFragment extends JamiGuidedStepFragment<JamiLinkAc
     public TVJamiLinkAccountFragment() {
     }
 
-    public static TVJamiLinkAccountFragment newInstance(AccountCreationModelImpl ringAccountViewModel) {
+    public static TVJamiLinkAccountFragment newInstance(@NonNull AccountCreationModelImpl ringAccountViewModel) {
         TVJamiLinkAccountFragment fragment = new TVJamiLinkAccountFragment();
         fragment.model = ringAccountViewModel;
         return fragment;
@@ -57,7 +57,7 @@ public class TVJamiLinkAccountFragment extends JamiGuidedStepFragment<JamiLinkAc
         super.onViewCreated(view, savedInstanceState);
 
         presenter.init(model);
-        if (model.getPhoto() != null) {
+        if (model != null && model.getPhoto() != null) {
             getGuidanceStylist().getIconView().setImageBitmap(model.getPhoto());
         }
     }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
index 4c2972f79..889c0d76f 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
@@ -104,6 +104,6 @@ public class TVShareFragment extends BaseSupportFragment<SharePresenter> impleme
                 .subscribe(a -> {
                     binding.qrUserPhoto.setVisibility(View.VISIBLE);
                     binding.qrUserPhoto.setImageDrawable(a);
-                }, e-> Log.e(TAG, e.getMessage())));
+                }, e-> Log.e(TVShareFragment.class.getSimpleName(), e.getMessage())));
     }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
index b2fa171d9..20d5f45c6 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
@@ -34,6 +34,7 @@ import android.os.Bundle;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.transition.TransitionManager;
@@ -89,6 +90,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.CompositeDisposable;
 
 public class TvConversationFragment extends BaseSupportFragment<ConversationPresenter> implements ConversationView {
+    private static final String TAG = TvConversationFragment.class.getSimpleName();
 
     private static final String ARG_MODEL = "model";
 
@@ -111,15 +113,13 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
 
     private int mSelectedPosition;
 
-    private static final String LOG_TAG = "AudioRecordTest";
     private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
     private static File fileName = null;
 
     private MediaRecorder recorder = null;
     private MediaPlayer player = null;
 
-    private boolean permissionToRecordAccepted = false;
-    private String[] permissions = {Manifest.permission.RECORD_AUDIO};
+    private String[] permissions = { Manifest.permission.RECORD_AUDIO };
 
     boolean mStartRecording = true;
     boolean mStartPlaying = true;
@@ -145,7 +145,6 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
         if (getArguments() != null) {
             mTvListViewModel = getArguments().getParcelable(ARG_MODEL);
         }
-        requestPermissions(permissions, REQUEST_RECORD_AUDIO_PERMISSION);
     }
 
     @Nullable
@@ -164,9 +163,11 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
 
     // Create an intent that can start the Speech Recognizer activity
     private void displaySpeechRecognizer() {
-        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
-        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
-        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say something...");
+        if (!checkAudioPermission())
+            return;
+        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
+                .putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
+                .putExtra(RecognizerIntent.EXTRA_PROMPT, getText(R.string.conversation_input_speech_hint));
         startActivityForResult(intent, REQUEST_SPEECH_CODE);
     }
 
@@ -239,6 +240,14 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
         mRecyclerView.setAdapter(mAdapter);
     }
 
+    private boolean checkAudioPermission() {
+        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
+            requestPermissions(permissions, REQUEST_RECORD_AUDIO_PERMISSION);
+            return false;
+        }
+        return true;
+    }
+
     @Override
     public boolean onContextItemSelected(@NonNull MenuItem item) {
         if (mAdapter.onContextItemSelected(item))
@@ -248,7 +257,6 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
         switch (requestCode) {
             case REQUEST_CODE_PHOTO:
                 if (resultCode == Activity.RESULT_OK && data != null) {
@@ -465,13 +473,9 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-        switch (requestCode) {
-            case REQUEST_RECORD_AUDIO_PERMISSION:
-                permissionToRecordAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
-                break;
+        if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
+            // NOOP
         }
-        if (!permissionToRecordAccepted) getActivity().finish();
-
     }
 
     private void onRecord(boolean start) {
@@ -497,7 +501,7 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
             player.prepare();
             player.start();
         } catch (IOException e) {
-            Log.e(LOG_TAG, "prepare() failed");
+            Log.e(TAG, "prepare() failed");
         }
     }
 
@@ -507,6 +511,8 @@ public class TvConversationFragment extends BaseSupportFragment<ConversationPres
     }
 
     private void startRecording() {
+        if (!checkAudioPermission())
+            return;
         if (recorder != null) {
             return;
         }
diff --git a/ring-android/app/src/main/java/cx/ring/utils/ContentUriHandler.java b/ring-android/app/src/main/java/cx/ring/utils/ContentUriHandler.java
index 8272aecd9..a02c6c250 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/ContentUriHandler.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/ContentUriHandler.java
@@ -58,7 +58,6 @@ public class ContentUriHandler {
 
     public static Uri getUriForFile(@NonNull Context context, @NonNull String authority, @NonNull File file) {
         if (HUAWEI_MANUFACTURER.equalsIgnoreCase(Build.MANUFACTURER)) {
-            Log.w(TAG, "Using a Huawei device Increased likelihood of failure...");
             try {
                 return FileProvider.getUriForFile(context, authority, file);
             } catch (IllegalArgumentException e) {
diff --git a/ring-android/app/src/main/res/values/strings.xml b/ring-android/app/src/main/res/values/strings.xml
index 81d917ccb..68c0be48f 100644
--- a/ring-android/app/src/main/res/values/strings.xml
+++ b/ring-android/app/src/main/res/values/strings.xml
@@ -330,9 +330,10 @@ along with this program; if not, write to the Free Software
     <string name="tv_audio_play">Play</string>
     <string name="tv_audio_pause">Pause</string>
     <string name="tv_dialog_send">Send</string>
-    <string name="tv_audio_recording">Recording...</string>
+    <string name="tv_audio_recording">Recording…</string>
     <string name="tv_send_text">Send Text</string>
     <string name="tv_send_audio">Send Audio</string>
     <string name="tv_send_video">Send Media</string>
+    <string name="conversation_input_speech_hint">Say something…</string>
 
 </resources>
-- 
GitLab