From e3fa33a1bfca1160ae0818be8227771e125cf766 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Fri, 9 Mar 2018 20:44:45 +0100 Subject: reference support actionbar in all activities --- .../messenger/ui/ConferenceDetailsActivity.java | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java') diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index 21442bcd1..9efd4b22a 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -1,6 +1,5 @@ package de.pixart.messenger.ui; -import android.app.ActionBar; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; @@ -9,6 +8,7 @@ import android.content.Intent; import android.content.IntentSender.SendIntentException; import android.graphics.PorterDuff; import android.os.Bundle; +import android.support.v7.app.ActionBar; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -294,9 +294,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers mDestroyButton.setOnClickListener(destroyListener); mDestroyButton.getBackground().setColorFilter(getWarningButtonColor(), PorterDuff.Mode.MULTIPLY); mConferenceType = findViewById(R.id.muc_conference_type); - if (getActionBar() != null) { - getActionBar().setHomeButtonEnabled(true); - getActionBar().setDisplayHomeAsUpEnabled(true); + if (getSupportActionBar() != null) { + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); } mEditNickButton.setOnClickListener(new OnClickListener() { @@ -600,17 +600,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } else { account = mConversation.getAccount().getJid().toBareJid().toString(); } - if (getActionBar() != null) { - final ActionBar ab = getActionBar(); - ab.setCustomView(R.layout.ab_title); - ab.setDisplayShowCustomEnabled(true); - TextView abtitle = findViewById(android.R.id.text1); - TextView absubtitle = findViewById(android.R.id.text2); - abtitle.setText(mConversation.getName()); - abtitle.setSelected(true); - abtitle.setClickable(false); - absubtitle.setVisibility(View.GONE); - absubtitle.setClickable(false); + if (getSupportActionBar() != null) { + final ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setCustomView(R.layout.ab_title); + ab.setDisplayShowCustomEnabled(true); + TextView abtitle = findViewById(android.R.id.text1); + TextView absubtitle = findViewById(android.R.id.text2); + abtitle.setText(mConversation.getName()); + abtitle.setSelected(true); + abtitle.setClickable(false); + absubtitle.setVisibility(View.GONE); + absubtitle.setClickable(false); + } } ConferenceName.setText(mConversation.getName()); mAccountJid.setText(getString(R.string.using_account, account)); -- cgit v1.2.3 From 1a5c959f8099395e6c1b8756dc691bf2156c1243 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Fri, 9 Mar 2018 21:25:37 +0100 Subject: migrated alert dialogs to app compat --- src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java') diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index 9efd4b22a..fc45c58a5 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -1,6 +1,6 @@ package de.pixart.messenger.ui; -import android.app.AlertDialog; +import android.support.v7.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; -- cgit v1.2.3 From f26cab3b03a8764f90164d772bc421c69dd08bb5 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Fri, 16 Mar 2018 21:15:47 +0100 Subject: migrate to CardView in contact and muc details --- .../messenger/ui/ConferenceDetailsActivity.java | 35 ++++++++-------------- 1 file changed, 13 insertions(+), 22 deletions(-) (limited to 'src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java') diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index fc45c58a5..3cd57864f 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -1,6 +1,5 @@ package de.pixart.messenger.ui; -import android.support.v7.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; @@ -9,6 +8,8 @@ import android.content.IntentSender.SendIntentException; import android.graphics.PorterDuff; import android.os.Bundle; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.CardView; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -83,10 +84,10 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers private TextView mFullJid; private TextView mAccountJid; private LinearLayout membersView; - private LinearLayout mMoreDetails; + private CardView mMoreDetails; private RelativeLayout mMucSettings; private TextView mConferenceType; - private LinearLayout mConferenceInfoTable; + private CardView mConferenceInfoTable; private TextView mConferenceInfoMam; private TextView mNotifyStatusText; private ImageButton mChangeConferenceSettingsButton; @@ -298,25 +299,15 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } - mEditNickButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - quickEdit(mConversation.getMucOptions().getActualNick(), - 0, - new OnValueEdited() { - - @Override - public String onValueEdited(String value) { - if (xmppConnectionService.renameInMuc(mConversation, value, renameCallback)) { - return null; - } else { - return getString(R.string.invalid_username); - } - } - }); - } - }); + mEditNickButton.setOnClickListener(v -> quickEdit(mConversation.getMucOptions().getActualNick(), + 0, + value -> { + if (xmppConnectionService.renameInMuc(mConversation, value, renameCallback)) { + return null; + } else { + return getString(R.string.invalid_username); + } + })); this.mAdvancedMode = getPreferences().getBoolean("advanced_muc_mode", false); this.mConferenceInfoTable = findViewById(R.id.muc_info_more); this.mConferenceInfoTable.setVisibility(this.mAdvancedMode ? View.VISIBLE : View.GONE); -- cgit v1.2.3 From 35c70127720d048cd200dcefad8a710313019243 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Tue, 20 Mar 2018 20:56:01 +0100 Subject: use async avatar loader in conference details --- .../messenger/ui/ConferenceDetailsActivity.java | 104 +++++++++++++++++++-- 1 file changed, 98 insertions(+), 6 deletions(-) (limited to 'src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java') diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index 3cd57864f..d9fe66975 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -5,7 +5,12 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender.SendIntentException; +import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.PorterDuff; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; @@ -27,8 +32,10 @@ import android.widget.Toast; import org.openintents.openpgp.util.OpenPgpUtils; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; import de.pixart.messenger.Config; @@ -43,6 +50,7 @@ import de.pixart.messenger.entities.MucOptions.User; import de.pixart.messenger.services.XmppConnectionService; import de.pixart.messenger.services.XmppConnectionService.OnConversationUpdate; import de.pixart.messenger.services.XmppConnectionService.OnMucRosterUpdate; +import de.pixart.messenger.utils.UIHelper; import de.pixart.messenger.xmpp.jid.Jid; public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed { @@ -703,7 +711,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } ImageView iv = view.findViewById(R.id.contact_photo); - iv.setImageBitmap(avatarService().get(user, getPixel(48), false)); + loadAvatar(user, iv); if (user.getRole() == MucOptions.Role.NONE) { tvDisplayName.setAlpha(INACTIVE_ALPHA); tvKey.setAlpha(INACTIVE_ALPHA); @@ -773,11 +781,95 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } private void displayToast(final String msg) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(ConferenceDetailsActivity.this, msg, Toast.LENGTH_SHORT).show(); + runOnUiThread(() -> Toast.makeText(ConferenceDetailsActivity.this, msg, Toast.LENGTH_SHORT).show()); + } + + public static boolean cancelPotentialWork(User user, ImageView imageView) { + final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); + + if (bitmapWorkerTask != null) { + final User old = bitmapWorkerTask.o; + if (old == null || user != old) { + bitmapWorkerTask.cancel(true); + } else { + return false; + } + } + return true; + } + + private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { + if (imageView != null) { + final Drawable drawable = imageView.getDrawable(); + if (drawable instanceof AsyncDrawable) { + final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; + return asyncDrawable.getBitmapWorkerTask(); + } + } + return null; + } + + public void loadAvatar(User user, ImageView imageView) { + if (cancelPotentialWork(user, imageView)) { + final Bitmap bm = avatarService().get(user, getPixel(48), true); + if (bm != null) { + cancelPotentialWork(user, imageView); + imageView.setImageBitmap(bm); + imageView.setBackgroundColor(0x00000000); + } else { + String seed = user.getRealJid() != null ? user.getRealJid().toBareJid().toString() : null; + imageView.setBackgroundColor(UIHelper.getColorForName(seed == null ? user.getName() : seed)); + imageView.setImageDrawable(null); + final BitmapWorkerTask task = new BitmapWorkerTask(imageView); + final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), null, task); + imageView.setImageDrawable(asyncDrawable); + try { + task.execute(user); + } catch (final RejectedExecutionException ignored) { + } + } + } + } + + static class AsyncDrawable extends BitmapDrawable { + private final WeakReference bitmapWorkerTaskReference; + + public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { + super(res, bitmap); + bitmapWorkerTaskReference = new WeakReference<>(bitmapWorkerTask); + } + + public BitmapWorkerTask getBitmapWorkerTask() { + return bitmapWorkerTaskReference.get(); + } + } + + class BitmapWorkerTask extends AsyncTask { + private final WeakReference imageViewReference; + private User o = null; + + private BitmapWorkerTask(ImageView imageView) { + imageViewReference = new WeakReference<>(imageView); + } + + @Override + protected Bitmap doInBackground(User... params) { + this.o = params[0]; + if (imageViewReference.get() == null) { + return null; } - }); + return avatarService().get(this.o, getPixel(48), isCancelled()); + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + if (bitmap != null && !isCancelled()) { + final ImageView imageView = imageViewReference.get(); + if (imageView != null) { + imageView.setImageBitmap(bitmap); + imageView.setBackgroundColor(0x00000000); + } + } + } } } -- cgit v1.2.3 From f7b670206379b420d66d9f164e386a8bb71368e7 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Tue, 20 Mar 2018 21:14:32 +0100 Subject: use data binder for inflating muc items --- .../messenger/ui/ConferenceDetailsActivity.java | 60 +++++++++------------- 1 file changed, 25 insertions(+), 35 deletions(-) (limited to 'src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java') diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index d9fe66975..fa77b9423 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender.SendIntentException; import android.content.res.Resources; +import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; @@ -41,6 +42,7 @@ import java.util.concurrent.atomic.AtomicInteger; import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.crypto.PgpEngine; +import de.pixart.messenger.databinding.ContactBinding; import de.pixart.messenger.entities.Account; import de.pixart.messenger.entities.Bookmark; import de.pixart.messenger.entities.Contact; @@ -669,56 +671,44 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers mNotifyStatusText.setText(R.string.notify_only_when_highlighted); } - LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); membersView.removeAllViews(); + if (inflater == null) { + return; + } final ArrayList users = mucOptions.getUsers(); Collections.sort(users); for (final User user : users) { + ContactBinding binding = DataBindingUtil.inflate(inflater, R.layout.contact, membersView, false); final Contact contact = user.getContact(); - View view = inflater.inflate(R.layout.contact, membersView, false); - this.setListItemBackgroundOnView(view); + final String name = user.getName(); + this.setListItemBackgroundOnView(binding.getRoot()); if (contact != null && contact.showInRoster()) { - view.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - switchToContactDetails(contact); - } - }); + binding.getRoot().setOnClickListener((OnClickListener) view -> switchToContactDetails(contact)); } - registerForContextMenu(view); - view.setTag(user); - TextView tvDisplayName = view.findViewById(R.id.contact_display_name); - TextView tvKey = view.findViewById(R.id.key); - TextView tvStatus = view.findViewById(R.id.contact_jid); + registerForContextMenu(binding.getRoot()); + binding.getRoot().setTag(user); if (mAdvancedMode && user.getPgpKeyId() != 0) { - tvKey.setVisibility(View.VISIBLE); - tvKey.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - viewPgpKey(user); - } - }); - tvKey.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId())); + binding.key.setVisibility(View.VISIBLE); + binding.key.setOnClickListener(v -> viewPgpKey(user)); + binding.key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId())); } - String name = user.getName(); if (contact != null) { - tvDisplayName.setText(contact.getDisplayName()); - tvStatus.setText((name != null ? name + " \u2022 " : "") + getStatus(user)); + binding.contactDisplayName.setText(contact.getDisplayName()); + binding.contactJid.setText((name != null ? name + " \u2022 " : "") + getStatus(user)); } else { - tvDisplayName.setText(name == null ? "" : name); - tvStatus.setText(getStatus(user)); + binding.contactDisplayName.setText(name == null ? "" : name); + binding.contactJid.setText(getStatus(user)); } - ImageView iv = view.findViewById(R.id.contact_photo); - loadAvatar(user, iv); + loadAvatar(user, binding.contactPhoto); if (user.getRole() == MucOptions.Role.NONE) { - tvDisplayName.setAlpha(INACTIVE_ALPHA); - tvKey.setAlpha(INACTIVE_ALPHA); - tvStatus.setAlpha(INACTIVE_ALPHA); - iv.setAlpha(INACTIVE_ALPHA); + binding.contactDisplayName.setAlpha(INACTIVE_ALPHA); + binding.key.setAlpha(INACTIVE_ALPHA); + binding.contactJid.setAlpha(INACTIVE_ALPHA); + binding.contactPhoto.setAlpha(INACTIVE_ALPHA); } - membersView.addView(view); + membersView.addView(binding.getRoot()); if (mConversation.getMucOptions().canInvite()) { mInviteButton.setVisibility(View.VISIBLE); } else { -- cgit v1.2.3