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