Refactor ChatActivity, use Arguments helper classes and wrap AccountDetailsFragment in own Activity

This commit is contained in:
Paul Schaub 2020-08-11 18:41:03 +02:00
parent 4f04a29798
commit 2839d8177d
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
22 changed files with 212 additions and 120 deletions

View File

@ -33,7 +33,8 @@
<activity
android:name=".android.ui.settings.SettingsActivity"
android:label="@string/title_activity_settings" />
<activity android:name=".android.ui.roster.contacts.detail.ContactDetailActivity" />
<activity android:name=".android.ui.contacts.detail.ContactDetailActivity" />
<activity android:name=".android.ui.account.detail.AccountDetailsActivity" />
<service android:name=".android.service.MercuryForegroundService" />
</application>

View File

@ -69,8 +69,7 @@ public class Notifications {
Intent tapAction = new Intent(context, ChatActivity.class);
tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
tapAction.putExtra(ChatActivity.EXTRA_JID, chat.getPeer().getAddress());
tapAction.putExtra(ChatActivity.EXTRA_ACCOUNT, chat.getPeer().getAccount().getId());
tapAction.putExtra(ChatActivity.EXTRA_CHAT_ID, chat.getId().toString());
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, tapAction, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context,

View File

@ -4,7 +4,7 @@ import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.android.di.module.AndroidDatabaseModule;
import org.mercury_im.messenger.android.di.module.AndroidSchedulersModule;
import org.mercury_im.messenger.android.ui.account.detail.AndroidAccountDetailsViewModel;
import org.mercury_im.messenger.android.ui.roster.contacts.AndroidContactListViewModel;
import org.mercury_im.messenger.android.ui.contacts.AndroidContactListViewModel;
import org.mercury_im.messenger.core.di.module.OpenPgpModule;
import org.mercury_im.messenger.core.di.module.RxMercuryMessageStoreFactoryModule;
import org.mercury_im.messenger.core.di.module.RxMercuryRosterStoreFactoryModule;
@ -26,8 +26,8 @@ import org.mercury_im.messenger.android.ui.chat.ChatInputFragment;
import org.mercury_im.messenger.android.ui.chat.ChatInputViewModel;
import org.mercury_im.messenger.android.ui.chat.AndroidChatViewModel;
import org.mercury_im.messenger.android.ui.chatlist.AndroidChatListViewModel;
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailActivity;
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailViewModel;
import org.mercury_im.messenger.android.ui.contacts.detail.ContactDetailActivity;
import org.mercury_im.messenger.android.ui.contacts.detail.ContactDetailViewModel;
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
import javax.inject.Singleton;

View File

@ -16,14 +16,14 @@ import com.google.android.material.navigation.NavigationView;
import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.account.detail.AccountDetailsFragment;
import org.mercury_im.messenger.android.ui.account.detail.AccountDetailsActivity;
import org.mercury_im.messenger.android.ui.account.DeleteAccountDialogFragment;
import org.mercury_im.messenger.android.ui.account.OnAccountListItemClickListener;
import org.mercury_im.messenger.android.ui.account.list.AccountListFragment;
import org.mercury_im.messenger.core.data.repository.AccountRepository;
import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.android.ui.chatlist.ChatListFragment;
import org.mercury_im.messenger.android.ui.roster.RosterFragment;
import org.mercury_im.messenger.android.ui.contacts.RosterFragment;
import org.mercury_im.messenger.android.ui.settings.SettingsActivity;
import javax.inject.Inject;
@ -112,8 +112,9 @@ public class MainActivity extends AppCompatActivity
@Override
public void onAccountListItemClick(Account item) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, new AccountDetailsFragment(item.getId())).commit();
Intent intent = new Intent(this, AccountDetailsActivity.class);
intent.putExtra(AccountDetailsActivity.EXTRA_ACCOUNT_ID, item.getId().toString());
startActivity(intent);
}
@Override

View File

@ -0,0 +1,17 @@
package org.mercury_im.messenger.android.ui;
import android.content.Intent;
import android.os.Bundle;
public interface MercuryActivity {
default Bundle requiredExtras(Bundle savedInstanceState, Intent intent) {
if (savedInstanceState == null) {
savedInstanceState = intent.getExtras();
}
if (savedInstanceState == null) {
throw new IllegalArgumentException("Missing bundle!");
}
return savedInstanceState;
}
}

View File

@ -0,0 +1,53 @@
package org.mercury_im.messenger.android.ui.account.detail;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.MercuryActivity;
import org.mercury_im.messenger.android.util.ArgumentUtils;
import java.util.UUID;
import butterknife.ButterKnife;
import lombok.Value;
public class AccountDetailsActivity extends AppCompatActivity implements MercuryActivity {
public static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
private UUID accountId;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//MercuryImApplication.getApplication().getAppComponent().inject(this);
Arguments arguments = getArguments(savedInstanceState);
accountId = arguments.getAccountId();
bindUiComponents();
}
private void bindUiComponents() {
setContentView(R.layout.activity_fragment_container);
ButterKnife.bind(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, new AccountDetailsFragment(accountId), "account_details")
.commit();
}
private Arguments getArguments(Bundle bundle) {
bundle = requiredExtras(bundle, getIntent());
UUID accountId = ArgumentUtils.requireUUID(bundle, EXTRA_ACCOUNT_ID);
return new Arguments(accountId);
}
@Value
private class Arguments {
UUID accountId;
}
}

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster.bookmarks;
package org.mercury_im.messenger.android.ui.bookmarks;
import android.os.Bundle;
import android.view.LayoutInflater;

View File

@ -98,6 +98,10 @@ public class AndroidChatViewModel extends ViewModel implements MercuryAndroidVie
getCommonViewModel().sendMessage(body);
}
public String getContactId() {
return getContact().getValue().getId().toString();
}
@Override
public ChatViewModel getCommonViewModel() {
return commonViewModel;

View File

@ -2,10 +2,8 @@ package org.mercury_im.messenger.android.ui.chat;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
@ -16,25 +14,27 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.MercuryActivity;
import org.mercury_im.messenger.android.util.ArgumentUtils;
import org.mercury_im.messenger.entity.contact.Peer;
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailActivity;
import org.mercury_im.messenger.android.ui.contacts.detail.ContactDetailActivity;
import java.util.UUID;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.disposables.CompositeDisposable;
import lombok.Value;
public class ChatActivity extends AppCompatActivity
implements ChatInputFragment.OnChatInputActionListener, SearchView.OnQueryTextListener {
implements MercuryActivity, ChatInputFragment.OnChatInputActionListener, SearchView.OnQueryTextListener {
public static final String EXTRA_CHAT_ID = "CHAT_ID";
public static final String EXTRA_JID = "JID";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private final MessagesRecyclerViewAdapter recyclerViewAdapter = new MessagesRecyclerViewAdapter();
private final CompositeDisposable disposable = new CompositeDisposable();
@BindView(R.id.toolbar)
Toolbar toolbar;
@ -42,53 +42,39 @@ public class ChatActivity extends AppCompatActivity
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
private final MessagesRecyclerViewAdapter recyclerViewAdapter = new MessagesRecyclerViewAdapter();
private AndroidChatViewModel androidChatViewModel;
private final CompositeDisposable disposable = new CompositeDisposable();
private UUID chatId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MercuryImApplication.getApplication().getAppComponent().inject(this);
Arguments arguments = getArguments(savedInstanceState);
chatId = arguments.getChatId();
androidChatViewModel = new ViewModelProvider(this).get(AndroidChatViewModel.class);
androidChatViewModel.init(chatId);
bindUiComponents();
observeViewModel(androidChatViewModel);
}
private void bindUiComponents() {
setContentView(R.layout.activity_chat);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setOnClickListener(v -> {
Intent intent = new Intent(ChatActivity.this, ContactDetailActivity.class);
intent.putExtra(ContactDetailActivity.EXTRA_PEER_ID, androidChatViewModel.getContactId());
ChatActivity.this.startActivity(intent);
});
recyclerView.setAdapter(recyclerViewAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MercuryImApplication.getApplication().getAppComponent().inject(this);
if (savedInstanceState == null) {
savedInstanceState = getIntent().getExtras();
if (savedInstanceState == null) return;
}
String chatIdString = savedInstanceState.getString(EXTRA_CHAT_ID);
if (chatIdString == null) {
return;
}
chatId = UUID.fromString(chatIdString);
androidChatViewModel = new ViewModelProvider(this).get(AndroidChatViewModel.class);
androidChatViewModel.init(chatId);
// Listen for updates to contact information and messages
observeViewModel(androidChatViewModel);
toolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ChatActivity.this, ContactDetailActivity.class);
intent.putExtra(ContactDetailActivity.EXTRA_PEER_ID, androidChatViewModel.getContact().getValue().getId().toString());
ChatActivity.this.startActivity(intent);
}
});
}
public void observeViewModel(AndroidChatViewModel viewModel) {
@ -204,4 +190,15 @@ public class ChatActivity extends AppCompatActivity
onBackPressed();
return true;
}
private Arguments getArguments(Bundle savedInstanceState) {
savedInstanceState = requiredExtras(savedInstanceState, getIntent());
UUID chatId = ArgumentUtils.requireUUID(savedInstanceState, EXTRA_CHAT_ID);
return new Arguments(chatId);
}
@Value
private class Arguments {
UUID chatId;
}
}

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster.contacts;
package org.mercury_im.messenger.android.ui.contacts;
import android.app.AlertDialog;
import android.app.Dialog;

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster.contacts;
package org.mercury_im.messenger.android.ui.contacts;
import android.app.Application;

View File

@ -1,6 +1,5 @@
package org.mercury_im.messenger.android.ui.roster.contacts;
package org.mercury_im.messenger.android.ui.contacts;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster.contacts;
package org.mercury_im.messenger.android.ui.contacts;
import android.content.Context;
import android.content.Intent;
@ -14,7 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.entity.contact.Peer;
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailActivity;
import org.mercury_im.messenger.android.ui.contacts.detail.ContactDetailActivity;
import org.mercury_im.messenger.android.ui.util.AbstractRecyclerViewAdapter;
import java.util.Objects;

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster;
package org.mercury_im.messenger.android.ui.contacts;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -16,8 +16,8 @@ import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.roster.bookmarks.BookmarkListFragment;
import org.mercury_im.messenger.android.ui.roster.contacts.ContactListFragment;
import org.mercury_im.messenger.android.ui.bookmarks.BookmarkListFragment;
import org.mercury_im.messenger.android.ui.contacts.ContactListFragment;
import butterknife.BindView;
import butterknife.ButterKnife;

View File

@ -0,0 +1,60 @@
package org.mercury_im.messenger.android.ui.contacts.detail;
import android.os.Bundle;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.MercuryActivity;
import org.mercury_im.messenger.android.util.ArgumentUtils;
import java.util.UUID;
import butterknife.BindView;
import butterknife.ButterKnife;
import lombok.Value;
public class ContactDetailActivity extends AppCompatActivity implements MercuryActivity {
public static final String EXTRA_PEER_ID = "PEER_ID";
private ContactDetailViewModel androidContactDetailViewModel;
private UUID peerId;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MercuryImApplication.getApplication().getAppComponent().inject(this);
Arguments arguments = getArguments(savedInstanceState);
peerId = arguments.getPeerId();
androidContactDetailViewModel = new ViewModelProvider(this).get(ContactDetailViewModel.class);
androidContactDetailViewModel.init(peerId);
bindUiComponents();
}
private void bindUiComponents() {
setContentView(R.layout.activity_fragment_container);
ButterKnife.bind(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, new ContactDetailFragment(), "contact_details")
.commit();
}
private Arguments getArguments(Bundle bundle) {
bundle = requiredExtras(bundle, getIntent());
UUID peerId = ArgumentUtils.requireUUID(bundle, EXTRA_PEER_ID);
return new Arguments(peerId);
}
@Value
private class Arguments {
UUID peerId;
}
}

View File

@ -1,4 +1,4 @@
package org.mercury_im.messenger.android.ui.roster.contacts.detail;
package org.mercury_im.messenger.android.ui.contacts.detail;
import android.app.AlertDialog;
import android.content.Context;
@ -31,7 +31,6 @@ import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.ui.chat.ChatActivity;
import org.mercury_im.messenger.android.util.ColorUtil;
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
import org.mercury_im.messenger.entity.chat.DirectChat;
import java.util.Arrays;
import java.util.List;

View File

@ -1,7 +1,6 @@
package org.mercury_im.messenger.android.ui.roster.contacts.detail;
package org.mercury_im.messenger.android.ui.contacts.detail;
import android.graphics.drawable.Drawable;
import android.util.Log;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
@ -16,7 +15,6 @@ import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.roster.RosterGroup;
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.mercury_im.messenger.android.MercuryImApplication;
@ -28,7 +26,6 @@ import org.mercury_im.messenger.core.data.repository.PeerRepository;
import org.mercury_im.messenger.core.util.Optional;
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
import org.mercury_im.messenger.entity.chat.Chat;
import org.mercury_im.messenger.entity.contact.Peer;
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
import org.mercury_im.messenger.core.util.CombinedPresenceListener;
import org.pgpainless.key.OpenPgpV4Fingerprint;
@ -81,7 +78,7 @@ public class ContactDetailViewModel extends ViewModel {
MercuryImApplication.getApplication().getAppComponent().inject(this);
}
public void bind(UUID peerId) {
public void init(UUID peerId) {
this.peerId = peerId;
disposable.add(peerRepository.getPeer(peerId)

View File

@ -1,47 +0,0 @@
package org.mercury_im.messenger.android.ui.roster.contacts.detail;
import android.os.Bundle;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.R;
import java.util.UUID;
import butterknife.BindView;
import butterknife.ButterKnife;
public class ContactDetailActivity extends AppCompatActivity {
public static final String EXTRA_JID = "JID";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
public static final String EXTRA_PEER_ID = "PEER_ID";
@BindView(R.id.fragment)
FrameLayout container;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_container);
ButterKnife.bind(this);
MercuryImApplication.getApplication().getAppComponent().inject(this);
if (savedInstanceState == null) {
savedInstanceState = getIntent().getExtras();
if (savedInstanceState == null) return;
}
String peerIdString = savedInstanceState.getString(EXTRA_PEER_ID);
UUID peerId = UUID.fromString(peerIdString);
ContactDetailViewModel viewModel = new ViewModelProvider(this).get(ContactDetailViewModel.class);
viewModel.bind(peerId);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment, new ContactDetailFragment(), "contact_details").commit();
}
}

View File

@ -1,4 +0,0 @@
/**
* Some Javadoc information about the package.
*/
package org.mercury_im.messenger.android.ui.roster;

View File

@ -0,0 +1,16 @@
package org.mercury_im.messenger.android.util;
import android.os.Bundle;
import java.util.UUID;
public class ArgumentUtils {
public static UUID requireUUID(Bundle bundle, String key) {
String uuidString = bundle.getString(key);
if (uuidString == null) {
throw new IllegalArgumentException("Missing required UUID '" + key + "' (as String)");
}
return UUID.fromString(uuidString);
}
}

View File

@ -12,7 +12,7 @@
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:context=".android.ui.roster.contacts.ContactListFragment"
tools:context=".android.ui.contacts.ContactListFragment"
tools:listitem="@layout/list_item_chat" />
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton

View File

@ -13,7 +13,7 @@
android:scrollbars="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/list_item_contact"
tools:context=".android.ui.roster.contacts.ContactListFragment"/>
tools:context=".android.ui.contacts.ContactListFragment"/>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
style="@style/Widget.MaterialComponents.ExtendedFloatingActionButton.Icon"