diff --git a/README.md b/README.md index fee10c6..258c233 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Then add the dependency ``` dependencies { - compile 'com.github.timigod:android-chat-ui:v0.1.4' + implementation 'com.github.subhan9090:android-chat-ui:v0.1' } ``` @@ -134,6 +134,16 @@ chatView.setTypingListener(new ChatView.TypingListener(){ }); ``` +### Typing Indicator + +When you receive socket from other user that it's typing you can show and hide the Typing Indicator +In the ChatView. + +``` + chatView.showTypingIndicator("User Name"); + chatView.hideTypingIndicator("User Name"); +``` + ### TODO This is list of things that are in the works for this library: @@ -155,3 +165,5 @@ We welcome any and all contributions, code cleanups and feature requests. 1. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. 2. Fork the repository on GitHub to start making your changes to the master branch (or branch off of it). 3. Send a pull request and bug the maintainer until it gets merged and published. :). + +[![](https://jitpack.io/v/subhan9090/android-chat-ui.svg)](https://jitpack.io/#subhan9090/android-chat-ui) diff --git a/app/build.gradle b/app/build.gradle index 2914bdd..72b699a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,16 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 34 // at least 28, I recommend latest stable + namespace "co.intentservice.chatui.sample" defaultConfig { - applicationId "co.intentservice.chatui.sample" - minSdkVersion 16 - targetSdkVersion 23 + minSdkVersion 23 + targetSdkVersion 34 versionCode 1 versionName "1.0" } + buildTypes { release { minifyEnabled false @@ -19,10 +19,11 @@ android { } } + dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13.2' - compile 'com.android.support:appcompat-v7:23.4.0' - compile project(':chat-ui') + implementation 'androidx.appcompat:appcompat:1.7.1' + implementation project(':chat-ui') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c763b5d..05e0e80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ diff --git a/app/src/main/java/co/intentservice/chatui/sample/MainActivity.java b/app/src/main/java/co/intentservice/chatui/sample/MainActivity.java index 15bacea..f2a954d 100644 --- a/app/src/main/java/co/intentservice/chatui/sample/MainActivity.java +++ b/app/src/main/java/co/intentservice/chatui/sample/MainActivity.java @@ -1,7 +1,8 @@ package co.intentservice.chatui.sample; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; + +import androidx.appcompat.app.AppCompatActivity; import co.intentservice.chatui.ChatView; import co.intentservice.chatui.models.ChatMessage; @@ -17,12 +18,7 @@ protected void onCreate(Bundle savedInstanceState) { chatView.addMessage(new ChatMessage("Message received", System.currentTimeMillis(), ChatMessage.Type.RECEIVED)); chatView.addMessage(new ChatMessage("A message with a sender name", System.currentTimeMillis(), ChatMessage.Type.RECEIVED, "Ryan Java")); - chatView.setOnSentMessageListener(new ChatView.OnSentMessageListener() { - @Override - public boolean sendMessage(ChatMessage chatMessage) { - return true; - } - }); + chatView.setOnSentMessageListener(chatMessage -> true); chatView.setTypingListener(new ChatView.TypingListener() { @Override diff --git a/build.gradle b/build.gradle index 83eeae5..3c0d0c9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + repositories { - jcenter() + google() + mavenCentral() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' + classpath 'com.android.tools.build:gradle:8.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -15,7 +16,10 @@ buildscript { allprojects { repositories { - jcenter() + google() + mavenCentral() + maven { url 'https://jitpack.io' } + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } } diff --git a/chat-ui/build.gradle b/chat-ui/build.gradle index 7ec8dab..a63f789 100644 --- a/chat-ui/build.gradle +++ b/chat-ui/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.library' +apply plugin: 'maven-publish' ext { bintrayRepo = 'maven' @@ -25,15 +26,15 @@ ext { } android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" - + namespace "co.intentservice.chatui" + compileSdk = 34 defaultConfig { - minSdkVersion 16 - targetSdkVersion 23 + minSdk 23 + targetSdkVersion 34 versionCode 1 versionName "1.0" } + buildTypes { release { minifyEnabled false @@ -42,21 +43,50 @@ android { } } -ext { - supportLibVer = '23.4.0' -} - dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile 'junit:junit:4.12' - compile 'com.android.support:support-v4:23.0.0' - compile "com.android.support:appcompat-v7:${supportLibVer}" - compile "com.android.support:cardview-v7:${supportLibVer}" - compile "com.android.support:design:${supportLibVer}" - - compile 'pl.tajchert:waitingdots:0.2.0' + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'androidx.appcompat:appcompat:1.7.1' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'com.google.android.material:material:1.13.0' + androidTestImplementation 'androidx.test:core:1.7.0' + implementation 'pl.tajchert:waitingdots:0.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0' + implementation 'androidx.annotation:annotation:1.9.1' + } +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + // Instead of from components.release, publish the AAR manually + groupId = 'com.github.subhan9090' + artifactId = 'android-chat-ui' + version = 'v0.1.2' + artifact("$buildDir/outputs/aar/${project.name}-release.aar") { + builtBy tasks.named("bundleReleaseAar") + } -apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' -apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' + pom { + name.set("android-chat-ui") + description.set("A UI Chat Interface Library for Android Applications with typing indicator support") + url.set("https://github.com/subhan9090/android-chat-ui") + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + } + } + } + } + } + } +} +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} diff --git a/chat-ui/src/main/java/co/intentservice/chatui/ApplicationTest.java b/chat-ui/src/main/java/co/intentservice/chatui/ApplicationTest.java deleted file mode 100644 index a80d2f0..0000000 --- a/chat-ui/src/main/java/co/intentservice/chatui/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.intentservice.chatui; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/chat-ui/src/main/java/co/intentservice/chatui/ChatView.java b/chat-ui/src/main/java/co/intentservice/chatui/ChatView.java index f27bd80..4e929c4 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/ChatView.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/ChatView.java @@ -1,11 +1,11 @@ package co.intentservice.chatui; +import static androidx.core.content.ContextCompat.getColor; + import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.CardView; import android.text.Editable; import android.text.InputType; import android.text.TextUtils; @@ -22,6 +22,8 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.cardview.widget.CardView; + import java.util.ArrayList; import co.intentservice.chatui.fab.FloatingActionsMenu; @@ -141,8 +143,8 @@ private void getChatViewBackgroundColor() { } private void getAttributesForChatMessageRow() { - backgroundRcv = attributes.getColor(R.styleable.ChatView_backgroundRcv, ContextCompat.getColor(context, R.color.default_chat_message_background_color_rcv)); - backgroundSend = attributes.getColor(R.styleable.ChatView_backgroundSend, ContextCompat.getColor(context, R.color.default_chat_message_background_color_send)); + backgroundRcv = attributes.getColor(R.styleable.ChatView_backgroundRcv, getColor(context, R.color.default_chat_message_background_color_rcv)); + backgroundSend = attributes.getColor(R.styleable.ChatView_backgroundSend, getColor(context, R.color.default_chat_message_background_color_send)); } private void getAttributesForBubbles() { @@ -150,8 +152,8 @@ private void getAttributesForBubbles() { int elevation = attributes.getInt(R.styleable.ChatView_bubbleElevation, ELEVATED); bubbleElevation = elevation == ELEVATED ? dip4 : 0; - bubbleBackgroundRcv = attributes.getColor(R.styleable.ChatView_bubbleBackgroundRcv, ContextCompat.getColor(context, R.color.default_bubble_color_rcv)); - bubbleBackgroundSend = attributes.getColor(R.styleable.ChatView_bubbleBackgroundSend, ContextCompat.getColor(context, R.color.default_bubble_color_send)); + bubbleBackgroundRcv = attributes.getColor(R.styleable.ChatView_bubbleBackgroundRcv, getColor(context, R.color.default_bubble_color_rcv)); + bubbleBackgroundSend = attributes.getColor(R.styleable.ChatView_bubbleBackgroundSend, getColor(context, R.color.default_bubble_color_send)); } @@ -226,8 +228,8 @@ private boolean hasStyleResourceSet() { private void setInputTextDefaults() { inputTextSize = context.getResources().getDimensionPixelSize(R.dimen.default_input_text_size); - inputTextColor = ContextCompat.getColor(context, R.color.black); - inputHintColor = ContextCompat.getColor(context, R.color.main_color_gray); + inputTextColor = getColor(context, R.color.black); + inputHintColor = getColor(context, R.color.main_color_gray); setInputHint(); } @@ -404,6 +406,60 @@ public FloatingActionsMenu getActionsMenu() { } + /** + * Shows typing indicator for a specific sender (other user) + */ + public void showTypingIndicator(String sender) { + chatListView.post(() -> { + ArrayList messages = chatViewListAdapter.getList(); + + // Avoid duplicates + for (ChatMessage msg : messages) { + if (msg.getType() == ChatMessage.Type.TYPING && sender.equals(msg.getSender())) { + return; // already showing + } + } + + ChatMessage typingMessage = new ChatMessage( + "", + System.currentTimeMillis(), + ChatMessage.Type.TYPING, + sender + ); + + chatViewListAdapter.addMessage(typingMessage); + scrollToBottom(); + }); + } + + /** + * Removes typing indicator for a specific sender + */ + public void hideTypingIndicator(String sender) { + chatListView.post(() -> { + ArrayList messages = chatViewListAdapter.getList(); + + for (int i = messages.size() - 1; i >= 0; i--) { + ChatMessage msg = messages.get(i); + if (msg.getType() == ChatMessage.Type.TYPING && sender.equals(msg.getSender())) { + chatViewListAdapter.removeMessage(i); + break; // remove only the last typing indicator for this sender + } + } + }); + } + + /** + * Scroll ListView to bottom + */ + private void scrollToBottom() { + chatListView.post(() -> { + int count = chatViewListAdapter.getCount(); + if (count > 0) { + chatListView.setSelection(count - 1); + } + }); + } public interface TypingListener { void userStartedTyping(); diff --git a/chat-ui/src/main/java/co/intentservice/chatui/adapters/ChatViewListAdapter.java b/chat-ui/src/main/java/co/intentservice/chatui/adapters/ChatViewListAdapter.java index 2e01766..eeee850 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/adapters/ChatViewListAdapter.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/adapters/ChatViewListAdapter.java @@ -24,6 +24,7 @@ public class ChatViewListAdapter extends BaseAdapter { public final int STATUS_SENT = 0; public final int STATUS_RECEIVED = 1; + public final int STATUS_TYPING = 2; private int backgroundRcv, backgroundSend; private int bubbleBackgroundRcv, bubbleBackgroundSend; @@ -69,7 +70,7 @@ public int getItemViewType(int position) { @Override public int getViewTypeCount() { - return 2; + return 3; } @Override @@ -84,6 +85,9 @@ public View getView(int position, View convertView, ViewGroup parent) { case STATUS_RECEIVED: convertView = viewBuilder.buildRecvView(context); break; + case STATUS_TYPING: + convertView = viewBuilder.buildDotView(context); + break; } holder = new MessageViewHolder(convertView, backgroundRcv, backgroundSend, bubbleBackgroundRcv, bubbleBackgroundSend); @@ -92,13 +96,15 @@ public View getView(int position, View convertView, ViewGroup parent) { holder = (MessageViewHolder) convertView.getTag(); } - holder.setMessage(chatMessages.get(position).getMessage()); - holder.setTimestamp(chatMessages.get(position).getFormattedTime()); - holder.setElevation(bubbleElevation); - holder.setBackground(type); - String sender = chatMessages.get(position).getSender(); - if (sender != null) { - holder.setSender(sender); + if (type != STATUS_TYPING) { + holder.setMessage(chatMessages.get(position).getMessage()); + holder.setTimestamp(chatMessages.get(position).getFormattedTime()); + holder.setElevation(bubbleElevation); + holder.setBackground(type); + String sender = chatMessages.get(position).getSender(); + if (sender != null) { + holder.setSender(sender); + } } return convertView; @@ -114,9 +120,17 @@ public void addMessages(ArrayList chatMessages) { notifyDataSetChanged(); } + public ArrayList getList() { + return chatMessages; + } + + /** + * Removes message at position safely on UI thread + */ public void removeMessage(int position) { - if (this.chatMessages.size() > position) { - this.chatMessages.remove(position); + if (position >= 0 && position < chatMessages.size()) { + chatMessages.remove(position); + notifyDataSetChanged(); } } diff --git a/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionButton.java b/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionButton.java index 2dfda0d..e52c7bb 100755 --- a/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionButton.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionButton.java @@ -20,15 +20,16 @@ import android.graphics.drawable.shapes.OvalShape; import android.os.Build; import android.os.Build.VERSION_CODES; -import android.support.annotation.ColorRes; -import android.support.annotation.DimenRes; -import android.support.annotation.DrawableRes; -import android.support.annotation.IntDef; -import android.support.annotation.NonNull; import android.util.AttributeSet; import android.widget.ImageButton; import android.widget.TextView; +import androidx.annotation.ColorRes; +import androidx.annotation.DimenRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionsMenu.java b/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionsMenu.java index 4fddf6a..5bbf3ca 100755 --- a/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionsMenu.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/fab/FloatingActionsMenu.java @@ -1,5 +1,7 @@ package co.intentservice.chatui.fab; +import static androidx.core.content.ContextCompat.getColor; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -14,9 +16,6 @@ import android.graphics.drawable.LayerDrawable; import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.ColorRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.ContextThemeWrapper; import android.view.TouchDelegate; @@ -27,6 +26,10 @@ import android.view.animation.OvershootInterpolator; import android.widget.TextView; +import androidx.core.content.ContextCompat; + +import org.jspecify.annotations.NonNull; + import co.intentservice.chatui.R; public class FloatingActionsMenu extends ViewGroup { @@ -123,9 +126,9 @@ private void init(Context context, AttributeSet attributeSet) { setTouchDelegate(mTouchDelegateGroup); TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatingActionsMenu, 0, 0); - mAddButtonPlusColor = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonPlusIconColor, getColor(android.R.color.white)); - mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorNormal, getColor(android.R.color.holo_blue_dark)); - mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorPressed, getColor(android.R.color.holo_blue_light)); + mAddButtonPlusColor = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonPlusIconColor, getColor(context,android.R.color.white)); + mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorNormal, getColor(context,android.R.color.holo_blue_dark)); + mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorPressed, getColor(context,android.R.color.holo_blue_light)); mAddButtonSize = attr.getInt(R.styleable.FloatingActionsMenu_fab_addButtonSize, FloatingActionButton.SIZE_NORMAL); mAddButtonStrokeVisible = attr.getBoolean(R.styleable.FloatingActionsMenu_fab_addButtonStrokeVisible, true); mExpandDirection = attr.getInt(R.styleable.FloatingActionsMenu_fab_expandDirection, EXPAND_UP); @@ -210,10 +213,6 @@ public void removeButton(FloatingActionButton button) { mButtonsCount--; } - private int getColor(@ColorRes int id) { - return getResources().getColor(id); - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { measureChildren(widthMeasureSpec, heightMeasureSpec); diff --git a/chat-ui/src/main/java/co/intentservice/chatui/fab/SendFloatingActionButton.java b/chat-ui/src/main/java/co/intentservice/chatui/fab/SendFloatingActionButton.java index 327475e..ea11b56 100755 --- a/chat-ui/src/main/java/co/intentservice/chatui/fab/SendFloatingActionButton.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/fab/SendFloatingActionButton.java @@ -2,10 +2,11 @@ import android.content.Context; import android.content.res.TypedArray; -import android.support.annotation.ColorRes; -import android.support.annotation.DrawableRes; import android.util.AttributeSet; +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; + import co.intentservice.chatui.R; public class SendFloatingActionButton extends FloatingActionButton { diff --git a/chat-ui/src/main/java/co/intentservice/chatui/fab/TouchDelegateGroup.java b/chat-ui/src/main/java/co/intentservice/chatui/fab/TouchDelegateGroup.java index 83e1ad5..cdc7fe8 100755 --- a/chat-ui/src/main/java/co/intentservice/chatui/fab/TouchDelegateGroup.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/fab/TouchDelegateGroup.java @@ -1,11 +1,12 @@ package co.intentservice.chatui.fab; import android.graphics.Rect; -import android.support.annotation.NonNull; import android.view.MotionEvent; import android.view.TouchDelegate; import android.view.View; +import androidx.annotation.NonNull; + import java.util.ArrayList; public class TouchDelegateGroup extends TouchDelegate { diff --git a/chat-ui/src/main/java/co/intentservice/chatui/models/ChatMessage.java b/chat-ui/src/main/java/co/intentservice/chatui/models/ChatMessage.java index d62200a..a4cdb54 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/models/ChatMessage.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/models/ChatMessage.java @@ -71,6 +71,6 @@ public void setSender(String sender) { } public enum Type { - SENT, RECEIVED + SENT, RECEIVED, TYPING } } diff --git a/chat-ui/src/main/java/co/intentservice/chatui/viewholders/MessageViewHolder.java b/chat-ui/src/main/java/co/intentservice/chatui/viewholders/MessageViewHolder.java index c20c4d4..2980cc7 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/viewholders/MessageViewHolder.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/viewholders/MessageViewHolder.java @@ -1,10 +1,10 @@ package co.intentservice.chatui.viewholders; +import static androidx.core.content.ContextCompat.getColor; + import android.content.Context; -import android.support.v4.content.ContextCompat; import android.view.View; -import co.intentservice.chatui.R; import co.intentservice.chatui.views.MessageView; /** @@ -61,8 +61,8 @@ public void setSender(String sender) { public void setBackground(int messageType) { - int chatMessageBackground = ContextCompat.getColor(context, R.color.cardview_light_background); - int bubbleBackground = ContextCompat.getColor(context, R.color.cardview_light_background); + int chatMessageBackground = getColor(context, androidx.cardview.R.color.cardview_light_background); + int bubbleBackground = getColor(context, androidx.cardview.R.color.cardview_light_background); switch (messageType) { case STATUS_RECEIVED: diff --git a/chat-ui/src/main/java/co/intentservice/chatui/views/ItemDotView.java b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemDotView.java new file mode 100644 index 0000000..00a5fdf --- /dev/null +++ b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemDotView.java @@ -0,0 +1,105 @@ +package co.intentservice.chatui.views; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; + +import androidx.annotation.ColorInt; +import androidx.cardview.widget.CardView; + +import co.intentservice.chatui.R; +import pl.tajchert.sample.DotsTextView; + +/** + * View to display messages that have been received throught the chat-ui. + * + * Created by James Lendrem + */ + +public class ItemDotView extends MessageView { + + private CardView bubble; + private DotsTextView dotTextView; + + @Override + public void setMessage(String message) { + + } + + @Override + public void setTimestamp(String timestamp) { + + } + + /** + * Method to set the background color that you want to use in your message. + * @param background The background that you want to be displayed. + */ + public void setBackground(@ColorInt int background) { + + if (bubble == null) { + + this.bubble = (CardView) findViewById(R.id.bubble); + + } + + bubble.setCardBackgroundColor(background); + + } + + /** + * Method to set the elevation of the view. + * @param elevation The elevation that you want the view to be displayed at. + */ + public void setElevation(float elevation) { + + if (bubble == null) { + + this.bubble = (CardView) findViewById(R.id.bubble); + + } + + bubble.setCardElevation(elevation); + + } + + /** + * Constructs a new message view. + * @param context + */ + public ItemDotView(Context context) { + + super(context); + initializeView(context); + + } + + /** + * Constructs a new message view with attributes, this constructor is used when we create a + * message view using XML. + * @param context + * @param attrs + */ + public ItemDotView(Context context, AttributeSet attrs) { + + super(context, attrs); + initializeView(context); + + } + + /** + * Inflates the view so it can be displayed and grabs any child views that we may require + * later on. + * @param context The context that is used to inflate the view. + */ + private void initializeView(Context context) { + + LayoutInflater inflater = (LayoutInflater) + context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.chat_item_dots, this); + + this.bubble = (CardView) findViewById(R.id.bubble); + this.dotTextView = (DotsTextView) findViewById(R.id.dots); + } + +} diff --git a/chat-ui/src/main/java/co/intentservice/chatui/views/ItemRecvView.java b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemRecvView.java index 7c96bd5..a7b46cf 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/views/ItemRecvView.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemRecvView.java @@ -1,13 +1,13 @@ package co.intentservice.chatui.views; import android.content.Context; -import android.support.annotation.ColorInt; -import android.support.v7.widget.CardView; import android.util.AttributeSet; import android.view.LayoutInflater; -import android.widget.FrameLayout; import android.widget.TextView; +import androidx.annotation.ColorInt; +import androidx.cardview.widget.CardView; + import co.intentservice.chatui.R; /** diff --git a/chat-ui/src/main/java/co/intentservice/chatui/views/ItemSentView.java b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemSentView.java index cc785df..124dcaf 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/views/ItemSentView.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/views/ItemSentView.java @@ -1,15 +1,13 @@ package co.intentservice.chatui.views; -import android.app.Service; import android.content.Context; -import android.support.annotation.ColorInt; -import android.support.v7.widget.CardView; import android.util.AttributeSet; import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; import android.widget.TextView; +import androidx.annotation.ColorInt; +import androidx.cardview.widget.CardView; + import co.intentservice.chatui.R; /** diff --git a/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilder.java b/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilder.java index ae08c56..27973e9 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilder.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilder.java @@ -1,7 +1,6 @@ package co.intentservice.chatui.views; import android.content.Context; -import android.view.View; /** * Builder to create views for the Chat Client that are used to display sent and @@ -37,4 +36,15 @@ public MessageView buildSentView(Context context) { } + /** + * Returns a MessageView object which is used to display typing to the chat-ui + * @param context A context that is used to instantiate the view. + * @return MessageView object for displaying sent messages. + */ + public MessageView buildDotView(Context context) { + MessageView view = new ItemDotView(context); + return view; + + } + } diff --git a/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilderInterface.java b/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilderInterface.java index a513d34..7f5ca18 100644 --- a/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilderInterface.java +++ b/chat-ui/src/main/java/co/intentservice/chatui/views/ViewBuilderInterface.java @@ -26,4 +26,11 @@ public interface ViewBuilderInterface { */ MessageView buildSentView(Context context); + /** + * Returns a MessageView object which is used to display Dots to the chat-ui. + * @param context A context that is used to instantiate the view. + * @return MessageView object for displaying dots item. + */ + MessageView buildDotView(Context context); + } diff --git a/chat-ui/src/main/res/layout/chat_item_dots.xml b/chat-ui/src/main/res/layout/chat_item_dots.xml index ef741f6..004a611 100644 --- a/chat-ui/src/main/res/layout/chat_item_dots.xml +++ b/chat-ui/src/main/res/layout/chat_item_dots.xml @@ -7,6 +7,7 @@ android:paddingLeft="16dp">