diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index e846f577f0c137d376bc02bd407bdb18dd535aed..2b31cacd5c172d3d242cd2bd3c81f21e438d520a 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -6,6 +6,8 @@ import android.net.Uri; import android.os.SystemClock; import android.util.Log; +import androidx.core.graphics.ColorUtils; + import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -109,6 +111,7 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable private String pinnedChannelBinding; private String fastMechanism; private String fastToken; + private Integer color = null; public Account(final Jid jid, final String password) { this( @@ -236,6 +239,23 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable return pgpDecryptionService != null && pgpDecryptionService.isConnected(); } + public void setColor(Integer color) { + this.color = color; + } + + public int getColor(boolean dark) { + if (color != null) return color.intValue(); + + return ColorUtils.setAlphaComponent( + getAvatarBackgroundColor(), + dark ? 20 : 15 + ); + } + + public Integer getColorToSave() { + return color; + } + public boolean setShowErrorNotification(boolean newValue) { boolean oldValue = showErrorNotification(); setKey("show_error", Boolean.toString(newValue)); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index e5aa90f5fb267b0e6470c01582c23d5ad5544cbb..ad3cfffdd37723b8acdb7eaa2171fea3cdb53a75 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1288,6 +1288,10 @@ public class XmppConnectionService extends Service { this.databaseBackend = DatabaseBackend.getInstance(getApplicationContext()); Log.d(Config.LOGTAG, "restoring accounts..."); this.accounts = databaseBackend.getAccounts(); + for (Account account : this.accounts) { + final int color = getPreferences().getInt("account_color:" + account.getUuid(), 0); + if (color != 0) account.setColor(color); + } final SharedPreferences.Editor editor = getPreferences().edit(); if (this.accounts.size() == 0 && Arrays.asList("Sony", "Sony Ericsson").contains(Build.MANUFACTURER)) { editor.putBoolean(SettingsActivity.KEEP_FOREGROUND_SERVICE, true); @@ -2577,6 +2581,12 @@ public class XmppConnectionService extends Service { public boolean updateAccount(final Account account) { if (databaseBackend.updateAccount(account)) { + Integer color = account.getColorToSave(); + if (color == null) { + getPreferences().edit().remove("account_color:" + account.getUuid()).commit(); + } else { + getPreferences().edit().putInt("account_color:" + account.getUuid(), color.intValue()).commit(); + } account.setShowErrorNotification(true); this.statusListener.onStatusChanged(account); databaseBackend.updateAccount(account); diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index 393f4832057948dd36c8d6b87a340e96057d8561..8fd577ebca73f5894e4b460fbd1a7787d863133a 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -39,6 +40,8 @@ import androidx.databinding.DataBindingUtil; import com.google.android.material.textfield.TextInputLayout; import com.google.common.base.CharMatcher; +import com.rarepebble.colorpicker.ColorPickerView; + import org.openintents.openpgp.util.OpenPgpUtils; import java.util.Arrays; @@ -146,6 +149,11 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat final boolean wasDisabled = mAccount != null && mAccount.getStatus() == Account.State.DISABLED; final boolean accountInfoEdited = accountInfoEdited(); + ColorDrawable previewColor = (ColorDrawable) binding.colorPreview.getBackground(); + if (previewColor != null && previewColor.getColor() != mAccount.getColor(isDarkTheme())) { + mAccount.setColor(previewColor.getColor()); + } + if (mInitMode && mAccount != null) { mAccount.setOption(Account.OPTION_DISABLED, false); } @@ -567,9 +575,11 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat if (this.mAccount == null) { return false; } + ColorDrawable previewColor = (ColorDrawable) binding.colorPreview.getBackground(); return jidEdited() || !this.mAccount.getPassword().equals(this.binding.accountPassword.getText().toString()) || !this.mAccount.getHostname().equals(this.binding.hostname.getText().toString()) || + this.mAccount.getColor(isDarkTheme()) != (previewColor == null ? 0 : previewColor.getColor()) || !String.valueOf(this.mAccount.getPort()).equals(this.binding.port.getText().toString()); } @@ -622,6 +632,9 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat this.binding.accountRegisterNew.setVisibility(View.GONE); } this.binding.actionEditYourName.setOnClickListener(this::onEditYourNameClicked); + binding.accountColorBox.setOnClickListener((v) -> { + showColorDialog(); + }); } private void onEditYourNameClicked(View view) { @@ -980,6 +993,26 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat } } + void showColorDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + final ColorPickerView picker = new ColorPickerView(this); + + picker.setColor(mAccount.getColor(isDarkTheme())); + picker.showAlpha(true); + picker.showHex(true); + picker.showPreview(true); + builder + .setTitle(null) + .setView(picker) + .setPositiveButton(R.string.ok, (dialog, which) -> { + final int color = picker.getColor(); + binding.colorPreview.setBackgroundColor(color); + updateSaveButton(); + }) + .setNegativeButton(R.string.cancel, (dialog, which) -> {}); + builder.show(); + } + private void updateAccountInformation(boolean init) { if (init) { this.binding.accountJid.getEditableText().clear(); @@ -1012,6 +1045,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat final String displayName = mAccount.getDisplayName(); updateDisplayName(displayName); + if (xmppConnectionService != null && xmppConnectionService.getAccounts().size() > 1) { + binding.accountColorBox.setVisibility(View.VISIBLE); + binding.colorPreview.setBackgroundColor(mAccount.getColor(isDarkTheme())); + } else { + binding.accountColorBox.setVisibility(View.GONE); + } final boolean togglePassword = mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY); final boolean editPassword = !mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || (!mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY) && QuickConversationsService.isConversations()) || mAccount.getLastErrorStatus() == Account.State.UNAUTHORIZED; diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java index 281143f41d01f8b029b580b2c1e8a06b0e6144d7..412ee0e37d05a21b40d984cea4dbec7fa817a0a7 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java @@ -82,10 +82,7 @@ public class AccountAdapter extends ArrayAdapter { } }); if (activity.xmppConnectionService != null && activity.xmppConnectionService.getAccounts().size() > 1) { - viewHolder.binding.frame.setBackgroundColor(ColorUtils.setAlphaComponent( - UIHelper.getColorForName(account.getJid().asBareJid().toString()), - activity.isDarkTheme() ? 20 : 15 - )); + viewHolder.binding.frame.setBackgroundColor(account.getColor(activity.isDarkTheme())); } return view; } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index d21c089e8125f9765cc74891189ad55153ab125a..286355c0f52f1bf096bb5ad2bdf07ed7fa893812 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -70,10 +70,7 @@ public class ConversationAdapter } if (activity.xmppConnectionService != null && activity.xmppConnectionService.getAccounts().size() > 1) { - viewHolder.binding.frame.setBackgroundColor(ColorUtils.setAlphaComponent( - UIHelper.getColorForName(conversation.getAccount().getJid().asBareJid().toString()), - activity.isDarkTheme() ? 20 : 15 - )); + viewHolder.binding.frame.setBackgroundColor(conversation.getAccount().getColor(activity.isDarkTheme())); } Message message = conversation.getLatestMessage(); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java index 342df6c4196fb15351203a422864d74797df0817..fabf8570c75129e4bd861530cf996430c0cd7ccf 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java @@ -65,10 +65,7 @@ public class ListItemAdapter extends ArrayAdapter { } if (activity.xmppConnectionService != null && activity.xmppConnectionService.getAccounts().size() > 1) { - view.setBackgroundColor(ColorUtils.setAlphaComponent( - UIHelper.getColorForName(item.getAccount().getJid().asBareJid().toString()), - activity.isDarkTheme() ? 20 : 15 - )); + view.setBackgroundColor(item.getAccount().getColor(activity.isDarkTheme())); } else { view.setBackground(StyledAttributes.getDrawable(view.getContext(),R.attr.list_item_background)); } diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml index bb6344d41d83a6033e8db5f699344d9bbead94c4..469f9be8f8fff68a5279279bd8ccd1d7b156040d 100644 --- a/src/main/res/layout/activity_edit_account.xml +++ b/src/main/res/layout/activity_edit_account.xml @@ -536,6 +536,57 @@ android:visibility="visible"/> + + + + + + + + + + + + + + + + + + + + android:key="main_screen" + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:defaultValue="@color/perpy" + app:colorpicker_showAlpha="false" /> + android:defaultValue="@color/black_perpy" + app:colorpicker_showAlpha="false" /> + android:defaultValue="@color/black_perpy" + app:colorpicker_showAlpha="false" />