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 4b2b67bcb170389a94607f15301d6b334ebf1a62..8781a701cf85dfab7be3c7f3287ee4a2e9c25f32 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 a6e7c61b3ff5c7e02f7e5eddf6a6db0fe5b68671..0329a4f645f53e9fd7d38bfed862cd4172299357 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 5de8497270163dd69c44f84630244271dad31fbb..4c8fb60e2248eb1e9bea4428300deb431e920fcf 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 85b71ba7eb892911cd65a74b90dabf4f2c931a05..415ccd568041b71a9a47361f5004ab8b4cd1ead9 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 2c57c92cb38134ad6caacf5b36f96a82cd4d36d7..ce0dd800f4b73c0c8a6f2b443a40d7a0bb57f963 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 958d2292347bfc64909b1b67d17dcdf8b2765736..a1c4d17c0027765f175313e66a9561fa45f30151 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 3a32c2106ed956ddda0426f3288cab4bc9087f96..d80166c8137ef51bcf0c153b1a967650a1b96523 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 45d822c537428d25bae9d1452cda164cabc87fca..5c02f93b8beb41515b491d1d641c5bc060d96665 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 4c2972f79123a6179eb8596f99858d2143b93c1b..889c0d76fa000621d12e4f3cec28c20d50a84b46 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 b2fa171d955a18858474250e6ae507e1aaad1f6c..20d5f45c66e5142513dfd1cd6b53698868da9e43 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 8272aecd991c16ac94a817b3f0003c3e8bf85f90..a02c6c250d26592421cb8892f0ae54e915af79ef 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 81d917ccb86981650bb8df1fc9283380db2a65a8..68c0be48fae9fcff432745a2e194189bb37dc11c 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>