diff --git a/mobile/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml
index bb76a3c..26a700f 100644
--- a/mobile/src/main/AndroidManifest.xml
+++ b/mobile/src/main/AndroidManifest.xml
@@ -27,6 +27,7 @@
+
presences);
void clearFingerprints();
void addFingerprints(List> fingerprints);
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ContactListContract.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ContactListContract.java
index 8537c85..74be62f 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ContactListContract.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ContactListContract.java
@@ -22,6 +22,7 @@ import org.jxmpp.jid.BareJid;
import java.util.List;
import de.vanitasvitae.slam.mvp.view.ConversationListFragment;
+import de.vanitasvitae.slam.xmpp.Contact;
/**
* Model-View-Presenter contract for the {@link ConversationListFragment}.
@@ -31,12 +32,13 @@ import de.vanitasvitae.slam.mvp.view.ConversationListFragment;
public interface ContactListContract {
interface View {
- void addContactListItems(List> contacts);
+ void addContactListItems(List contacts);
void clearContactListItems();
void onUpdateContactPresence();
void showContactListLoadingIndicator();
void hideContactListLoadingIndicator();
void navigateToConversation(BareJid contact);
+ void navigateToContactDetail(BareJid contact);
}
interface Presenter {
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
index f108449..33abf0b 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/contracts/ConversationListContract.java
@@ -32,6 +32,7 @@ public interface ConversationListContract {
interface View {
void populateConversationList(List conversations);
void navigateToConversation(BareJid contact);
+ void navigateToContactDetail(BareJid contact);
}
interface Presenter {
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactDetailPresenter.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactDetailPresenter.java
index be0da86..86108e4 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactDetailPresenter.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactDetailPresenter.java
@@ -17,9 +17,15 @@
*/
package de.vanitasvitae.slam.mvp.presenter.dummy;
+import android.util.Log;
+
import org.jxmpp.jid.BareJid;
+import java.util.ArrayList;
+import java.util.List;
+
import de.vanitasvitae.slam.mvp.contracts.ContactDetailContract;
+import de.vanitasvitae.slam.xmpp.Resource;
public class DummyContactDetailPresenter implements ContactDetailContract.Presenter {
@@ -28,6 +34,17 @@ public class DummyContactDetailPresenter implements ContactDetailContract.Presen
public DummyContactDetailPresenter(ContactDetailContract.View view) {
this.view = view;
+
+ Log.d("SLAM", "Set dummy resources");
+ view.setResources(dummyResources());
+ }
+
+ private List dummyResources() {
+ List r = new ArrayList<>();
+ r.add(new Resource("Mobile", "Away since 15min", "Conversations 1.23.4", "Android"));
+ r.add(new Resource("Laptop", "online", "Gajim 16.0.6", "Arch Linux"));
+ r.add(new Resource("Desktop", "I like coffee!", "Dino", "Debian Stable"));
+ return r;
}
@Override
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactListPresenter.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactListPresenter.java
index e3a3d1d..b42533d 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactListPresenter.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/presenter/dummy/DummyContactListPresenter.java
@@ -17,6 +17,8 @@
*/
package de.vanitasvitae.slam.mvp.presenter.dummy;
+import de.vanitasvitae.slam.mvp.DummyPresenterFactory;
+import de.vanitasvitae.slam.mvp.DummyStore;
import de.vanitasvitae.slam.mvp.contracts.ContactListContract;
public class DummyContactListPresenter implements ContactListContract.Presenter {
@@ -25,6 +27,7 @@ public class DummyContactListPresenter implements ContactListContract.Presenter
public DummyContactListPresenter(ContactListContract.View view) {
this.view = view;
+ view.addContactListItems(DummyPresenterFactory.STORE.contacts);
}
@Override
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailActivity.java
new file mode 100644
index 0000000..212995c
--- /dev/null
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailActivity.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package de.vanitasvitae.slam.mvp.view;
+
+import android.os.Bundle;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.widget.Toolbar;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import de.hdodenhof.circleimageview.CircleImageView;
+import de.vanitasvitae.slam.R;
+import de.vanitasvitae.slam.mvp.PresenterFactory;
+import de.vanitasvitae.slam.mvp.contracts.ContactDetailContract;
+import de.vanitasvitae.slam.mvp.view.abstr.ThemedAppCompatActivity;
+import de.vanitasvitae.slam.xmpp.Resource;
+
+/**
+ * Main activity that hosts some fragments.
+ */
+public class ContactDetailActivity extends ThemedAppCompatActivity implements ContactDetailContract.View, AppBarLayout.OnOffsetChangedListener {
+
+ public static final String TAG = "Slam!";
+
+ private final ContactDetailContract.Presenter presenter;
+
+ private final ContactDetailResourcesFragment resourcesFragment = new ContactDetailResourcesFragment();
+ private final ContactDetailInfoFragment infoFragment = new ContactDetailInfoFragment();
+ private final ContactDetailSecurityFragment securityFragment = new ContactDetailSecurityFragment();
+
+ @BindView(R.id.contact_detail_toolbar)
+ Toolbar toolbar;
+
+ @BindView(R.id.contact_detail_appbar_layout)
+ AppBarLayout appBarLayout;
+
+ @BindView(R.id.contact_detail_tab_layout)
+ TabLayout tabLayout;
+
+ @BindView(R.id.contact_detail_viewpager)
+ ViewPager pager;
+
+ @BindView(R.id.contact_detail_profile_circle)
+ CircleImageView profileCircle;
+
+ private int mMaxScrollSize;
+ private boolean isProfileCircleShown;
+ private int animateProfileCirclePercent = 20;
+
+ public ContactDetailActivity() {
+ this.presenter = PresenterFactory.getInstance().createContactDetailPresenter(this);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_contact_detail);
+ ButterKnife.bind(this);
+
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ appBarLayout.addOnOffsetChangedListener(this);
+ pager.setAdapter(new DetailFragmentPagerAdapter(getSupportFragmentManager()));
+ tabLayout.setupWithViewPager(pager);
+ }
+
+ @Override
+ public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
+ if (mMaxScrollSize == 0)
+ mMaxScrollSize = appBarLayout.getTotalScrollRange();
+
+ int percentage = (Math.abs(i)) * 100 / mMaxScrollSize;
+
+ if (percentage >= animateProfileCirclePercent && isProfileCircleShown) {
+ isProfileCircleShown = false;
+
+ profileCircle.animate()
+ .scaleY(0).scaleX(0)
+ .setDuration(200)
+ .start();
+ }
+
+ if (percentage <= animateProfileCirclePercent && !isProfileCircleShown) {
+ isProfileCircleShown = true;
+
+ profileCircle.animate()
+ .scaleY(1).scaleX(1)
+ .start();
+ }
+ }
+
+
+ @Override
+ public void setContactAvatar() {
+
+ }
+
+ @Override
+ public void setNickname(String nickname) {
+
+ }
+
+ @Override
+ public void setResources(List resources) {
+ resourcesFragment.setResources(resources);
+ }
+
+ @Override
+ public void clearFingerprints() {
+
+ }
+
+ @Override
+ public void addFingerprints(List> fingerprints) {
+
+ }
+
+ class DetailFragmentPagerAdapter extends FragmentPagerAdapter {
+
+ public DetailFragmentPagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ @Override
+ public android.support.v4.app.Fragment getItem(int position) {
+ switch (position) {
+ case 0: return infoFragment;
+ case 1: return resourcesFragment;
+ case 2: return securityFragment;
+ default: return infoFragment;
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return 3;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ //TODO
+ switch (position) {
+ case 0:
+ return "Info";
+ case 1:
+ return "Devices";
+ case 2:
+ return "Security";
+ }
+ return null;
+ }
+ }
+}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailInfoFragment.java
similarity index 58%
rename from mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailFragment.java
rename to mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailInfoFragment.java
index 6ee2b7b..4fa60d8 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailFragment.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailInfoFragment.java
@@ -17,60 +17,25 @@
*/
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import org.jivesoftware.smack.packet.Presence;
-import org.jxmpp.jid.BareJid;
-
-import java.util.List;
-
import butterknife.ButterKnife;
import de.vanitasvitae.slam.R;
-import de.vanitasvitae.slam.mvp.PresenterFactory;
-import de.vanitasvitae.slam.mvp.contracts.ContactDetailContract;
-public class ContactDetailFragment extends Fragment implements ContactDetailContract.View {
-
- private final ContactDetailContract.Presenter presenter;
-
- public ContactDetailFragment() {
- this.presenter = PresenterFactory.getInstance().createContactDetailPresenter(this);
- }
+/**
+ * Created by Paul Schaub on 13.02.18.
+ */
+public class ContactDetailInfoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_contact_detail, container, false);
+ View view = inflater.inflate(R.layout.fragment_contact_detail__info, container, false);
ButterKnife.bind(this, view);
return view;
}
-
- @Override
- public void setContactAvatar() {
-
- }
-
- @Override
- public void setNickname(String nickname) {
-
- }
-
- @Override
- public void setPresence(Presence presence) {
-
- }
-
- @Override
- public void clearFingerprints() {
-
- }
-
- @Override
- public void addFingerprints(List> fingerprints) {
-
- }
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailResourcesFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailResourcesFragment.java
new file mode 100644
index 0000000..420d0b2
--- /dev/null
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailResourcesFragment.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package de.vanitasvitae.slam.mvp.view;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import de.vanitasvitae.slam.R;
+import de.vanitasvitae.slam.xmpp.Resource;
+
+/**
+ * Created by Paul Schaub on 13.02.18.
+ */
+public class ContactDetailResourcesFragment extends Fragment {
+
+ @BindView(R.id.contact_detail_resources_recycler_view)
+ RecyclerView resourcesRecyclerView;
+
+ private final List resources = new ArrayList<>();
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_contact_detail__resources, container, false);
+ ButterKnife.bind(this, view);
+ resourcesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ resourcesRecyclerView.setAdapter(resourcesAdapter);
+ resourcesAdapter.notifyDataSetChanged();
+ return view;
+ }
+
+ public void setResources(List resources) {
+ this.resources.clear();
+ this.resources.addAll(resources);
+ resourcesAdapter.notifyDataSetChanged();
+ }
+
+ private final RecyclerView.Adapter resourcesAdapter = new RecyclerView.Adapter() {
+ @Override
+ public ResourceView onCreateViewHolder(ViewGroup parent, int viewType) {
+ View resourceView = LayoutInflater.from(getActivity()).inflate(R.layout.item_resource, parent, false);
+ return new ResourceView(resourceView);
+ }
+
+ @Override
+ public void onBindViewHolder(final ResourceView holder, final int position) {
+ Resource resource = resources.get(holder.getAdapterPosition());
+ holder.bind(resource);
+ }
+
+ @Override
+ public int getItemCount() {
+ return resources.size();
+ }
+ };
+
+
+ static class ResourceView extends RecyclerView.ViewHolder {
+
+ public ResourceView(View itemView) {
+ super(itemView);
+ }
+
+ public void bind(Resource resource) {
+ ((TextView)itemView.findViewById(R.id.resource__resource_value)).setText(resource.getResource());
+ ((TextView)itemView.findViewById(R.id.resource__status_value)).setText(resource.getStatus());
+ ((TextView)itemView.findViewById(R.id.resource__client_value)).setText(resource.getClient());
+ ((TextView)itemView.findViewById(R.id.resource__system_value)).setText(resource.getSystem());
+ }
+ }
+}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailSecurityFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailSecurityFragment.java
new file mode 100644
index 0000000..3494d60
--- /dev/null
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactDetailSecurityFragment.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package de.vanitasvitae.slam.mvp.view;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import butterknife.ButterKnife;
+import de.vanitasvitae.slam.R;
+
+/**
+ * Created by Paul Schaub on 13.02.18.
+ */
+public class ContactDetailSecurityFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_contact_detail__security, container, false);
+ ButterKnife.bind(this, view);
+ return view;
+ }
+}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactListFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactListFragment.java
index 2c33760..4ea4089 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactListFragment.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ContactListFragment.java
@@ -1,36 +1,86 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
+import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
import org.jxmpp.jid.BareJid;
+import java.util.ArrayList;
import java.util.List;
+import butterknife.BindView;
+import butterknife.ButterKnife;
import de.vanitasvitae.slam.R;
import de.vanitasvitae.slam.mvp.PresenterFactory;
import de.vanitasvitae.slam.mvp.contracts.ContactListContract;
+import de.vanitasvitae.slam.ui.ContactListEntry;
+import de.vanitasvitae.slam.xmpp.Contact;
/**
* Created by Paul Schaub on 11.02.18.
*/
public class ContactListFragment extends Fragment implements ContactListContract.View {
+ @BindView(R.id.recycler_list)
+ RecyclerView recyclerView;
+
private final ContactListContract.Presenter presenter;
+ private final List contacts = new ArrayList<>();
+
public ContactListFragment() {
super();
this.presenter = PresenterFactory.getInstance().createContactListPresenter(this);
}
@Override
- public void addContactListItems(List> contacts) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_conversation_contact_list, container, false);
+ ButterKnife.bind(this, view);
+ return view;
+ }
+ @Override
+ public void onViewCreated(final View view, Bundle savedInstanceState) {
+ recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+ recyclerView.setAdapter(contactsAdapter);
+ contactsAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void addContactListItems(List contacts) {
+ this.contacts.addAll(contacts);
+ contactsAdapter.notifyDataSetChanged();
}
@Override
public void clearContactListItems() {
-
+ this.contacts.clear();
+ contactsAdapter.notifyDataSetChanged();
}
@Override
@@ -48,6 +98,31 @@ public class ContactListFragment extends Fragment implements ContactListContract
}
+ private final RecyclerView.Adapter contactsAdapter = new RecyclerView.Adapter() {
+ @Override
+ public ContactListEntry onCreateViewHolder(ViewGroup parent, int viewType) {
+ View contactView = LayoutInflater.from(getActivity()).inflate(R.layout.item_contact, parent, false);
+ return new ContactListEntry(contactView);
+ }
+
+ @Override
+ public void onBindViewHolder(ContactListEntry holder, int position) {
+ final Contact contact = contacts.get(holder.getAdapterPosition());
+ holder.bind(contact);
+ holder.setOnAvatarClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ navigateToContactDetail(contact.getJid());
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return contacts.size();
+ }
+ };
+
@Override
public void navigateToConversation(BareJid contact) {
ConversationFragment fragment = new ConversationFragment();
@@ -60,4 +135,11 @@ public class ContactListFragment extends Fragment implements ContactListContract
.addToBackStack("conversation")
.commit();
}
+
+ @Override
+ public void navigateToContactDetail(BareJid contact) {
+ startActivity(new Intent(getContext(), ContactDetailActivity.class));
+ }
+
+
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java
index e1e6420..c51f30b 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationFragment.java
@@ -17,8 +17,9 @@
*/
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
+import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@@ -61,15 +62,7 @@ public class ConversationFragment extends Fragment implements ConversationContra
private final RecyclerView.Adapter chatMessageAdapter = new RecyclerView.Adapter() {
@Override
public ChatMessageEntry onCreateViewHolder(ViewGroup parent, int viewType) {
- View messageView = LayoutInflater.from(getActivity()).inflate(R.layout.item_chatmessage, parent, false);
- messageView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- getFragmentManager().beginTransaction()
- .replace(R.id.fragment_container, new ContactDetailFragment())
- .commit();
- }
- });
+ View messageView = LayoutInflater.from(getActivity()).inflate(R.layout.item_conversation_message, parent, false);
return new ChatMessageEntry(messageView);
}
@@ -83,6 +76,13 @@ public class ConversationFragment extends Fragment implements ConversationContra
((TextView)content).setText(message.getBody());
holder.bind(sender, role, content, "now");
+
+ holder.setOnAvatarClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ navigateToContactProfile();
+ }
+ });
}
@Override
@@ -99,7 +99,7 @@ public class ConversationFragment extends Fragment implements ConversationContra
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_chat, container, false);
+ View view = inflater.inflate(R.layout.fragment_conversation, container, false);
ButterKnife.bind(this, view);
Bundle arguments = getArguments();
@@ -145,10 +145,6 @@ public class ConversationFragment extends Fragment implements ConversationContra
@Override
public void navigateToContactProfile() {
- getFragmentManager().beginTransaction()
- .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
- .add(R.id.fragment_container, new ContactDetailFragment())
- .addToBackStack("detail")
- .commit();
+ startActivity(new Intent(getContext(), ContactDetailActivity.class));
}
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java
index 01534a1..4867017 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/ConversationListFragment.java
@@ -17,8 +17,9 @@
*/
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
+import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@@ -45,45 +46,12 @@ import de.vanitasvitae.slam.xmpp.Conversation;
*/
public class ConversationListFragment extends Fragment implements ConversationListContract.View {
- @BindView(R.id.recycler_chatlist)
+ @BindView(R.id.recycler_list)
RecyclerView recyclerView;
private final ConversationListContract.Presenter presenter;
private final List conversations = new ArrayList<>();
- private final RecyclerView.Adapter conversationEntryAdapter = new RecyclerView.Adapter() {
- @Override
- public ConversationEntry onCreateViewHolder(ViewGroup parent, int viewType) {
- View conversationView = LayoutInflater.from(getActivity()).inflate(R.layout.chatlist_singlechat, parent, false);
- return new ConversationEntry(conversationView);
- }
-
- @Override
- public void onBindViewHolder(final ConversationEntry holder, final int position) {
- Conversation conversation = conversations.get(holder.getAdapterPosition());
- String name = conversation.getContact().getNickname();
-
- holder.bind(
- name != null ? name : conversation.getContact().getJid().toString(),
- conversation.getLastMessage(),
- conversation.getDate(),
- true);
-
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = holder.getAdapterPosition();
- navigateToConversation(conversations.get(pos).getContact().getJid());
- }
- });
- }
-
- @Override
- public int getItemCount() {
- return conversations.size();
- }
- };
-
public ConversationListFragment() {
super();
this.presenter = PresenterFactory.getInstance().createConversationListPresenter(this);
@@ -92,7 +60,7 @@ public class ConversationListFragment extends Fragment implements ConversationLi
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_chatlist, container, false);
+ View view = inflater.inflate(R.layout.fragment_conversation_contact_list, container, false);
ButterKnife.bind(this, view);
return view;
}
@@ -120,8 +88,52 @@ public class ConversationListFragment extends Fragment implements ConversationLi
fragment.setArguments(bundle);
getFragmentManager().beginTransaction()
- .add(R.id.fragment_container, fragment)
+ .replace(R.id.fragment_container, fragment)
.addToBackStack("conversation")
.commit();
}
+
+ @Override
+ public void navigateToContactDetail(BareJid contact) {
+ startActivity(new Intent(getContext(), ContactDetailActivity.class));
+ }
+
+ private final RecyclerView.Adapter conversationEntryAdapter = new RecyclerView.Adapter() {
+ @Override
+ public ConversationEntry onCreateViewHolder(ViewGroup parent, int viewType) {
+ View conversationView = LayoutInflater.from(getActivity()).inflate(R.layout.item_conversation_list, parent, false);
+ return new ConversationEntry(conversationView);
+ }
+
+ @Override
+ public void onBindViewHolder(final ConversationEntry holder, final int position) {
+ final Conversation conversation = conversations.get(holder.getAdapterPosition());
+ String name = conversation.getContact().getNickname();
+
+ holder.bind(
+ name != null ? name : conversation.getContact().getJid().toString(),
+ conversation.getLastMessage(),
+ conversation.getDate(),
+ true);
+
+ holder.setOnEntryClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ navigateToConversation(conversation.getContact().getJid());
+ }
+ });
+
+ holder.setOnAvatarClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ navigateToContactDetail(conversation.getContact().getJid());
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return conversations.size();
+ }
+ };
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java
index 81912f6..f93a13f 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/LoginActivity.java
@@ -37,10 +37,8 @@ import butterknife.OnClick;
import de.vanitasvitae.slam.AbstractTextWatcher;
import de.vanitasvitae.slam.EditorActionDoneListener;
import de.vanitasvitae.slam.R;
-import de.vanitasvitae.slam.mvp.DummyPresenterFactory;
import de.vanitasvitae.slam.mvp.PresenterFactory;
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 {
@@ -118,17 +116,17 @@ public class LoginActivity extends ThemedAppCompatActivity implements LoginContr
@Override
public void showInvalidJidError() {
- inputUsernameLayout.setError(getResources().getText(R.string.error_invalid_jid));
+ inputUsernameLayout.setError(getResources().getText(R.string.login__error_invalid_jid));
}
@Override
public void showInvalidPasswordError() {
- inputPasswordLayout.setError(getResources().getText(R.string.error_invalid_password));
+ inputPasswordLayout.setError(getResources().getText(R.string.login__error_invalid_password));
}
@Override
public void showIncorrectPasswordError() {
- inputPasswordLayout.setError(getResources().getText(R.string.error_incorrect_password));
+ inputPasswordLayout.setError(getResources().getText(R.string.login__error_incorrect_password));
}
@Override
@@ -143,7 +141,7 @@ public class LoginActivity extends ThemedAppCompatActivity implements LoginContr
@Override
public void showServerNotFoundError() {
- Toast.makeText(this, R.string.error_server_not_found, Toast.LENGTH_LONG).show();
+ Toast.makeText(this, R.string.login__error_server_not_found, Toast.LENGTH_LONG).show();
}
@Override
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java
index a89fa86..c4858d5 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/MainActivity.java
@@ -17,15 +17,17 @@
*/
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
+import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
-import android.util.Log;
import android.view.Menu;
+import android.view.MenuItem;
import android.widget.FrameLayout;
+import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
@@ -35,7 +37,7 @@ import de.vanitasvitae.slam.mvp.view.abstr.ThemedAppCompatActivity;
/**
* Main activity that hosts some fragments.
*/
-public class MainActivity extends ThemedAppCompatActivity {
+public class MainActivity extends ThemedAppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
public static final String TAG = "Slam!";
@@ -62,11 +64,12 @@ public class MainActivity extends ThemedAppCompatActivity {
setSupportActionBar(toolbar);
drawerToggle = new ActionBarDrawerToggle(
- this, drawerLayout, toolbar, R.string.error_incorrect_password, R.string.error_invalid_jid);
+ this, drawerLayout, toolbar, R.string.login__error_incorrect_password, R.string.login__error_invalid_jid);
drawerLayout.addDrawerListener(drawerToggle);
+ navigationView.setNavigationItemSelectedListener(this);
Fragment chatListFragment = new ConversationListFragment();
- getFragmentManager().beginTransaction()
+ getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, chatListFragment)
.addToBackStack("conversation_list")
.commit();
@@ -83,4 +86,28 @@ public class MainActivity extends ThemedAppCompatActivity {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
+
+ @Override
+ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
+ drawerLayout.closeDrawers();
+ switch (item.getItemId()) {
+ case R.id.navdrawer__item_conversations:
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.fragment_container, new ConversationListFragment())
+ .commit();
+ return true;
+
+ case R.id.navdrawer__item_contacts:
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.fragment_container, new ContactListFragment())
+ .commit();
+ return true;
+ case R.id.navdrawer__item_bookmarks:
+ case R.id.navdrawer__item_blogging:
+ case R.id.navdrawer__item_settings:
+ Toast.makeText(this, R.string.feature_not_implemented, Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ return false;
+ }
}
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
index fe62168..71ff94a 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/mvp/view/SearchFragment.java
@@ -17,7 +17,7 @@
*/
package de.vanitasvitae.slam.mvp.view;
-import android.app.Fragment;
+import android.support.v4.app.Fragment;
import java.util.List;
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatMessageEntry.java b/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatMessageEntry.java
index 300c548..d3f02c0 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatMessageEntry.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/ui/ChatMessageEntry.java
@@ -29,17 +29,18 @@ import de.vanitasvitae.slam.R;
*/
public class ChatMessageEntry extends RecyclerView.ViewHolder {
- private View view;
-
public ChatMessageEntry(View itemView) {
super(itemView);
- this.view = itemView;
}
public void bind(String sender, String role, View content, String date) {
- ((TextView)view.findViewById(R.id.message_sender)).setText(sender);
- ((TextView)view.findViewById(R.id.message_sender_role)).setText(role);
- ((RelativeLayout)view.findViewById(R.id.message_content)).addView(content);
- ((TextView)view.findViewById(R.id.message_date)).setText(date);
+ ((TextView)itemView.findViewById(R.id.message_sender)).setText(sender);
+ ((TextView)itemView.findViewById(R.id.message_sender_role)).setText(role);
+ ((RelativeLayout)itemView.findViewById(R.id.message_content)).addView(content);
+ ((TextView)itemView.findViewById(R.id.message_date)).setText(date);
+ }
+
+ public void setOnAvatarClickListener(View.OnClickListener listener) {
+ itemView.findViewById(R.id.contact_image).setOnClickListener(listener);
}
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/ui/ContactListEntry.java b/mobile/src/main/java/de/vanitasvitae/slam/ui/ContactListEntry.java
new file mode 100644
index 0000000..3fb6530
--- /dev/null
+++ b/mobile/src/main/java/de/vanitasvitae/slam/ui/ContactListEntry.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package de.vanitasvitae.slam.ui;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.TextView;
+
+import de.vanitasvitae.slam.R;
+import de.vanitasvitae.slam.xmpp.Contact;
+
+/**
+ * Created by Paul Schaub on 13.02.18.
+ */
+public class ContactListEntry extends RecyclerView.ViewHolder {
+
+ public ContactListEntry(View itemView) {
+ super(itemView);
+ }
+
+ public void bind(Contact contact) {
+ ((TextView)itemView.findViewById(R.id.contact_name)).setText(contact.getNickname());
+ ((TextView)itemView.findViewById(R.id.contact_jid)).setText(contact.getJid());
+ }
+
+ public void setOnAvatarClickListener(View.OnClickListener listener) {
+ itemView.findViewById(R.id.contact_image).setOnClickListener(listener);
+ }
+
+ public void setOnEntryClickListener(View.OnClickListener listener) {
+ itemView.setOnClickListener(listener);
+ }
+}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java b/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java
index 6f29456..621cc0e 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/ui/ConversationEntry.java
@@ -28,18 +28,22 @@ import de.vanitasvitae.slam.R;
*/
public class ConversationEntry extends RecyclerView.ViewHolder {
- private View view;
-
public ConversationEntry(View itemView) {
super(itemView);
- this.view = itemView;
}
public void bind(String username, String message, String date, boolean read) {
- View v = view;
- ((TextView)v.findViewById(R.id.contact_name)).setText(username);
- ((TextView)v.findViewById(R.id.contact_textcontent)).setText(message);
- ((TextView)v.findViewById(R.id.contact_date)).setText(date);
- v.findViewById(R.id.send_indicator).setVisibility(read ? View.VISIBLE : View.GONE);
+ ((TextView)itemView.findViewById(R.id.contact_name)).setText(username);
+ ((TextView)itemView.findViewById(R.id.contact_jid)).setText(message);
+ ((TextView)itemView.findViewById(R.id.contact_date)).setText(date);
+ itemView.findViewById(R.id.send_indicator).setVisibility(read ? View.VISIBLE : View.GONE);
+ }
+
+ public void setOnAvatarClickListener(View.OnClickListener listener) {
+ itemView.findViewById(R.id.contact_image).setOnClickListener(listener);
+ }
+
+ public void setOnEntryClickListener(View.OnClickListener listener) {
+ itemView.setOnClickListener(listener);
}
}
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Contact.java b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Contact.java
index e9fb661..7e0727c 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Contact.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Contact.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
package de.vanitasvitae.slam.xmpp;
import org.jxmpp.jid.BareJid;
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Conversation.java b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Conversation.java
index 8fb66be..295d1da 100644
--- a/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Conversation.java
+++ b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Conversation.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
package de.vanitasvitae.slam.xmpp;
/**
diff --git a/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Resource.java b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Resource.java
new file mode 100644
index 0000000..b6e4535
--- /dev/null
+++ b/mobile/src/main/java/de/vanitasvitae/slam/xmpp/Resource.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018 Paul Schaub
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package de.vanitasvitae.slam.xmpp;
+
+/**
+ * Created by Paul Schaub on 13.02.18.
+ */
+public class Resource {
+
+ private final String resource, status, client, system;
+
+ public Resource(String resource, String status, String client, String system) {
+ this.resource = resource;
+ this.status = status;
+ this.client = client;
+ this.system = system;
+ }
+
+ public String getClient() {
+ return client;
+ }
+
+ public String getResource() {
+ return resource;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getSystem() {
+ return system;
+ }
+}
diff --git a/mobile/src/main/res/drawable-hdpi/ic_chat_black_48dp.png b/mobile/src/main/res/drawable-hdpi/ic_chat_black_48dp.png
new file mode 100644
index 0000000..9102f25
Binary files /dev/null and b/mobile/src/main/res/drawable-hdpi/ic_chat_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-hdpi/ic_chat_white_48dp.png b/mobile/src/main/res/drawable-hdpi/ic_chat_white_48dp.png
new file mode 100644
index 0000000..4245090
Binary files /dev/null and b/mobile/src/main/res/drawable-hdpi/ic_chat_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-hdpi/ic_public_black_48dp.png b/mobile/src/main/res/drawable-hdpi/ic_public_black_48dp.png
new file mode 100644
index 0000000..757729c
Binary files /dev/null and b/mobile/src/main/res/drawable-hdpi/ic_public_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-hdpi/ic_public_white_48dp.png b/mobile/src/main/res/drawable-hdpi/ic_public_white_48dp.png
new file mode 100644
index 0000000..123f223
Binary files /dev/null and b/mobile/src/main/res/drawable-hdpi/ic_public_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-mdpi/ic_chat_black_48dp.png b/mobile/src/main/res/drawable-mdpi/ic_chat_black_48dp.png
new file mode 100644
index 0000000..e9e92e5
Binary files /dev/null and b/mobile/src/main/res/drawable-mdpi/ic_chat_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-mdpi/ic_chat_white_48dp.png b/mobile/src/main/res/drawable-mdpi/ic_chat_white_48dp.png
new file mode 100644
index 0000000..ace0bef
Binary files /dev/null and b/mobile/src/main/res/drawable-mdpi/ic_chat_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-mdpi/ic_public_black_48dp.png b/mobile/src/main/res/drawable-mdpi/ic_public_black_48dp.png
new file mode 100644
index 0000000..87b0492
Binary files /dev/null and b/mobile/src/main/res/drawable-mdpi/ic_public_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-mdpi/ic_public_white_48dp.png b/mobile/src/main/res/drawable-mdpi/ic_public_white_48dp.png
new file mode 100644
index 0000000..f545c6c
Binary files /dev/null and b/mobile/src/main/res/drawable-mdpi/ic_public_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xhdpi/ic_chat_black_48dp.png b/mobile/src/main/res/drawable-xhdpi/ic_chat_black_48dp.png
new file mode 100644
index 0000000..55d42e2
Binary files /dev/null and b/mobile/src/main/res/drawable-xhdpi/ic_chat_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png b/mobile/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png
new file mode 100644
index 0000000..d708e15
Binary files /dev/null and b/mobile/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xhdpi/ic_public_black_48dp.png b/mobile/src/main/res/drawable-xhdpi/ic_public_black_48dp.png
new file mode 100644
index 0000000..fccc1a0
Binary files /dev/null and b/mobile/src/main/res/drawable-xhdpi/ic_public_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xhdpi/ic_public_white_48dp.png b/mobile/src/main/res/drawable-xhdpi/ic_public_white_48dp.png
new file mode 100644
index 0000000..eb1097d
Binary files /dev/null and b/mobile/src/main/res/drawable-xhdpi/ic_public_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxhdpi/ic_chat_black_48dp.png b/mobile/src/main/res/drawable-xxhdpi/ic_chat_black_48dp.png
new file mode 100644
index 0000000..2717e20
Binary files /dev/null and b/mobile/src/main/res/drawable-xxhdpi/ic_chat_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png b/mobile/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png
new file mode 100644
index 0000000..3b1434c
Binary files /dev/null and b/mobile/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxhdpi/ic_public_black_48dp.png b/mobile/src/main/res/drawable-xxhdpi/ic_public_black_48dp.png
new file mode 100644
index 0000000..d08da58
Binary files /dev/null and b/mobile/src/main/res/drawable-xxhdpi/ic_public_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxhdpi/ic_public_white_48dp.png b/mobile/src/main/res/drawable-xxhdpi/ic_public_white_48dp.png
new file mode 100644
index 0000000..e20513e
Binary files /dev/null and b/mobile/src/main/res/drawable-xxhdpi/ic_public_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxxhdpi/ic_chat_black_48dp.png b/mobile/src/main/res/drawable-xxxhdpi/ic_chat_black_48dp.png
new file mode 100644
index 0000000..025c1e7
Binary files /dev/null and b/mobile/src/main/res/drawable-xxxhdpi/ic_chat_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png b/mobile/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png
new file mode 100644
index 0000000..2c9906d
Binary files /dev/null and b/mobile/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxxhdpi/ic_public_black_48dp.png b/mobile/src/main/res/drawable-xxxhdpi/ic_public_black_48dp.png
new file mode 100644
index 0000000..6c2231f
Binary files /dev/null and b/mobile/src/main/res/drawable-xxxhdpi/ic_public_black_48dp.png differ
diff --git a/mobile/src/main/res/drawable-xxxhdpi/ic_public_white_48dp.png b/mobile/src/main/res/drawable-xxxhdpi/ic_public_white_48dp.png
new file mode 100644
index 0000000..29145a0
Binary files /dev/null and b/mobile/src/main/res/drawable-xxxhdpi/ic_public_white_48dp.png differ
diff --git a/mobile/src/main/res/drawable/background_image.png b/mobile/src/main/res/drawable/background_image.png
new file mode 100644
index 0000000..a5c1d41
Binary files /dev/null and b/mobile/src/main/res/drawable/background_image.png differ
diff --git a/mobile/src/main/res/drawable/face.png b/mobile/src/main/res/drawable/face.png
new file mode 100644
index 0000000..8163d26
Binary files /dev/null and b/mobile/src/main/res/drawable/face.png differ
diff --git a/mobile/src/main/res/layout/activity_contact_detail.xml b/mobile/src/main/res/layout/activity_contact_detail.xml
new file mode 100644
index 0000000..2573a54
--- /dev/null
+++ b/mobile/src/main/res/layout/activity_contact_detail.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/activity_login.xml b/mobile/src/main/res/layout/activity_login.xml
index aede9b6..942288e 100644
--- a/mobile/src/main/res/layout/activity_login.xml
+++ b/mobile/src/main/res/layout/activity_login.xml
@@ -61,7 +61,7 @@
android:id="@+id/login_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hint="@string/hint_jid"
+ android:hint="@string/login__hint_jid"
android:inputType="textEmailAddress"
android:nextFocusForward="@+id/login_password" />
@@ -79,7 +79,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
- android:hint="@string/hint_password" />
+ android:hint="@string/login__hint_password" />
@@ -94,7 +94,7 @@
android:layout_alignParentEnd="true"
android:background="@android:color/transparent"
android:textColor="@color/secondaryColor"
- android:text="@string/button_login_account" />
+ android:text="@string/login__button_login" />
diff --git a/mobile/src/main/res/layout/fragment_contact_detail.xml b/mobile/src/main/res/layout/fragment_contact_detail.xml
deleted file mode 100644
index 549c71e..0000000
--- a/mobile/src/main/res/layout/fragment_contact_detail.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/fragment_contact_detail__info.xml b/mobile/src/main/res/layout/fragment_contact_detail__info.xml
new file mode 100644
index 0000000..3d4c920
--- /dev/null
+++ b/mobile/src/main/res/layout/fragment_contact_detail__info.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/fragment_contact_detail__resources.xml b/mobile/src/main/res/layout/fragment_contact_detail__resources.xml
new file mode 100644
index 0000000..f3800ba
--- /dev/null
+++ b/mobile/src/main/res/layout/fragment_contact_detail__resources.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/fragment_contact_detail__security.xml b/mobile/src/main/res/layout/fragment_contact_detail__security.xml
new file mode 100644
index 0000000..6fe4e6a
--- /dev/null
+++ b/mobile/src/main/res/layout/fragment_contact_detail__security.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/fragment_chat.xml b/mobile/src/main/res/layout/fragment_conversation.xml
similarity index 100%
rename from mobile/src/main/res/layout/fragment_chat.xml
rename to mobile/src/main/res/layout/fragment_conversation.xml
diff --git a/mobile/src/main/res/layout/fragment_chatlist.xml b/mobile/src/main/res/layout/fragment_conversation_contact_list.xml
similarity index 75%
rename from mobile/src/main/res/layout/fragment_chatlist.xml
rename to mobile/src/main/res/layout/fragment_conversation_contact_list.xml
index 768fe7b..afcea00 100644
--- a/mobile/src/main/res/layout/fragment_chatlist.xml
+++ b/mobile/src/main/res/layout/fragment_conversation_contact_list.xml
@@ -1,6 +1,6 @@
diff --git a/mobile/src/main/res/layout/item_contact.xml b/mobile/src/main/res/layout/item_contact.xml
new file mode 100644
index 0000000..fc5d25b
--- /dev/null
+++ b/mobile/src/main/res/layout/item_contact.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/chatlist_singlechat.xml b/mobile/src/main/res/layout/item_conversation_list.xml
similarity index 97%
rename from mobile/src/main/res/layout/chatlist_singlechat.xml
rename to mobile/src/main/res/layout/item_conversation_list.xml
index 40cba53..575d73e 100644
--- a/mobile/src/main/res/layout/chatlist_singlechat.xml
+++ b/mobile/src/main/res/layout/item_conversation_list.xml
@@ -64,7 +64,7 @@
android:layout_toStartOf="@+id/lower_meta">
diff --git a/mobile/src/main/res/layout/item_chatmessage.xml b/mobile/src/main/res/layout/item_conversation_message.xml
similarity index 98%
rename from mobile/src/main/res/layout/item_chatmessage.xml
rename to mobile/src/main/res/layout/item_conversation_message.xml
index f148878..481dccb 100644
--- a/mobile/src/main/res/layout/item_chatmessage.xml
+++ b/mobile/src/main/res/layout/item_conversation_message.xml
@@ -16,6 +16,7 @@
android:layout_height="match_parent">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/layout/toolbar_main.xml b/mobile/src/main/res/layout/toolbar_main.xml
index 7c7b563..b307667 100644
--- a/mobile/src/main/res/layout/toolbar_main.xml
+++ b/mobile/src/main/res/layout/toolbar_main.xml
@@ -1,11 +1,8 @@
-
\ No newline at end of file
diff --git a/mobile/src/main/res/menu/drawer_main.xml b/mobile/src/main/res/menu/drawer_main.xml
index 898a867..e841b6b 100644
--- a/mobile/src/main/res/menu/drawer_main.xml
+++ b/mobile/src/main/res/menu/drawer_main.xml
@@ -1,15 +1,23 @@
\ No newline at end of file
diff --git a/mobile/src/main/res/menu/menu_login.xml b/mobile/src/main/res/menu/menu_login.xml
index 2fb1b9c..12cbcf9 100644
--- a/mobile/src/main/res/menu/menu_login.xml
+++ b/mobile/src/main/res/menu/menu_login.xml
@@ -3,6 +3,6 @@
+ android:title="@string/login__advanced_options" />
\ No newline at end of file
diff --git a/mobile/src/main/res/menu/menu_main.xml b/mobile/src/main/res/menu/menu_main.xml
index 7789886..b89e2bb 100644
--- a/mobile/src/main/res/menu/menu_main.xml
+++ b/mobile/src/main/res/menu/menu_main.xml
@@ -5,8 +5,8 @@
+
+
\ No newline at end of file
diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml
index 349d211..17f1a8f 100644
--- a/mobile/src/main/res/values/strings.xml
+++ b/mobile/src/main/res/values/strings.xml
@@ -8,25 +8,40 @@
&appname;
- Advanced Options
+ Advanced Options
- Jabber ID
- Password
- Login
- Register
- Invalid Jabber ID
- Password is too short
- Password is incorrect
- This field is required
+ Jabber ID
+ Password
+ Login
+ Register
+ Invalid Jabber ID
+ Password is too short
+ Password is incorrect
+ This field is required
+ Server not found
-
- Search
- Settings
+
+ Search
+ Settings
- Contacts
- Bookmarks
- Settings
- Server not found
+ Conversations
+ Contacts
+ Groups
+ Blogging
+ Settings
+
+
+ Info
+ Security
+
+ Devices
+
+ OMEMO Fingerprints
+
+
+ Confabulate
+ Keep a History
+ Feature not implemented.
diff --git a/mobile/src/main/res/values/styles.xml b/mobile/src/main/res/values/styles.xml
index 84e8ecc..6cb5d15 100644
--- a/mobile/src/main/res/values/styles.xml
+++ b/mobile/src/main/res/values/styles.xml
@@ -15,11 +15,13 @@
- @drawable/ic_group_add_black_48dp
- @drawable/ic_settings_black_48dp
- @drawable/ic_search_black_48dp
+ - @drawable/ic_chat_black_48dp
+ - @drawable/ic_public_black_48dp