aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <liangyuteng12345@gmail.com>2017-03-16 17:44:58 +0800
committerTrumeet <liangyuteng12345@gmail.com>2017-03-16 17:44:58 +0800
commitb8ff5cb8093d5ab5a3bacb48d38e982ac48523ba (patch)
treeb5bbdcc41ce741ca23b6e6b108dea4da93fda2e6
parentfcc3d444c350c726da563773ca2450a24f1ff1c7 (diff)
downloadMAT-BBS_Discuz_Android-master.tar
MAT-BBS_Discuz_Android-master.tar.gz
MAT-BBS_Discuz_Android-master.tar.bz2
MAT-BBS_Discuz_Android-master.zip
Very very basic thread view.HEADmaster
-rw-r--r--.idea/misc.xml2
-rw-r--r--app/src/main/AndroidManifest.xml3
-rw-r--r--app/src/main/java/me/letitfly/mat/activities/MainActivity.java (renamed from app/src/main/java/me/letitfly/mat/MainActivity.java)3
-rw-r--r--app/src/main/java/me/letitfly/mat/activities/ThreadViewActivity.java134
-rw-r--r--app/src/main/java/me/letitfly/mat/api/APIInterface.java3
-rw-r--r--app/src/main/java/me/letitfly/mat/api/APIManager.java7
-rw-r--r--app/src/main/java/me/letitfly/mat/fragments/PostListFragment.java25
-rw-r--r--app/src/main/java/me/letitfly/mat/model/ThreadView.java405
-rw-r--r--app/src/main/java/me/letitfly/mat/utils/FormatUtils.java79
-rw-r--r--app/src/main/res/drawable/ic_send_black_24dp.xml9
-rw-r--r--app/src/main/res/layout/activity_thread_view.xml33
-rw-r--r--app/src/main/res/values/colors.xml2
-rw-r--r--app/src/main/res/values/strings.xml3
13 files changed, 693 insertions, 15 deletions
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5d19981..fbb6828 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -37,7 +37,7 @@
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6c71c06..2675125 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
- <activity android:name=".MainActivity"
+ <activity android:name=".activities.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -16,6 +16,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+ <activity android:name=".activities.ThreadViewActivity" />
</application>
</manifest> \ No newline at end of file
diff --git a/app/src/main/java/me/letitfly/mat/MainActivity.java b/app/src/main/java/me/letitfly/mat/activities/MainActivity.java
index 4a7418c..35edd08 100644
--- a/app/src/main/java/me/letitfly/mat/MainActivity.java
+++ b/app/src/main/java/me/letitfly/mat/activities/MainActivity.java
@@ -1,4 +1,4 @@
-package me.letitfly.mat;
+package me.letitfly.mat.activities;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
@@ -9,6 +9,7 @@ import android.widget.TextView;
import com.flipboard.bottomsheet.BottomSheetLayout;
+import me.letitfly.mat.R;
import me.letitfly.mat.utils.ForumSwitchUtils;
import me.letitfly.mat.utils.ProgressSubscriber;
import rx.Subscriber;
diff --git a/app/src/main/java/me/letitfly/mat/activities/ThreadViewActivity.java b/app/src/main/java/me/letitfly/mat/activities/ThreadViewActivity.java
new file mode 100644
index 0000000..ca730c3
--- /dev/null
+++ b/app/src/main/java/me/letitfly/mat/activities/ThreadViewActivity.java
@@ -0,0 +1,134 @@
+package me.letitfly.mat.activities;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.stfalcon.chatkit.commons.ImageLoader;
+import com.stfalcon.chatkit.commons.models.IMessage;
+import com.stfalcon.chatkit.commons.models.IUser;
+import com.stfalcon.chatkit.messages.MessagesList;
+import com.stfalcon.chatkit.messages.MessagesListAdapter;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import me.letitfly.mat.R;
+import me.letitfly.mat.api.APIManager;
+import me.letitfly.mat.model.ForumDisplay;
+import me.letitfly.mat.model.ThreadView;
+import me.letitfly.mat.utils.FormatUtils;
+import me.letitfly.mat.utils.Logger;
+import me.letitfly.mat.utils.ProgressSubscriber;
+
+/**
+ * Created by Trumeet on 2017/3/15.
+ * A activity to view thread replies.
+ * @author Trumeet
+ */
+
+public class ThreadViewActivity extends AppCompatActivity {
+ private static final String TAG = ThreadViewActivity.class.getSimpleName();
+ public static final String EXTRA_TID = ThreadViewActivity.class.getSimpleName()
+ + ".EXTRA_TID";
+ @BindView(R.id.messagesList)
+ MessagesList mMessagesList;
+ private MessagesListAdapter<IMessage> mAdapter;
+ private int mTid;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ try {
+ mTid = Integer.parseInt(intent.getStringExtra(EXTRA_TID));
+ } catch (Exception e) {
+ finish();
+ return;
+ }
+ setContentView(R.layout.activity_thread_view);
+ ButterKnife.bind(this);
+ mAdapter = new MessagesListAdapter<>("0", new ImageLoader() {
+ @Override
+ public void loadImage(ImageView imageView, String url) {
+ Glide.with(ThreadViewActivity.this)
+ .load(url)
+ .placeholder(R.mipmap.ic_launcher)
+ .into(imageView);
+ }
+ });
+
+ loadThread(0);
+ }
+
+ private void loadThread (int page) {
+ ProgressSubscriber<ThreadView> subscriber = new ProgressSubscriber<>(
+ new ProgressSubscriber.SubscriberOnNextListener<ThreadView>() {
+ @Override
+ public void onNext(ThreadView threadView) {
+ convertThreadViewToIMessage(threadView);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ // TODO: Show error
+ }
+ }
+ );
+ APIManager.getThreadView(mTid, page, subscriber);
+ }
+
+ private void convertThreadViewToIMessage (ThreadView threadView) {
+ ArrayList<IMessage> list = new ArrayList<>();
+ for (final ThreadView.Post post : threadView.getPostlist()) {
+ list.add(new IMessage() {
+ @Override
+ public String getId() {
+ return post.getPid();
+ }
+
+ @Override
+ public String getText() {
+ return post.getMessage();
+ }
+
+ @Override
+ public IUser getUser() {
+ return new IUser() {
+ @Override
+ public String getId() {
+ return post.getAuthorid();
+ }
+
+ @Override
+ public String getName() {
+ return post.getAuthor();
+ }
+
+ @Override
+ public String getAvatar() {
+ return null;
+ }
+ };
+ }
+
+ @Override
+ public Date getCreatedAt() {
+ return FormatUtils.convertDateLine(post.getDateline());
+ }
+ });
+ }
+ mAdapter.addToEnd(list, true);
+ mMessagesList.setAdapter(mAdapter);
+ setTitle(threadView.getThread().getSubject());
+ }
+}
diff --git a/app/src/main/java/me/letitfly/mat/api/APIInterface.java b/app/src/main/java/me/letitfly/mat/api/APIInterface.java
index 0bf8275..2ea4a23 100644
--- a/app/src/main/java/me/letitfly/mat/api/APIInterface.java
+++ b/app/src/main/java/me/letitfly/mat/api/APIInterface.java
@@ -3,6 +3,7 @@ package me.letitfly.mat.api;
import me.letitfly.mat.api.model.HttpResult;
import me.letitfly.mat.model.ForumDisplay;
import me.letitfly.mat.model.ForumNav;
+import me.letitfly.mat.model.ThreadView;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
@@ -18,4 +19,6 @@ interface APIInterface {
Observable<HttpResult<ForumNav>> nav (@Query("page") int page);
@GET("mobile/index.php?version=4&module=forumdisplay")
Observable<HttpResult<ForumDisplay>> display (@Query("fid") int fid, @Query("page") int page);
+ @GET("mobile/index.php?version=4&module=viewthread")
+ Observable<HttpResult<ThreadView>> threadView (@Query("tid") int tid, @Query("page") int page);
}
diff --git a/app/src/main/java/me/letitfly/mat/api/APIManager.java b/app/src/main/java/me/letitfly/mat/api/APIManager.java
index 8ef51e8..6ef44f0 100644
--- a/app/src/main/java/me/letitfly/mat/api/APIManager.java
+++ b/app/src/main/java/me/letitfly/mat/api/APIManager.java
@@ -5,6 +5,7 @@ import me.letitfly.mat.api.exception.ApiException;
import me.letitfly.mat.api.model.HttpResult;
import me.letitfly.mat.model.ForumDisplay;
import me.letitfly.mat.model.ForumNav;
+import me.letitfly.mat.model.ThreadView;
import me.letitfly.mat.utils.Logger;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
@@ -59,6 +60,12 @@ public class APIManager {
.map(new HttpResultFunc<ForumNav>()), subscriber);
}
+ public static void getThreadView (int tid, int page, Subscriber<ThreadView> subscriber) {
+ Logger.i(TAG, "-> getThreadView");
+ toSubscribe(getInterface().threadView(tid, page)
+ .map(new HttpResultFunc<ThreadView>()), subscriber);
+ }
+
//添加线程管理并订阅
@SuppressWarnings("unchecked")
private static void toSubscribe(Observable o, Subscriber s){
diff --git a/app/src/main/java/me/letitfly/mat/fragments/PostListFragment.java b/app/src/main/java/me/letitfly/mat/fragments/PostListFragment.java
index dc546ee..f9a94c1 100644
--- a/app/src/main/java/me/letitfly/mat/fragments/PostListFragment.java
+++ b/app/src/main/java/me/letitfly/mat/fragments/PostListFragment.java
@@ -2,15 +2,18 @@ package me.letitfly.mat.fragments;
import android.app.Fragment;
import android.app.ListFragment;
+import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import java.util.Arrays;
import java.util.List;
+import me.letitfly.mat.activities.ThreadViewActivity;
import me.letitfly.mat.api.APIManager;
import me.letitfly.mat.model.ForumDisplay;
import me.letitfly.mat.model.ForumNav;
@@ -49,7 +52,7 @@ public class PostListFragment extends ListFragment {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- refresh(null);
+ refresh();
}
@Override
@@ -67,12 +70,7 @@ public class PostListFragment extends ListFragment {
return fragment;
}
- public interface RefreshListener {
- void finish();
- void err();
- }
-
- public synchronized void refresh (@Nullable final RefreshListener refreshListener) {
+ public synchronized void refresh () {
Logger.i(TAG, "-> refresh:" + mForum);
if (mGetListSubscriber != null)
mGetListSubscriber.unsubscribe();
@@ -81,20 +79,23 @@ public class PostListFragment extends ListFragment {
ProgressSubscriber.SubscriberOnNextListener<ForumDisplay> listener
= new ProgressSubscriber.SubscriberOnNextListener<ForumDisplay>() {
@Override
- public void onNext(ForumDisplay display) {
+ public void onNext(final ForumDisplay display) {
ForumDisplay.Thread[] threads = display.getForum_threadlist();
mThreadList = Arrays.asList(threads);
mAdapter = new ThreadListAdapter(getActivity(), mThreadList);
getListView().setAdapter(mAdapter);
- if (refreshListener != null)
- refreshListener.finish();
+ getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+ startActivity(new Intent(getActivity(), ThreadViewActivity.class)
+ .putExtra(ThreadViewActivity.EXTRA_TID, mThreadList.get(i).getTid()));
+ }
+ });
}
@Override
public void onError(Throwable e) {
// TODO: Show error
- if (refreshListener != null)
- refreshListener.err();
}
};
mGetListSubscriber = new ProgressSubscriber<>(listener);
diff --git a/app/src/main/java/me/letitfly/mat/model/ThreadView.java b/app/src/main/java/me/letitfly/mat/model/ThreadView.java
new file mode 100644
index 0000000..078639b
--- /dev/null
+++ b/app/src/main/java/me/letitfly/mat/model/ThreadView.java
@@ -0,0 +1,405 @@
+package me.letitfly.mat.model;
+
+/**
+ * Created by Trumeet on 2017/3/15.
+ * A thread
+ * @author Trumeet
+ */
+
+public class ThreadView {
+ private Thread thread;
+ private String fid;
+ private Post[] postlist;
+
+ public Thread getThread() {
+ return thread;
+ }
+
+ public String getFid() {
+ return fid;
+ }
+
+ public Post[] getPostlist() {
+ return postlist;
+ }
+
+ public static class Thread {
+ private String tid;
+ private String fid;
+ private String posttableid;
+ private String typeid;
+ private String sortid;
+ private String readperm;
+ private String price;
+ private String author;
+ private String authorid;
+ private String subject;
+ private String dateline;
+ private String lastpost;
+ private String lastposter;
+ private String views;
+ private String replies;
+ private String displayorder;
+ private String highlight;
+ private String digest;
+ private String rate;
+ private String special;
+ private String attachment;
+ private String moderated;
+ private String closed;
+ private String stickreply;
+ private String recommends;
+ private String recommend_add;
+ private String recommend_sub;
+ private String heats;
+ private String status;
+ private String isgroup;
+ private String favtimes;
+ private String sharetimes;
+ private String stamp;
+ private String icon;
+ private String pushedaid;
+ private String cover;
+ private String replycredit;
+ private String relatebytag;
+ private String maxposition;
+ private String bgcolor;
+ private String comments;
+ private String hidden;
+ private String threadtable;
+ private String threadtableid;
+ private String posttable;
+ private String addviews;
+ private String allreplies;
+ private String is_archived;
+ private String archiveid;
+ private String subjectenc;
+ private String short_subject;
+ private String recommendlevel;
+ private String heatlevel;
+ private String relay;
+ private String ordertype;
+ private String recommend;
+
+ public String getTid() {
+ return tid;
+ }
+
+ public String getFid() {
+ return fid;
+ }
+
+ public String getPosttableid() {
+ return posttableid;
+ }
+
+ public String getTypeid() {
+ return typeid;
+ }
+
+ public String getSortid() {
+ return sortid;
+ }
+
+ public String getReadperm() {
+ return readperm;
+ }
+
+ public String getPrice() {
+ return price;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public String getAuthorid() {
+ return authorid;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public String getDateline() {
+ return dateline;
+ }
+
+ public String getLastpost() {
+ return lastpost;
+ }
+
+ public String getLastposter() {
+ return lastposter;
+ }
+
+ public String getViews() {
+ return views;
+ }
+
+ public String getReplies() {
+ return replies;
+ }
+
+ public String getDisplayorder() {
+ return displayorder;
+ }
+
+ public String getHighlight() {
+ return highlight;
+ }
+
+ public String getDigest() {
+ return digest;
+ }
+
+ public String getRate() {
+ return rate;
+ }
+
+ public String getSpecial() {
+ return special;
+ }
+
+ public String getAttachment() {
+ return attachment;
+ }
+
+ public String getModerated() {
+ return moderated;
+ }
+
+ public String getClosed() {
+ return closed;
+ }
+
+ public String getStickreply() {
+ return stickreply;
+ }
+
+ public String getRecommends() {
+ return recommends;
+ }
+
+ public String getRecommend_add() {
+ return recommend_add;
+ }
+
+ public String getRecommend_sub() {
+ return recommend_sub;
+ }
+
+ public String getHeats() {
+ return heats;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getIsgroup() {
+ return isgroup;
+ }
+
+ public String getFavtimes() {
+ return favtimes;
+ }
+
+ public String getSharetimes() {
+ return sharetimes;
+ }
+
+ public String getStamp() {
+ return stamp;
+ }
+
+ public String getIcon() {
+ return icon;
+ }
+
+ public String getPushedaid() {
+ return pushedaid;
+ }
+
+ public String getCover() {
+ return cover;
+ }
+
+ public String getReplycredit() {
+ return replycredit;
+ }
+
+ public String getRelatebytag() {
+ return relatebytag;
+ }
+
+ public String getMaxposition() {
+ return maxposition;
+ }
+
+ public String getBgcolor() {
+ return bgcolor;
+ }
+
+ public String getComments() {
+ return comments;
+ }
+
+ public String getHidden() {
+ return hidden;
+ }
+
+ public String getThreadtable() {
+ return threadtable;
+ }
+
+ public String getThreadtableid() {
+ return threadtableid;
+ }
+
+ public String getPosttable() {
+ return posttable;
+ }
+
+ public String getAddviews() {
+ return addviews;
+ }
+
+ public String getAllreplies() {
+ return allreplies;
+ }
+
+ public String getIs_archived() {
+ return is_archived;
+ }
+
+ public String getArchiveid() {
+ return archiveid;
+ }
+
+ public String getSubjectenc() {
+ return subjectenc;
+ }
+
+ public String getShort_subject() {
+ return short_subject;
+ }
+
+ public String getRecommendlevel() {
+ return recommendlevel;
+ }
+
+ public String getHeatlevel() {
+ return heatlevel;
+ }
+
+ public String getRelay() {
+ return relay;
+ }
+
+ public String getOrdertype() {
+ return ordertype;
+ }
+
+ public String getRecommend() {
+ return recommend;
+ }
+ }
+ public static class Post {
+ private String pid;
+ private String tid;
+ private String first;
+ private String author;
+ private String authorid;
+ private String dateline;
+ private String message;
+ private String anonymous;
+ private String attachment;
+ private String status;
+ private String replycredit;
+ private String position;
+ private String username;
+ private String adminid;
+ private String groupid;
+ private String memberstatus;
+ private String number;
+ private String dbdateline;
+ private String groupiconid;
+
+ public String getPid() {
+ return pid;
+ }
+
+ public String getTid() {
+ return tid;
+ }
+
+ public String getFirst() {
+ return first;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public String getAuthorid() {
+ return authorid;
+ }
+
+ public String getDateline() {
+ return dateline;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getAnonymous() {
+ return anonymous;
+ }
+
+ public String getAttachment() {
+ return attachment;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getReplycredit() {
+ return replycredit;
+ }
+
+ public String getPosition() {
+ return position;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getAdminid() {
+ return adminid;
+ }
+
+ public String getGroupid() {
+ return groupid;
+ }
+
+ public String getMemberstatus() {
+ return memberstatus;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public String getDbdateline() {
+ return dbdateline;
+ }
+
+ public String getGroupiconid() {
+ return groupiconid;
+ }
+ }
+}
diff --git a/app/src/main/java/me/letitfly/mat/utils/FormatUtils.java b/app/src/main/java/me/letitfly/mat/utils/FormatUtils.java
new file mode 100644
index 0000000..b046c7f
--- /dev/null
+++ b/app/src/main/java/me/letitfly/mat/utils/FormatUtils.java
@@ -0,0 +1,79 @@
+package me.letitfly.mat.utils;
+
+import android.annotation.SuppressLint;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by Trumeet on 2017/3/16.
+ * @author Trumeet
+ */
+
+public class FormatUtils {
+ private static final String TAG = "FormatUtil";
+
+ @SuppressLint("SimpleDateFormat")
+ public static Date convertDateLine (String dateLine) {
+ // TODO: Finish it.
+ try {
+ Logger.i(TAG, "formatDate");
+ return new SimpleDateFormat("yyyy-MM-dd k:m:s")
+ .parse(dateLine);
+ } catch (ParseException e) {
+ Logger.i(TAG, "try match 7&nbsp;天前");
+ // 7&nbsp;天前
+ Matcher matcher = Pattern.compile("\\d+&nbsp;天前").matcher(dateLine);
+ if (matcher.matches()) {
+ Logger.i(TAG, "7&nbsp;天前 matches");
+ if (matcher.find()) {
+ Logger.i(TAG, "7&nbsp;天前 find");
+ int days = Integer.parseInt(dateLine.substring(matcher.start()
+ , matcher.end()));
+ return getDateBefore(new Date(), days);
+ }
+ } else {
+ Logger.i(TAG, "try match 昨天&nbsp;23:01");
+ // 昨天&nbsp;23:01
+ Matcher m1 = Pattern.compile("昨天&nbsp;\\d+:\\d+").matcher(dateLine);
+ if (m1.matches()) {
+ Logger.i(TAG, "昨天&nbsp;23:01 matches");
+ int hour = -1;
+ int time = -1;
+ while (m1.find()) {
+ if (hour == -1) {
+ hour = Integer.parseInt(dateLine.substring(m1.start()
+ , m1.end()));
+ } else if (time == -1) {
+ time = Integer.parseInt(dateLine.substring(m1.start()
+ , m1.end()));
+ } else break;
+ }
+ Logger.i(TAG, "昨天&nbsp;23:01 hour:" + hour + "time:" + time);
+ Date date = new Date();
+ date.setHours(hour);
+ date.setTime(time);
+ return getDateBefore(date, date.getDay() - 1);
+ }
+ }
+ Logger.e(TAG, "Fail to parse date!", e);
+ return new Date();
+ }
+ }
+ /**
+ * 得到几天前的时间
+ * @param d
+ * @param day
+ * @return
+ */
+ private static Date getDateBefore(Date d,int day){
+ Calendar now =Calendar.getInstance();
+ now.setTime(d);
+ now.set(Calendar.DATE,now.get(Calendar.DATE)-day);
+ return now.getTime();
+ }
+}
diff --git a/app/src/main/res/drawable/ic_send_black_24dp.xml b/app/src/main/res/drawable/ic_send_black_24dp.xml
new file mode 100644
index 0000000..e145ca8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_send_black_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
+</vector>
diff --git a/app/src/main/res/layout/activity_thread_view.xml b/app/src/main/res/layout/activity_thread_view.xml
new file mode 100644
index 0000000..8e2f990
--- /dev/null
+++ b/app/src/main/res/layout/activity_thread_view.xml
@@ -0,0 +1,33 @@
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white">
+
+ <com.stfalcon.chatkit.messages.MessagesList
+ android:id="@+id/messagesList"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/input"
+ app:incomingAvatarHeight="56dp"
+ app:incomingAvatarWidth="56dp"
+ app:outcomingTimeTextColor="@color/gray_dark_transparent"/>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_above="@+id/input"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:background="@color/gray_light"/>
+
+ <com.stfalcon.chatkit.messages.MessageInput
+ android:id="@+id/input"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ app:inputButtonIcon="@drawable/ic_send_black_24dp"
+ app:inputHint="@string/hint_enter_a_message"/>
+
+</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 45e367d..bc6c165 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,4 +3,6 @@
<color name="colorPrimary">#FAFAFA</color>
<color name="colorPrimaryDark">#F5F5F5</color>
<color name="colorAccent">#FF4081</color>
+ <color name="gray_light">#e8e8e8</color>
+ <color name="gray_dark_transparent">#ae858585</color>
</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b9dabcb..ede8cf4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,4 +8,7 @@
<!-- For Forum Switcher -->
<string name="title_forums">Forums</string>
<string name="filter_all">All</string>
+
+ <!-- Hint in reply thread -->
+ <string name="hint_enter_a_message"></string>
</resources>