diff --git a/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java b/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java new file mode 100644 index 0000000000..4b14463440 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java @@ -0,0 +1,89 @@ +package org.thoughtcrime.securesms; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.lifecycle.Lifecycle; + +import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.recipients.RecipientUtil; +import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; +import org.thoughtcrime.securesms.util.concurrent.SimpleTask; + +public final class BlockUnblockDialog { + + private BlockUnblockDialog() { + } + + public static void handleBlock(@NonNull Context context, + @NonNull Lifecycle lifecycle, + @NonNull RecipientId recipientId) + { + SimpleTask.run( + lifecycle, + () -> { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + Recipient resolved = Recipient.resolved(recipientId); + + if (resolved.isGroup()) { + if (DatabaseFactory.getGroupDatabase(context).isActive(resolved.requireGroupId())) { + builder.setTitle(R.string.RecipientPreferenceActivity_block_and_leave_group); + } else { + builder.setTitle(R.string.RecipientPreferenceActivity_block_group); + } + builder.setMessage(R.string.RecipientPreferenceActivity_block_and_leave_group_description); + } else { + builder.setTitle(R.string.RecipientPreferenceActivity_block_this_contact_question) + .setMessage(R.string.RecipientPreferenceActivity_you_will_no_longer_receive_messages_and_calls_from_this_contact); + } + + return builder.setCancelable(true) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.RecipientPreferenceActivity_block, (dialog, which) -> setBlocked(context, resolved, true)); + }, + AlertDialog.Builder::show); + } + + public static void handleUnblock(@NonNull Context context, + @NonNull Lifecycle lifecycle, + @NonNull RecipientId recipientId, + @Nullable Runnable postUnblock) + { + SimpleTask.run( + lifecycle, + () -> { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + Recipient resolved = Recipient.resolved(recipientId); + + if (resolved.isGroup()) { + builder.setTitle(R.string.RecipientPreferenceActivity_unblock_this_group_question) + .setMessage(R.string.RecipientPreferenceActivity_unblock_this_group_description); + } else { + builder.setTitle(R.string.RecipientPreferenceActivity_unblock_this_contact_question) + .setMessage(R.string.RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact); + } + + return builder.setCancelable(true) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.RecipientPreferenceActivity_unblock, (dialog, which) -> { + setBlocked(context, resolved, false); + if (postUnblock != null) postUnblock.run(); + }); + }, + AlertDialog.Builder::show); + } + + private static void setBlocked(@NonNull final Context context, final Recipient recipient, final boolean blocked) { + SignalExecutors.BOUNDED.execute(() -> { + if (blocked) { + RecipientUtil.block(context, recipient); + } else { + RecipientUtil.unblock(context, recipient); + } + }); + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java index 816b439d74..0adbf798ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java @@ -1,15 +1,8 @@ package org.thoughtcrime.securesms; import android.content.Context; -import android.content.Intent; import android.database.Cursor; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.ListFragment; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.Loader; -import androidx.cursoradapter.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -17,6 +10,13 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cursoradapter.widget.CursorAdapter; +import androidx.fragment.app.ListFragment; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; + import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.loaders.BlockedContactsLoader; import org.thoughtcrime.securesms.mms.GlideApp; @@ -25,21 +25,17 @@ import org.thoughtcrime.securesms.preferences.BlockedContactListItem; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity { - private final DynamicTheme dynamicTheme = new DynamicTheme(); - private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); + private final DynamicTheme dynamicTheme = new DynamicTheme(); @Override public void onPreCreate() { dynamicTheme.onCreate(this); - dynamicLanguage.onCreate(this); } - @Override public void onCreate(Bundle bundle, boolean ready) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -51,16 +47,12 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity public void onResume() { super.onResume(); dynamicTheme.onResume(this); - dynamicLanguage.onResume(this); } @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: finish(); return true; - } - - return false; + public boolean onSupportNavigateUp() { + onBackPressed(); + return true; } public static class BlockedContactsFragment @@ -76,14 +68,14 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); - setListAdapter(new BlockedContactAdapter(getActivity(), GlideApp.with(this), null)); - getLoaderManager().initLoader(0, null, this); + setListAdapter(new BlockedContactAdapter(requireActivity(), GlideApp.with(this), null)); + LoaderManager.getInstance(this).initLoader(0, null, this); } @Override public void onStart() { super.onStart(); - getLoaderManager().restartLoader(0, null, this); + LoaderManager.getInstance(this).restartLoader(0, null, this); } @Override @@ -114,10 +106,10 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Recipient recipient = ((BlockedContactListItem)view).getRecipient(); - Intent intent = new Intent(getActivity(), RecipientPreferenceActivity.class); - intent.putExtra(RecipientPreferenceActivity.RECIPIENT_ID, recipient.getId()); - - startActivity(intent); + BlockUnblockDialog.handleUnblock(requireContext(), + getLifecycle(), + recipient.getId(), + () -> LoaderManager.getInstance(this).restartLoader(0, null, this)); } private static class BlockedContactAdapter extends CursorAdapter { @@ -143,7 +135,5 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity ((BlockedContactListItem) view).set(glideRequests, recipient); } } - } - } diff --git a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java index 27221a7fb7..9a7bcf7d9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms; import android.annotation.SuppressLint; -import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.database.Cursor; @@ -25,7 +24,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; @@ -48,7 +46,6 @@ import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; -import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.crypto.IdentityKeyParcelable; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.IdentityDatabase; @@ -73,7 +70,6 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.Dialogs; import org.thoughtcrime.securesms.util.DynamicDarkToolbarTheme; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -85,7 +81,6 @@ import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.whispersystems.libsignal.util.guava.Optional; @@ -706,73 +701,11 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi private class BlockClickedListener implements Preference.OnPreferenceClickListener { @Override public boolean onPreferenceClick(Preference preference) { - if (recipient.get().isBlocked()) handleUnblock(preference.getContext()); - else handleBlock(preference.getContext()); + if (recipient.get().isBlocked()) BlockUnblockDialog.handleUnblock(preference.getContext(), getLifecycle(), recipient.getId(), null); + else BlockUnblockDialog.handleBlock(preference.getContext(), getLifecycle(), recipient.getId()); return true; } - - private void handleBlock(@NonNull final Context context) { - new AsyncTask>() { - - @Override - protected Pair doInBackground(Void... voids) { - int titleRes = R.string.RecipientPreferenceActivity_block_this_contact_question; - int bodyRes = R.string.RecipientPreferenceActivity_you_will_no_longer_receive_messages_and_calls_from_this_contact; - - if (recipient.get().isGroup()) { - bodyRes = R.string.RecipientPreferenceActivity_block_and_leave_group_description; - - if (recipient.get().isGroup() && DatabaseFactory.getGroupDatabase(context).isActive(recipient.get().requireGroupId())) { - titleRes = R.string.RecipientPreferenceActivity_block_and_leave_group; - } else { - titleRes = R.string.RecipientPreferenceActivity_block_group; - } - } - - return new Pair<>(titleRes, bodyRes); - } - - @Override - protected void onPostExecute(Pair titleAndBody) { - new AlertDialog.Builder(context) - .setTitle(titleAndBody.first) - .setMessage(titleAndBody.second) - .setCancelable(true) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.RecipientPreferenceActivity_block, (dialog, which) -> { - setBlocked(context, recipient.get(), true); - }).show(); - } - }.execute(); - } - - private void handleUnblock(@NonNull Context context) { - int titleRes = R.string.RecipientPreferenceActivity_unblock_this_contact_question; - int bodyRes = R.string.RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact; - - if (recipient.resolve().isGroup()) { - titleRes = R.string.RecipientPreferenceActivity_unblock_this_group_question; - bodyRes = R.string.RecipientPreferenceActivity_unblock_this_group_description; - } - - new AlertDialog.Builder(context) - .setTitle(titleRes) - .setMessage(bodyRes) - .setCancelable(true) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.RecipientPreferenceActivity_unblock, (dialog, which) -> setBlocked(context, recipient.get(), false)).show(); - } - - private void setBlocked(@NonNull final Context context, final Recipient recipient, final boolean blocked) { - SignalExecutors.BOUNDED.execute(() -> { - if (blocked) { - RecipientUtil.block(context, recipient); - } else { - RecipientUtil.unblock(context, recipient); - } - }); - } } private class AboutNumberClickedListener implements ContactPreference.Listener {