From 964c4da15f767eb9b19c4fbb954c30c60afb01bc Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 10 Feb 2018 17:34:01 +0100 Subject: [PATCH] Some refactoring --- .idea/dictionaries/vanitas.xml | 7 +++ .idea/misc.xml | 2 +- mobile/build.gradle | 8 ++-- mobile/src/main/AndroidManifest.xml | 4 +- ...Listener.java => AbstractTextWatcher.java} | 9 +++- .../mvp/contracts/ContactListContract.java | 28 ++++++++++++ .../mvp/contracts/ConversationContract.java | 27 +++++++++++ .../contracts/ConversationListContract.java | 20 +++++++++ .../contracts}/LoginContract.java | 2 +- .../slam/mvp/contracts/SearchContract.java | 25 +++++++++++ .../slam/mvp/presenter/LoginPresenter.java | 43 ++++++++++++++++++ .../presenter/dummy}/DummyLoginPresenter.java | 16 ++++--- .../view/ConversationFragment.java} | 6 ++- .../view/ConversationListFragment.java} | 20 ++++----- .../{activity => mvp/view}/LoginActivity.java | 13 +++--- .../{activity => mvp/view}/MainActivity.java | 8 ++-- .../slam/mvp/view/SearchFragment.java | 45 +++++++++++++++++++ .../view}/abstr/ThemedAppCompatActivity.java | 2 +- ...tListEntry.java => ConversationEntry.java} | 4 +- mobile/src/main/res/layout/activity_login.xml | 2 +- 20 files changed, 251 insertions(+), 40 deletions(-) create mode 100644 .idea/dictionaries/vanitas.xml rename mobile/src/main/java/de/vanitasvitae/slam/{AfterTextChangedListener.java => AbstractTextWatcher.java} (61%) create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ContactListContract.java create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationContract.java create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java rename mobile/src/main/java/de/vanitasvitae/slam/{mvp_contracts => mvp/contracts}/LoginContract.java (93%) create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/SearchContract.java create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/LoginPresenter.java rename mobile/src/main/java/de/vanitasvitae/slam/{activity => mvp/presenter/dummy}/DummyLoginPresenter.java (80%) rename mobile/src/main/java/de/vanitasvitae/slam/{activity/ChatFragment.java => mvp/view/ConversationFragment.java} (94%) rename mobile/src/main/java/de/vanitasvitae/slam/{activity/ChatListFragment.java => mvp/view/ConversationListFragment.java} (77%) rename mobile/src/main/java/de/vanitasvitae/slam/{activity => mvp/view}/LoginActivity.java (90%) rename mobile/src/main/java/de/vanitasvitae/slam/{activity => mvp/view}/MainActivity.java (89%) create mode 100644 mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java rename mobile/src/main/java/de/vanitasvitae/slam/{activity => mvp/view}/abstr/ThemedAppCompatActivity.java (98%) rename mobile/src/main/java/de/vanitasvitae/slam/ui/{ChatListEntry.java => ConversationEntry.java} (86%) diff --git a/.idea/dictionaries/vanitas.xml b/.idea/dictionaries/vanitas.xml new file mode 100644 index 0000000..788ad79 --- /dev/null +++ b/.idea/dictionaries/vanitas.xml @@ -0,0 +1,7 @@ + + + + schaub + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index ba7052b..635999d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ - + diff --git a/mobile/build.gradle b/mobile/build.gradle index 36c8965..f4e8665 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -34,10 +34,10 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' - //compile "org.igniterealtime.smack:smack-android-extensions:$smackVersion" - //compile "org.igniterealtime.smack:smack-omemo-signal:$smackVersion" - //compile "org.igniterealtime.smack:smack-tcp:$smackVersion" - //compile "org.igniterealtime.smack:smack-experimental:$smackVersion" + compile "org.igniterealtime.smack:smack-android-extensions:$smackVersion" + compile "org.igniterealtime.smack:smack-omemo-signal:$smackVersion" + compile "org.igniterealtime.smack:smack-tcp:$smackVersion" + compile "org.igniterealtime.smack:smack-experimental:$smackVersion" compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' diff --git a/mobile/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml index 661140a..4381476 100644 --- a/mobile/src/main/AndroidManifest.xml +++ b/mobile/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:supportsRtl="true" android:theme="@style/Slam"> @@ -25,7 +25,7 @@ - + contacts); + void clearContactListItems(); + void onUpdateContactPresence(); + void showContactListLoadingIndicator(); + void hideContactListLoadingIndicator(); + } + + interface Presenter { + void onContactListItemClick(); + void onContactListItemLongClick(); + void addNewContact(); + void deleteContact(); + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationContract.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationContract.java new file mode 100644 index 0000000..3c7223f --- /dev/null +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationContract.java @@ -0,0 +1,27 @@ +package de.vanitasvitae.slam.mvp.contracts; + +import java.util.List; + +import de.vanitasvitae.slam.mvp.view.ConversationFragment; + +/** + * Model-View-Presenter contract for the {@link ConversationFragment}. + * Created by Paul Schaub on 01.02.18. + */ +public interface ConversationContract { + + interface View { + void addMessageItems(List messages, boolean end); + void highlightMessageItem(); + void correctMessageItem(); + void navigateToContactProfile(); + } + + interface Presenter { + void onConversationScrolledToTop(); + void onComposingMessageChanged(String composingMessage); + void onMessageItemClick(); + void onMessageItemLongClick(); + void onMessageItemSenderClick(); + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java new file mode 100644 index 0000000..35218b1 --- /dev/null +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java @@ -0,0 +1,20 @@ +package de.vanitasvitae.slam.mvp.contracts; + +import java.util.List; + +/** + * Model-View-Presenter contract of the conversation list fragment. + * Created by Paul Schaub on 01.02.18. + */ +public interface ConversationListContract { + + interface View { + void populateConversationList(List conversations); + } + + interface Presenter { + void onConversationClick(); + void onConversationLongClick(); + void load(); + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp_contracts/LoginContract.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/LoginContract.java similarity index 93% rename from mobile/src/main/java/de/vanitasvitae/slam/mvp_contracts/LoginContract.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/LoginContract.java index f3c8b7b..8d73e1d 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/mvp_contracts/LoginContract.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/LoginContract.java @@ -1,4 +1,4 @@ -package de.vanitasvitae.slam.mvp_contracts; +package de.vanitasvitae.slam.mvp.contracts; /** * Model-View-Presenter contract of the login screen. diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/SearchContract.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/SearchContract.java new file mode 100644 index 0000000..6ef285b --- /dev/null +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/SearchContract.java @@ -0,0 +1,25 @@ +package de.vanitasvitae.slam.mvp.contracts; + +import java.util.List; + +/** + * Model-View-Presenter contract for the {@link de.vanitasvitae.slam.mvp.view.SearchFragment}. + * Created by Paul Schaub on 01.02.18. + */ +public interface SearchContract { + + interface View { + void addSearchResults(List results); + void clearSearchResults(); + void showLoadingIndicator(); + void hideLoadingIndicator(); + void showEmptySearchResults(); + void hideEmptySearchResults(); + } + + interface Presenter { + void onSearchQueryChanged(String query); + void onSearchResultClick(); + void onSearchScrolledToBottom(); + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/LoginPresenter.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/LoginPresenter.java new file mode 100644 index 0000000..a2f7510 --- /dev/null +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/LoginPresenter.java @@ -0,0 +1,43 @@ +package de.vanitasvitae.slam.mvp.presenter; + +import org.jxmpp.jid.BareJid; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; + +import de.vanitasvitae.slam.mvp.contracts.LoginContract; + +/** + * Created by Paul Schaub on 01.02.18. + */ +public class LoginPresenter implements LoginContract.Presenter { + + private final LoginContract.View view; + + private BareJid jid; + private String password; + + public LoginPresenter(LoginContract.View view) { + this.view = view; + } + + @Override + public void jidChanged(String jid) { + try { + this.jid = JidCreate.entityBareFrom(jid); + view.hideInvalidJidError(); + } catch (XmppStringprepException e) { + this.jid = null; + view.showInvalidJidError(); + } + } + + @Override + public void passwordChanged(String password) { + + } + + @Override + public void loginClicked() { + + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/DummyLoginPresenter.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyLoginPresenter.java similarity index 80% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/DummyLoginPresenter.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyLoginPresenter.java index 3a71c0f..35dff61 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/DummyLoginPresenter.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyLoginPresenter.java @@ -1,12 +1,16 @@ -package de.vanitasvitae.slam.activity; +package de.vanitasvitae.slam.mvp.presenter.dummy; import android.os.Handler; -import de.vanitasvitae.slam.mvp_contracts.LoginContract; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; + +import de.vanitasvitae.slam.mvp.contracts.LoginContract; /** * Dummy presenter, that has no model. * This is used to demonstrate the capabilities of the view. + * * Created by Paul Schaub on 01.02.18. */ public class DummyLoginPresenter implements LoginContract.Presenter { @@ -19,10 +23,12 @@ public class DummyLoginPresenter implements LoginContract.Presenter { @Override public void jidChanged(String jid) { - if (jid.length() < 10) { - view.showInvalidJidError(); - } else { + // Check if jid is valid XMPP ID. + try { + JidCreate.entityBareFrom(jid); view.hideInvalidJidError(); + } catch (XmppStringprepException e) { + view.showInvalidJidError(); } } diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/ChatFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java similarity index 94% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/ChatFragment.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java index bb5d70b..1cbdb52 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/ChatFragment.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java @@ -1,4 +1,4 @@ -package de.vanitasvitae.slam.activity; +package de.vanitasvitae.slam.mvp.view; import android.app.Fragment; import android.os.Bundle; @@ -16,9 +16,11 @@ import de.vanitasvitae.slam.R; import de.vanitasvitae.slam.ui.ChatMessageEntry; /** + * Fragment that shows the conversation with a user. + * * Created by Paul Schaub on 30.01.18. */ -public class ChatFragment extends Fragment { +public class ConversationFragment extends Fragment { @BindView(R.id.recycler_chat) RecyclerView recyclerView; diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/ChatListFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java similarity index 77% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/ChatListFragment.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java index 174053a..1062beb 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/ChatListFragment.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java @@ -1,24 +1,24 @@ -package de.vanitasvitae.slam.activity; +package de.vanitasvitae.slam.mvp.view; import android.app.Fragment; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import de.vanitasvitae.slam.R; -import de.vanitasvitae.slam.ui.ChatListEntry; +import de.vanitasvitae.slam.ui.ConversationEntry; /** + * Fragment that lists conversations the user takes part in. + * * Created by Paul Schaub on 30.01.18. */ -public class ChatListFragment extends Fragment { +public class ConversationListFragment extends Fragment { @BindView(R.id.recycler_chatlist) RecyclerView recyclerView; @@ -39,21 +39,21 @@ public class ChatListFragment extends Fragment { final boolean[] reads = {true, false, true}; recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - recyclerView.setAdapter(new RecyclerView.Adapter() { + recyclerView.setAdapter(new RecyclerView.Adapter() { @Override - public ChatListEntry onCreateViewHolder(ViewGroup parent, int viewType) { + public ConversationEntry onCreateViewHolder(ViewGroup parent, int viewType) { View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.chatlist_singlechat, parent, false); view1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_container, new ChatFragment()).commit(); + getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_container, new ConversationFragment()).commit(); } }); - return new ChatListEntry(view1); + return new ConversationEntry(view1); } @Override - public void onBindViewHolder(ChatListEntry holder, int position) { + public void onBindViewHolder(ConversationEntry holder, int position) { holder.bind( usernames[position], messages[position], diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/LoginActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java similarity index 90% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/LoginActivity.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java index 062ab2b..3707146 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/LoginActivity.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java @@ -1,4 +1,4 @@ -package de.vanitasvitae.slam.activity; +package de.vanitasvitae.slam.mvp.view; import android.content.Intent; import android.os.Bundle; @@ -17,11 +17,12 @@ import android.widget.Toast; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -import de.vanitasvitae.slam.AfterTextChangedListener; +import de.vanitasvitae.slam.AbstractTextWatcher; import de.vanitasvitae.slam.EditorActionDoneListener; import de.vanitasvitae.slam.R; -import de.vanitasvitae.slam.activity.abstr.ThemedAppCompatActivity; -import de.vanitasvitae.slam.mvp_contracts.LoginContract; +import de.vanitasvitae.slam.mvp.view.abstr.ThemedAppCompatActivity; +import de.vanitasvitae.slam.mvp.presenter.dummy.DummyLoginPresenter; +import de.vanitasvitae.slam.mvp.contracts.LoginContract; public class LoginActivity extends ThemedAppCompatActivity implements LoginContract.View { @@ -67,14 +68,14 @@ public class LoginActivity extends ThemedAppCompatActivity implements LoginContr } }); - inputUsername.addTextChangedListener(new AfterTextChangedListener() { + inputUsername.addTextChangedListener(new AbstractTextWatcher() { @Override public void afterTextChanged(Editable s) { presenter.jidChanged(s.toString()); } }); - inputPassword.addTextChangedListener(new AfterTextChangedListener() { + inputPassword.addTextChangedListener(new AbstractTextWatcher() { @Override public void afterTextChanged(Editable s) { presenter.passwordChanged(s.toString()); diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/MainActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java similarity index 89% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/MainActivity.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java index 643d478..72f37cf 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/MainActivity.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java @@ -1,4 +1,4 @@ -package de.vanitasvitae.slam.activity; +package de.vanitasvitae.slam.mvp.view; import android.app.Fragment; import android.os.Bundle; @@ -13,9 +13,11 @@ import android.widget.FrameLayout; import butterknife.BindView; import butterknife.ButterKnife; import de.vanitasvitae.slam.R; -import de.vanitasvitae.slam.activity.abstr.ThemedAppCompatActivity; +import de.vanitasvitae.slam.mvp.view.abstr.ThemedAppCompatActivity; /** + * Main activity that hosts some fragments. + * * Created by vanitas on 22.01.18. */ public class MainActivity extends ThemedAppCompatActivity { @@ -48,7 +50,7 @@ public class MainActivity extends ThemedAppCompatActivity { this, drawerLayout, toolbar, R.string.error_incorrect_password, R.string.error_invalid_jid); drawerLayout.addDrawerListener(drawerToggle); - Fragment chatListFragment = new ChatListFragment(); + Fragment chatListFragment = new ConversationListFragment(); Log.d(TAG, "Begin Transaction"); getFragmentManager().beginTransaction().add(R.id.fragment_container, chatListFragment).commit(); } diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java new file mode 100644 index 0000000..23a138f --- /dev/null +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java @@ -0,0 +1,45 @@ +package de.vanitasvitae.slam.mvp.view; + +import android.app.Fragment; + +import java.util.List; + +import de.vanitasvitae.slam.mvp.contracts.SearchContract; + +/** + * Fragment that shows search results from contacts and messages (and maybe services?). + * + * Created by Paul Schaub on 01.02.18. + */ +public class SearchFragment extends Fragment implements SearchContract.View { + + @Override + public void addSearchResults(List results) { + + } + + @Override + public void clearSearchResults() { + + } + + @Override + public void showLoadingIndicator() { + + } + + @Override + public void hideLoadingIndicator() { + + } + + @Override + public void showEmptySearchResults() { + + } + + @Override + public void hideEmptySearchResults() { + + } +} diff --git a/mobile/src/main/java/de/vanitasvitae/slam/activity/abstr/ThemedAppCompatActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/abstr/ThemedAppCompatActivity.java similarity index 98% rename from mobile/src/main/java/de/vanitasvitae/slam/activity/abstr/ThemedAppCompatActivity.java rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/abstr/ThemedAppCompatActivity.java index dfba76e..f30fd22 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/activity/abstr/ThemedAppCompatActivity.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/abstr/ThemedAppCompatActivity.java @@ -1,4 +1,4 @@ -package de.vanitasvitae.slam.activity.abstr; +package de.vanitasvitae.slam.mvp.view.abstr; import android.annotation.SuppressLint; import android.content.Intent; diff --git a/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatListEntry.java b/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java similarity index 86% rename from mobile/src/main/java/de/vanitasvitae/slam/ui/ChatListEntry.java rename to mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java index 69cdd41..9150eb7 100644 --- a/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatListEntry.java +++ b/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java @@ -9,11 +9,11 @@ import de.vanitasvitae.slam.R; /** * Created by Paul Schaub on 30.01.18. */ -public class ChatListEntry extends RecyclerView.ViewHolder { +public class ConversationEntry extends RecyclerView.ViewHolder { private View view; - public ChatListEntry(View itemView) { + public ConversationEntry(View itemView) { super(itemView); this.view = itemView; } diff --git a/mobile/src/main/res/layout/activity_login.xml b/mobile/src/main/res/layout/activity_login.xml index 12f00c1..aede9b6 100644 --- a/mobile/src/main/res/layout/activity_login.xml +++ b/mobile/src/main/res/layout/activity_login.xml @@ -16,7 +16,7 @@ android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" - tools:context="de.vanitasvitae.slam.activity.LoginActivity" + tools:context="de.vanitasvitae.slam.mvp.view.LoginActivity" android:background="@drawable/material_bg">