package org.mercury_im.messenger.ui.roster.contacts.detail; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; import com.google.android.material.chip.ChipGroup; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.util.ColorUtil; import butterknife.BindView; import butterknife.ButterKnife; import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; public class ContactDetailFragment extends Fragment { @BindView(R.id.contact_avatar) ImageView contactAvatar; @BindView(R.id.contact_status_badge) ImageView contactStatusBadge; @BindView(R.id.contact_name) TextView contactName; @BindView(R.id.contact_address) TextView contactAddress; @BindView(R.id.contact_presence) TextView contactPresence; @BindView(R.id.contact_account) TextView contactAccount; @BindView(R.id.contact_groups) ChipGroup contactGroups; @BindView(R.id.fab) ExtendedFloatingActionButton fab; private ContactDetailViewModel viewModel; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_contact_details, container, false); ButterKnife.bind(this, view); if (fab != null) { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getContext(), ChatActivity.class); intent.putExtra(ChatActivity.EXTRA_JID, viewModel.getContactAddress().getValue()); intent.putExtra(ChatActivity.EXTRA_ACCOUNT, viewModel.getAccountId().getValue().toString()); startActivity(intent); } }); } contactName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle("Edit Contact Name"); final EditText editText = new EditText(getContext()); editText.setText(contactName.getText()); builder.setView(editText) .setPositiveButton("Save", (dialog, which) -> { Completable.fromAction(() -> viewModel.changeContactName(editText.getText().toString())).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(() -> {}, e -> Log.e(Messenger.TAG, "Error changing contact name", e)); }) .setNegativeButton("Cancel", (dialog, which) -> dialog.cancel()); builder.show(); } }); return view; } @Override public void onAttach(Context context) { super.onAttach(context); viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(ContactDetailViewModel.class); observeViewModel(); } private void observeViewModel() { viewModel.getContactAvatar().observe(this, drawable -> contactAvatar.setImageDrawable(drawable)); viewModel.getContactPresenceMode().observe(this, mode -> { int color = 0; switch (mode) { case chat: case available: color = ColorUtil.rgb(0, 255, 0); break; case away: case xa: color = ColorUtil.rgb(255, 128, 0); break; case dnd: color = ColorUtil.rgb(255, 0, 0); break; } contactStatusBadge.setColorFilter(color); }); viewModel.getContactName().observe(this, name -> contactName.setText(name)); viewModel.getContactAddress().observe(this, address -> contactAddress.setText(address)); viewModel.getContactPresenceStatus().observe(this, presenceText -> contactPresence.setText(presenceText)); viewModel.getContactAccountAddress().observe(this, address -> contactAccount.setText(address)); } }