Work fork of an Android Jabber client for bridge users git.sr.ht/~singpolyma/cheogram-android
sopranica sgx xmpp jabber
0

Configure Feed

Select the types of activity you want to include in your feed.

added setting to allow for white backgrounds in incoming message bubbles

Daniel Gultsch (Aug 24, 2015, 8:56 PM +0200) fb0b4bb4 d36ae091

+234 -36
+165
art/message_bubble_received_white.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <!-- Created with Inkscape (http://www.inkscape.org/) --> 3 + 4 + <svg 5 + xmlns:dc="http://purl.org/dc/elements/1.1/" 6 + xmlns:cc="http://creativecommons.org/ns#" 7 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 8 + xmlns:svg="http://www.w3.org/2000/svg" 9 + xmlns="http://www.w3.org/2000/svg" 10 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" 11 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" 12 + width="36" 13 + height="26" 14 + id="svg2" 15 + version="1.1" 16 + inkscape:version="0.48.5 r10040" 17 + sodipodi:docname="message_bubble_received.svg"> 18 + <defs 19 + id="defs4"> 20 + <filter 21 + x="-0.25" 22 + y="-0.25" 23 + width="1.5" 24 + height="1.5" 25 + inkscape:label="Drop Shadow" 26 + id="filter3811" 27 + color-interpolation-filters="sRGB"> 28 + <feFlood 29 + flood-opacity="0.25" 30 + flood-color="rgb(0,0,0)" 31 + result="flood" 32 + id="feFlood3813" /> 33 + <feComposite 34 + in="flood" 35 + in2="SourceGraphic" 36 + operator="in" 37 + result="composite1" 38 + id="feComposite3815" /> 39 + <feGaussianBlur 40 + stdDeviation="0.5" 41 + result="blur" 42 + id="feGaussianBlur3817" /> 43 + <feOffset 44 + dx="0" 45 + dy="1" 46 + result="offset" 47 + id="feOffset3819" /> 48 + <feComposite 49 + in="SourceGraphic" 50 + in2="offset" 51 + operator="over" 52 + result="composite2" 53 + id="feComposite3821" /> 54 + </filter> 55 + </defs> 56 + <sodipodi:namedview 57 + id="base" 58 + pagecolor="#ffffff" 59 + bordercolor="#666666" 60 + borderopacity="1.0" 61 + inkscape:pageopacity="0.0" 62 + inkscape:pageshadow="2" 63 + inkscape:zoom="16" 64 + inkscape:cx="25.745257" 65 + inkscape:cy="9.618802" 66 + inkscape:document-units="px" 67 + inkscape:current-layer="layer1" 68 + showgrid="true" 69 + inkscape:window-width="989" 70 + inkscape:window-height="755" 71 + inkscape:window-x="22" 72 + inkscape:window-y="16" 73 + inkscape:window-maximized="0" 74 + showguides="true" 75 + inkscape:guide-bbox="true" 76 + guidecolor="#000000" 77 + guideopacity="0.49803922"> 78 + <inkscape:grid 79 + type="xygrid" 80 + id="grid2985" 81 + empspacing="4" 82 + visible="true" 83 + enabled="true" 84 + snapvisiblegridlinesonly="true" 85 + spacingx="1px" 86 + spacingy="1px" 87 + originx="0px" 88 + originy="0px" 89 + color="#0000ff" 90 + opacity="0.03137255" /> 91 + <sodipodi:guide 92 + orientation="1,0" 93 + position="20,26" 94 + id="guide3060" /> 95 + <sodipodi:guide 96 + orientation="1,0" 97 + position="24,26" 98 + id="guide3062" /> 99 + <sodipodi:guide 100 + orientation="0,1" 101 + position="36,22" 102 + id="guide3064" /> 103 + <sodipodi:guide 104 + orientation="0,1" 105 + position="36,6" 106 + id="guide3066" /> 107 + <sodipodi:guide 108 + orientation="1,0" 109 + position="26,0" 110 + id="guide3068" /> 111 + <sodipodi:guide 112 + orientation="1,0" 113 + position="18,0" 114 + id="guide3070" /> 115 + <sodipodi:guide 116 + orientation="0,1" 117 + position="0,10" 118 + id="guide3074" /> 119 + <sodipodi:guide 120 + orientation="0,1" 121 + position="0,8" 122 + id="guide3076" /> 123 + </sodipodi:namedview> 124 + <metadata 125 + id="metadata7"> 126 + <rdf:RDF> 127 + <cc:Work 128 + rdf:about=""> 129 + <dc:format>image/svg+xml</dc:format> 130 + <dc:type 131 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> 132 + <dc:title /> 133 + </cc:Work> 134 + </rdf:RDF> 135 + </metadata> 136 + <g 137 + inkscape:label="Layer" 138 + inkscape:groupmode="layer" 139 + id="layer" 140 + transform="translate(0,-2)"> 141 + <g 142 + id="g3759" 143 + style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)"> 144 + <path 145 + style="display:none" 146 + d="m 8,6 c 2,2 4,6 4,10 L 16,6 z" 147 + id="path3805" 148 + inkscape:connector-curvature="0" 149 + transform="translate(0,2)" 150 + sodipodi:nodetypes="cccc" /> 151 + <path 152 + inkscape:connector-curvature="0" 153 + id="path2989" 154 + d="M 4,4 16,16 16,4 z" 155 + sodipodi:nodetypes="cccc" /> 156 + <rect 157 + ry="2" 158 + y="4" 159 + x="12" 160 + height="20" 161 + width="20" 162 + id="rect2987" /> 163 + </g> 164 + </g> 165 + </svg>
+1
art/render.rb
··· 45 45 'md_switch_thumb_on_pressed.svg' => ['switch_thumb_on_pressed', 48], 46 46 'message_bubble_received.svg' => ['message_bubble_received.9', 0], 47 47 'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0], 48 + 'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0], 48 49 'message_bubble_sent.svg' => ['message_bubble_sent.9', 0], 49 50 } 50 51
+9 -2
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
··· 966 966 mPendingGeoUri = null; 967 967 setSelectedConversation(conversationList.get(0)); 968 968 this.mConversationFragment.reInit(getSelectedConversation()); 969 + } else { 970 + this.mConversationFragment.messageListAdapter.updatePreferences(); 971 + this.mConversationFragment.messagesView.invalidateViews(); 969 972 } 970 973 971 974 if(!forbidProcessingPendings) { ··· 1144 1147 } 1145 1148 prepareFileToast = Toast.makeText(getApplicationContext(),getText(R.string.preparing_file), Toast.LENGTH_LONG); 1146 1149 prepareFileToast.show(); 1147 - xmppConnectionService.attachFileToConversation(conversation,uri, new UiCallback<Message>() { 1150 + xmppConnectionService.attachFileToConversation(conversation, uri, new UiCallback<Message>() { 1148 1151 @Override 1149 1152 public void success(Message message) { 1150 1153 hidePrepareFileToast(); ··· 1174 1177 1175 1178 @Override 1176 1179 public void userInputRequried(PendingIntent pi, 1177 - Message object) { 1180 + Message object) { 1178 1181 hidePrepareFileToast(); 1179 1182 } 1180 1183 ··· 1254 1257 1255 1258 public boolean indicateReceived() { 1256 1259 return getPreferences().getBoolean("indicate_received", false); 1260 + } 1261 + 1262 + public boolean useWhiteBackground() { 1263 + return getPreferences().getBoolean("use_white_background",false); 1257 1264 } 1258 1265 1259 1266 protected boolean trustKeysIfNeeded(int requestCode) {
+1
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
··· 662 662 this.mEditMessage.setText(""); 663 663 this.mEditMessage.append(this.conversation.getNextMessage()); 664 664 this.mEditMessage.setKeyboardListener(this); 665 + messageListAdapter.updatePreferences(); 665 666 this.messagesView.setAdapter(messageListAdapter); 666 667 updateMessages(); 667 668 this.messagesLoaded = true;
+51 -34
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
··· 60 60 return true; 61 61 } 62 62 }; 63 + private boolean mIndicateReceived = false; 64 + private boolean mUseWhiteBackground = false; 63 65 64 66 public MessageAdapter(ConversationActivity activity, List<Message> messages) { 65 67 super(activity, 0, messages); 66 68 this.activity = activity; 67 69 metrics = getContext().getResources().getDisplayMetrics(); 70 + updatePreferences(); 68 71 } 69 72 70 73 public void setOnContactPictureClicked(OnContactPictureClicked listener) { ··· 96 99 return this.getItemViewType(getItem(position)); 97 100 } 98 101 99 - private int getMessageTextColor(int type, boolean primary) { 100 - if (type == SENT) { 101 - return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54); 102 - } else { 102 + private int getMessageTextColor(boolean onDark, boolean primary) { 103 + if (onDark) { 103 104 return activity.getResources().getColor(primary ? R.color.white : R.color.white70); 105 + } else { 106 + return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54); 104 107 } 105 108 } 106 109 107 - private void displayStatus(ViewHolder viewHolder, Message message, int type) { 110 + private void displayStatus(ViewHolder viewHolder, Message message, int type, boolean darkBackground) { 108 111 String filesize = null; 109 112 String info = null; 110 113 boolean error = false; ··· 140 143 info = getContext().getString(R.string.offering); 141 144 break; 142 145 case Message.STATUS_SEND_RECEIVED: 143 - if (activity.indicateReceived()) { 146 + if (mIndicateReceived) { 144 147 viewHolder.indicatorReceived.setVisibility(View.VISIBLE); 145 148 } 146 149 break; 147 150 case Message.STATUS_SEND_DISPLAYED: 148 - if (activity.indicateReceived()) { 151 + if (mIndicateReceived) { 149 152 viewHolder.indicatorReceived.setVisibility(View.VISIBLE); 150 153 } 151 154 break; ··· 162 165 if (error && type == SENT) { 163 166 viewHolder.time.setTextColor(activity.getWarningTextColor()); 164 167 } else { 165 - viewHolder.time.setTextColor(this.getMessageTextColor(type,false)); 168 + viewHolder.time.setTextColor(this.getMessageTextColor(darkBackground,false)); 166 169 } 167 170 if (message.getEncryption() == Message.ENCRYPTION_NONE) { 168 171 viewHolder.indicator.setVisibility(View.GONE); 169 172 } else { 173 + viewHolder.indicator.setImageResource(darkBackground ? R.drawable.ic_secure_indicator_white : R.drawable.ic_secure_indicator); 170 174 viewHolder.indicator.setVisibility(View.VISIBLE); 171 175 if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL) { 172 176 XmppAxolotlSession.Trust trust = message.getConversation() ··· 178 182 viewHolder.indicator.setAlpha(1.0f); 179 183 } else { 180 184 viewHolder.indicator.clearColorFilter(); 181 - if (type == SENT) { 185 + if (darkBackground) { 186 + viewHolder.indicator.setAlpha(0.7f); 187 + } else { 182 188 viewHolder.indicator.setAlpha(0.57f); 183 - } else { 184 - viewHolder.indicator.setAlpha(0.7f); 185 189 } 186 190 } 187 191 } else { 188 192 viewHolder.indicator.clearColorFilter(); 189 - if (type == SENT) { 193 + if (darkBackground) { 194 + viewHolder.indicator.setAlpha(0.7f); 195 + } else { 190 196 viewHolder.indicator.setAlpha(0.57f); 191 - } else { 192 - viewHolder.indicator.setAlpha(0.7f); 193 197 } 194 198 } 195 199 } ··· 223 227 } 224 228 } 225 229 226 - private void displayInfoMessage(ViewHolder viewHolder, String text, int type) { 230 + private void displayInfoMessage(ViewHolder viewHolder, String text, boolean darkBackground) { 227 231 if (viewHolder.download_button != null) { 228 232 viewHolder.download_button.setVisibility(View.GONE); 229 233 } 230 234 viewHolder.image.setVisibility(View.GONE); 231 235 viewHolder.messageBody.setVisibility(View.VISIBLE); 232 236 viewHolder.messageBody.setText(text); 233 - viewHolder.messageBody.setTextColor(getMessageTextColor(type,false)); 237 + viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false)); 234 238 viewHolder.messageBody.setTypeface(null, Typeface.ITALIC); 235 239 viewHolder.messageBody.setTextIsSelectable(false); 236 240 } 237 241 238 - private void displayDecryptionFailed(ViewHolder viewHolder, int type) { 242 + private void displayDecryptionFailed(ViewHolder viewHolder, boolean darkBackground) { 239 243 if (viewHolder.download_button != null) { 240 244 viewHolder.download_button.setVisibility(View.GONE); 241 245 } ··· 243 247 viewHolder.messageBody.setVisibility(View.VISIBLE); 244 248 viewHolder.messageBody.setText(getContext().getString( 245 249 R.string.decryption_failed)); 246 - viewHolder.messageBody.setTextColor(getMessageTextColor(type,false)); 250 + viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false)); 247 251 viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); 248 252 viewHolder.messageBody.setTextIsSelectable(false); 249 253 } ··· 261 265 viewHolder.messageBody.setText(span); 262 266 } 263 267 264 - private void displayTextMessage(final ViewHolder viewHolder, final Message message, int type) { 268 + private void displayTextMessage(final ViewHolder viewHolder, final Message message, boolean darkBackground) { 265 269 if (viewHolder.download_button != null) { 266 270 viewHolder.download_button.setVisibility(View.GONE); 267 271 } ··· 303 307 } 304 308 final Spannable span = new SpannableString(privateMarker + " " 305 309 + formattedBody); 306 - span.setSpan(new ForegroundColorSpan(getMessageTextColor(type,false)), 0, privateMarker 310 + span.setSpan(new ForegroundColorSpan(getMessageTextColor(darkBackground,false)), 0, privateMarker 307 311 .length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 308 312 span.setSpan(new StyleSpan(Typeface.BOLD), 0, 309 313 privateMarker.length(), ··· 318 322 } else { 319 323 viewHolder.messageBody.setText(""); 320 324 } 321 - viewHolder.messageBody.setTextColor(this.getMessageTextColor(type,true)); 325 + viewHolder.messageBody.setTextColor(this.getMessageTextColor(darkBackground, true)); 326 + viewHolder.messageBody.setLinkTextColor(this.getMessageTextColor(darkBackground,true)); 322 327 viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); 323 328 viewHolder.messageBody.setTextIsSelectable(true); 324 329 } ··· 388 393 scalledH = (int) (params.height / ((double) params.width / target)); 389 394 } 390 395 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(scalledW, scalledH); 391 - layoutParams.setMargins(0, (int)(metrics.density * 4), 0, (int)(metrics.density * 4)); 396 + layoutParams.setMargins(0, (int) (metrics.density * 4), 0, (int) (metrics.density * 4)); 392 397 viewHolder.image.setLayoutParams(layoutParams); 393 398 activity.loadBitmap(message, viewHolder.image); 394 399 viewHolder.image.setOnClickListener(new OnClickListener() { ··· 404 409 @Override 405 410 public View getView(int position, View view, ViewGroup parent) { 406 411 final Message message = getItem(position); 412 + final boolean isInValidSession = message.isValidInSession(); 407 413 final Conversation conversation = message.getConversation(); 408 414 final Account account = conversation.getAccount(); 409 415 final int type = getItemViewType(position); ··· 468 474 } 469 475 } 470 476 477 + boolean darkBackground = (type == RECEIVED && (!isInValidSession || !mUseWhiteBackground)); 478 + 471 479 if (type == STATUS) { 472 480 if (conversation.getMode() == Conversation.MODE_SINGLE) { 473 481 viewHolder.contact_picture.setImageBitmap(activity ··· 497 505 public void onClick(View v) { 498 506 if (MessageAdapter.this.mOnContactPictureClickedListener != null) { 499 507 MessageAdapter.this.mOnContactPictureClickedListener 500 - .onContactPictureClicked(message); 508 + .onContactPictureClicked(message); 501 509 } 502 510 503 511 } ··· 509 517 public boolean onLongClick(View v) { 510 518 if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) { 511 519 MessageAdapter.this.mOnContactPictureLongClickedListener 512 - .onContactPictureLongClicked(message); 520 + .onContactPictureLongClicked(message); 513 521 return true; 514 522 } else { 515 523 return false; ··· 524 532 } else if (transferable.getStatus() == Transferable.STATUS_OFFER_CHECK_FILESIZE) { 525 533 displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message))); 526 534 } else { 527 - displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,type); 535 + displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,darkBackground); 528 536 } 529 537 } else if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) { 530 538 displayImageMessage(viewHolder, message); ··· 536 544 } 537 545 } else if (message.getEncryption() == Message.ENCRYPTION_PGP) { 538 546 if (activity.hasPgp()) { 539 - displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),type); 547 + displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),darkBackground); 540 548 } else { 541 - displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),type); 549 + displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),darkBackground); 542 550 if (viewHolder != null) { 543 551 viewHolder.message_box 544 552 .setOnClickListener(new OnClickListener() { ··· 551 559 } 552 560 } 553 561 } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) { 554 - displayDecryptionFailed(viewHolder,type); 562 + displayDecryptionFailed(viewHolder,darkBackground); 555 563 } else { 556 564 if (GeoHelper.isGeoUri(message.getBody())) { 557 565 displayLocationMessage(viewHolder,message); ··· 560 568 } else if (message.treatAsDownloadable() == Message.Decision.MUST) { 561 569 displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message))); 562 570 } else { 563 - displayTextMessage(viewHolder, message, type); 571 + displayTextMessage(viewHolder, message, darkBackground); 564 572 } 565 573 } 566 574 567 575 if (type == RECEIVED) { 568 - if(message.isValidInSession()) { 569 - viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received); 576 + if(isInValidSession) { 577 + if (mUseWhiteBackground) { 578 + viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_white); 579 + } else { 580 + viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received); 581 + } 570 582 } else { 571 583 viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning); 572 584 } 573 585 } 574 586 575 - displayStatus(viewHolder, message, type); 587 + displayStatus(viewHolder, message, type, darkBackground); 576 588 577 589 return view; 578 590 } ··· 616 628 Toast.makeText(activity,R.string.no_application_found_to_display_location,Toast.LENGTH_SHORT).show(); 617 629 } 618 630 631 + public void updatePreferences() { 632 + this.mIndicateReceived = activity.indicateReceived(); 633 + this.mUseWhiteBackground = activity.useWhiteBackground(); 634 + } 635 + 619 636 public interface OnContactPictureClicked { 620 - public void onContactPictureClicked(Message message); 637 + void onContactPictureClicked(Message message); 621 638 } 622 639 623 640 public interface OnContactPictureLongClicked { 624 - public void onContactPictureLongClicked(Message message); 641 + void onContactPictureLongClicked(Message message); 625 642 } 626 643 627 644 private static class ViewHolder {
src/main/res/drawable-hdpi/message_bubble_received.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-hdpi/message_bubble_received_warning.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-hdpi/message_bubble_received_white.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-hdpi/message_bubble_sent.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-mdpi/message_bubble_received.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-mdpi/message_bubble_received_warning.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-mdpi/message_bubble_received_white.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-mdpi/message_bubble_sent.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xhdpi/message_bubble_received.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xhdpi/message_bubble_received_white.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xhdpi/message_bubble_sent.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxhdpi/message_bubble_received.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxhdpi/message_bubble_sent.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxxhdpi/message_bubble_received.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png

This is a binary file and will not be displayed.

src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png

This is a binary file and will not be displayed.

+2
src/main/res/values/strings.xml
··· 510 510 <string name="download_failed_server_not_found">Download failed: Server not found</string> 511 511 <string name="download_failed_file_not_found">Download failed: File not found</string> 512 512 <string name="download_failed_could_not_connect">Download failed: Could not connect to host</string> 513 + <string name="pref_use_white_background">Use white background</string> 514 + <string name="pref_use_white_background_summary">Show received messages as black text on a white background</string> 513 515 </resources>
+5
src/main/res/xml/preferences.xml
··· 97 97 android:title="@string/pref_conference_name"/> 98 98 <CheckBoxPreference 99 99 android:defaultValue="false" 100 + android:key="use_white_background" 101 + android:title="@string/pref_use_white_background" 102 + android:summary="@string/pref_use_white_background_summary"/> 103 + <CheckBoxPreference 104 + android:defaultValue="false" 100 105 android:key="use_larger_font" 101 106 android:summary="@string/pref_use_larger_font_summary" 102 107 android:title="@string/pref_use_larger_font"/>