diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/AddContactDialogFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/AddContactDialogFragment.java new file mode 100644 index 0000000..c0170dc --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/AddContactDialogFragment.java @@ -0,0 +1,59 @@ +package org.mercury_im.messenger.ui.roster.contacts; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.lifecycle.LiveData; + +import org.mercury_im.messenger.R; +import org.mercury_im.messenger.entity.Account; + +import java.util.List; + +public class AddContactDialogFragment extends AppCompatDialogFragment { + + private final LiveData> accounts; + + public AddContactDialogFragment(LiveData> accountList) { + this.accounts = accountList; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = requireActivity().getLayoutInflater(); + + View dialogView = inflater.inflate(R.layout.dialog_add_contact, null); + Spinner spinner = dialogView.findViewById(R.id.spinner); + spinner.setAdapter( + new ArrayAdapter<>(requireActivity(), R.layout.support_simple_spinner_dropdown_item, accounts.getValue())); + + builder.setMessage("Add Contact") + .setView(dialogView) + .setCancelable(false) + .setPositiveButton("Add", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + AddContactDialogFragment.this.onCancel(dialog); + } + }); + + return builder.create(); + } +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java index d12eece..c503995 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java @@ -1,25 +1,25 @@ package org.mercury_im.messenger.ui.roster.contacts; -import static androidx.constraintlayout.widget.Constraints.TAG; - import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; +import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; +import org.mercury_im.messenger.R; + import butterknife.BindView; import butterknife.ButterKnife; -import org.mercury_im.messenger.R; +import static androidx.constraintlayout.widget.Constraints.TAG; /** * A placeholder fragment containing a simple view. @@ -47,10 +47,15 @@ public class ContactListFragment extends Fragment { recyclerView.setAdapter(recyclerViewAdapter); - fab.setOnClickListener(v -> Toast.makeText(getContext(), R.string.not_yet_implemented, Toast.LENGTH_SHORT).show()); + fab.setOnClickListener(v -> displayAddContactDialog()); return view; } + private void displayAddContactDialog() { + AddContactDialogFragment addContactDialogFragment = new AddContactDialogFragment(contactListViewModel.getAccounts()); + addContactDialogFragment.show(this.getParentFragmentManager(), "add"); + } + @Override public void onAttach(Context context) { super.onAttach(context); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 86c87fc..e807fea 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -7,7 +7,9 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; @@ -22,7 +24,11 @@ public class ContactListViewModel extends ViewModel { @Inject XmppPeerRepository xmppContactRepository; + @Inject + XmppAccountRepository accountRepository; + private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); + private final MutableLiveData> accounts = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); public ContactListViewModel() { @@ -32,6 +38,8 @@ public class ContactListViewModel extends ViewModel { // Subscribe to changes to the contacts table and update the LiveData object for the UI. compositeDisposable.add(xmppContactRepository.observeAllPeers() .subscribe(rosterEntryList::setValue)); + compositeDisposable.add(accountRepository.observeAllAccounts() + .subscribe(accounts::setValue)); } @Override @@ -43,4 +51,8 @@ public class ContactListViewModel extends ViewModel { public LiveData> getRosterEntryList() { return rosterEntryList; } + + public LiveData> getAccounts() { + return accounts; + } } diff --git a/app/src/main/res/layout/dialog_add_contact.xml b/app/src/main/res/layout/dialog_add_contact.xml new file mode 100644 index 0000000..5a8addf --- /dev/null +++ b/app/src/main/res/layout/dialog_add_contact.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 8677922..cfb3406 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -27,6 +27,8 @@ @color/textBlack true + + @style/Widget.MaterialComponents.Button.TextButton diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index fa26934..cca611a 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -1,12 +1,6 @@ package org.mercury_im.messenger.xmpp; -import org.jivesoftware.smack.AbstractXMPPConnection; -import org.jivesoftware.smack.ReconnectionListener; -import org.jivesoftware.smack.ReconnectionManager; -import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.caps.EntityCapsManager; -import org.jivesoftware.smackx.carbons.CarbonManager; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account;