Skip to content

Commit 3cd8ef2

Browse files
committed
Improve messages
1 parent 73e1c3a commit 3cd8ef2

File tree

23 files changed

+377
-171
lines changed

23 files changed

+377
-171
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ android {
5353
applicationId "com.ammar.sharing"
5454
minSdk 21
5555
targetSdk 34
56-
versionCode 21
57-
versionName "v1.5.3"
56+
versionCode 22
57+
versionName "v1.5.4-alpha2"
5858

5959
vectorDrawables.useSupportLibrary = true
6060
externalNativeBuild {

app/src/main/java/com/ammar/sharing/activities/MainActivity/MainActivity.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,16 @@
4444
import com.ammar.sharing.R;
4545
import com.ammar.sharing.activities.ApksInstallerActivity.ApksInstallerActivity;
4646
import com.ammar.sharing.activities.ChangeLogActivity.ChangeLogActivity;
47+
import com.ammar.sharing.activities.MainActivity.adaptersR.ShareAdapter;
48+
import com.ammar.sharing.activities.MessagesActivity.adaptersR.MessageAdapter.MessagesAdapter;
4749
import com.ammar.sharing.common.Consts;
4850
import com.ammar.sharing.common.Data;
4951
import com.ammar.sharing.common.utils.Utils;
5052
import com.ammar.sharing.custom.ui.AdaptiveDropDown;
5153
import com.ammar.sharing.custom.ui.AdaptiveTextView;
5254
import com.ammar.sharing.custom.ui.RoundDialog;
55+
import com.ammar.sharing.models.Message;
56+
import com.ammar.sharing.models.User;
5357
import com.ammar.sharing.services.ServerService;
5458
import com.ammar.sharing.BuildConfig;
5559

@@ -126,7 +130,7 @@ private void prepareActivity() {
126130
settingsPref.edit()
127131
.putBoolean(Consts.PREF_FIELD_IS_DARK, true)
128132
.apply();
129-
appInfoPref.edit().putBoolean(Consts.PREF_FIELD_IS_FIRST_RUN, false).apply();;
133+
appInfoPref.edit().putBoolean(Consts.PREF_FIELD_IS_FIRST_RUN, false).apply();
130134
}
131135

132136
int lastVerCode = appInfoPref.getInt(Consts.PREF_FIELD_LAST_VERCODE, 0);
@@ -300,16 +304,32 @@ private void initStates() {
300304
startService(serviceIntent);
301305

302306
if(Intent.ACTION_SEND.equals(getIntent().getAction()) ) {
303-
Intent uriIntent = new Intent(this, ServerService.class);
304-
uriIntent.setAction(Consts.ACTION_ADD_URI_SHARABLES);
305-
ArrayList<Uri> uriArrayList = new ArrayList<>(1);
306-
Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
307-
if( uri == null ) {
308-
Toast.makeText(this, R.string.unsupported_data, Toast.LENGTH_SHORT).show();
307+
if( "text/plain".equals(getIntent().getType()) ) {
308+
String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
309+
Message message = new Message(text, "admin", false);
310+
synchronized (MessagesAdapter.messages) {
311+
MessagesAdapter.messages.add(message);
312+
// notify UI that a message was received
313+
ShareAdapter.HeaderViewHolder.unseenMessagesCount++;
314+
Data.messagesNotifier.forcePostValue(MessagesAdapter.messages.size());
315+
for( User i : User.users ){
316+
if( i.isConnectedViaWebSocket() ) {
317+
i.getWebSocket().sendText(message.toJSON());
318+
}
319+
}
320+
}
309321
} else {
310-
uriArrayList.add(uri);
311-
uriIntent.putParcelableArrayListExtra(Consts.EXTRA_URIS, uriArrayList);
312-
startService(uriIntent);
322+
Intent uriIntent = new Intent(this, ServerService.class);
323+
uriIntent.setAction(Consts.ACTION_ADD_URI_SHARABLES);
324+
ArrayList<Uri> uriArrayList = new ArrayList<>(1);
325+
Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
326+
if (uri == null) {
327+
Toast.makeText(this, R.string.unsupported_data, Toast.LENGTH_SHORT).show();
328+
} else {
329+
uriArrayList.add(uri);
330+
uriIntent.putParcelableArrayListExtra(Consts.EXTRA_URIS, uriArrayList);
331+
startService(uriIntent);
332+
}
313333
}
314334
} else if (Intent.ACTION_SEND_MULTIPLE.equals(getIntent().getAction())) {
315335
Intent uriIntent = new Intent(this, ServerService.class);

app/src/main/java/com/ammar/sharing/activities/MainActivity/adaptersR/ShareAdapter.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi
9999
((ProgressViewHolder) holder).setup(ProgressManager.progresses.get(position - 1));
100100
break;
101101
case TYPE_HEADER:
102-
102+
((HeaderViewHolder) holder).updateUnseenMessagesNum();
103103
break;
104104
}
105105
}
@@ -116,6 +116,9 @@ public static class HeaderViewHolder extends RecyclerView.ViewHolder {
116116
private final AppCompatTextView serverLinkTV;
117117
private final AdaptiveTextView QRCodeErrorText;
118118
private final ShareFragment fragment;
119+
private final TextView messagesNumTV;
120+
121+
public static int unseenMessagesCount = 0;
119122
public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
120123
super(itemView);
121124
this.fragment = fragment;
@@ -126,10 +129,10 @@ public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
126129

127130
ImageButton showSelected = itemView.findViewById(R.id.B_ShowSelected);
128131
ImageButton showUsersB = itemView.findViewById(R.id.B_ShowUsers);
129-
130132
// setup badges
131133
TextView usersNumTV = itemView.findViewById(R.id.TV_NumberUsers);
132134
TextView filesNumTV = itemView.findViewById(R.id.TV_NumberSelected);
135+
messagesNumTV = itemView.findViewById(R.id.TV_NumberMessages);
133136

134137
if (!Sharable.sharablesList.isEmpty()) {
135138
filesNumTV.setText(String.valueOf(Sharable.sharablesList.size()));
@@ -147,6 +150,11 @@ public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
147150
itemView.getContext().startActivity(intent);
148151
});
149152

153+
updateUnseenMessagesNum();
154+
Data.messagesNotifier.observe(this.fragment.getViewLifecycleOwner(), (messageCount) -> {
155+
updateUnseenMessagesNum();
156+
});
157+
150158
Resources res = itemView.getResources();
151159
// setup QR Code dialog
152160
RoundDialog QRDialogRD = new RoundDialog(itemView.getContext());
@@ -190,7 +198,7 @@ public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
190198
chosenFilesRD.show();
191199
});
192200

193-
Data.filesListNotifier.observe(this.fragment.getViewLifecycleOwner(), info -> {
201+
Data.downloadsListNotifier.observe(this.fragment.getViewLifecycleOwner(), info -> {
194202
char action = info.getChar("action");
195203
int size = Sharable.sharablesList.size();
196204
if ('R' == action) {
@@ -206,6 +214,7 @@ public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
206214
filesNumTV.setVisibility(View.VISIBLE);
207215
noFilesTV.setVisibility(View.GONE);
208216
}
217+
User.informAllUsersThat(User.INFO.AVAILABLE_DOWNLOADS_UPDATED);
209218
});
210219

211220
// setup users dialog
@@ -250,6 +259,17 @@ public HeaderViewHolder(@NonNull View itemView, ShareFragment fragment) {
250259
});
251260
}
252261

262+
263+
protected void updateUnseenMessagesNum() {
264+
if( unseenMessagesCount > 0 ) {
265+
messagesNumTV.setVisibility(View.VISIBLE);
266+
messagesNumTV.setText(String.valueOf(unseenMessagesCount));
267+
} else {
268+
messagesNumTV.setVisibility(View.GONE);
269+
messagesNumTV.setText("0");
270+
}
271+
}
272+
253273
private void setupQrCode() {
254274
String ip = ServerService.getIpAddress();
255275
MainActivity activity = (MainActivity) fragment.requireActivity();

app/src/main/java/com/ammar/sharing/activities/MessagesActivity/MessagesActivity.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import androidx.recyclerview.widget.RecyclerView;
1212

1313
import com.ammar.sharing.R;
14+
import com.ammar.sharing.activities.MainActivity.adaptersR.ShareAdapter;
1415
import com.ammar.sharing.activities.MessagesActivity.adaptersR.MessageAdapter.MessagesAdapter;
1516
import com.ammar.sharing.common.Data;
1617
import com.ammar.sharing.custom.ui.AdaptiveActivity;
@@ -34,8 +35,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
3435
}
3536

3637
private void initItems() {
38+
ShareAdapter.HeaderViewHolder.unseenMessagesCount = 0;
3739
Toolbar toolbar = findViewById(R.id.TB_Toolbar);
40+
toolbar.setNavigationIcon(R.drawable.icon_back);
3841
toolbar.setTitle(R.string.messages);
42+
toolbar.setNavigationOnClickListener((v) -> finish());
3943

4044
messagesRecyclerView = findViewById(R.id.RV_MessagesRecyclerView);
4145
messagesAdapter = new MessagesAdapter();
@@ -45,31 +49,28 @@ private void initItems() {
4549

4650
sendButton = findViewById(R.id.B_MessageSend);
4751
sendButton.setOnClickListener((v) -> {
48-
String message = messageInput.getText().toString();
52+
String messageText = messageInput.getText().toString();
53+
Message message = new Message(messageText, "admin",false);
4954
for( User i : User.users ){
5055
if( i.isConnectedViaWebSocket() ) {
51-
i.getWebSocket().sendText(message);
56+
i.getWebSocket().sendText(message.toJSON());
5257
}
5358
}
5459
synchronized (MessagesAdapter.messages) {
55-
MessagesAdapter.messages.add(new Message(message, false));
56-
boolean isLastVisible = isLastVisible();
60+
MessagesAdapter.messages.add(message);
5761
messagesAdapter.notifyItemInserted(MessagesAdapter.messages.size() - 1);
58-
if( isLastVisible ) {
59-
scrollToBottom();
60-
}
61-
messageInput.setText("");
62+
//FIXME: Scroll to bottom if user is already viewing the last message
63+
scrollToBottom();
6264
}
65+
messageInput.setText("");
6366
});
6467
}
6568

6669
private void initObservers() {
67-
Data.messagesNotifier.observe(this, (position) -> {
68-
boolean isLastVisible = isLastVisible();
69-
messagesAdapter.notifyItemInserted(position);
70-
if( isLastVisible ) {
71-
scrollToBottom();
72-
}
70+
Data.messagesNotifier.observe(this, (size) -> {
71+
messagesAdapter.notifyItemInserted(size-1);
72+
//FIXME: Scroll to bottom if user is already viewing the last message
73+
scrollToBottom();
7374
});
7475
}
7576

@@ -78,8 +79,9 @@ private void scrollToBottom() {
7879
messagesRecyclerView.smoothScrollToPosition(messagesAdapter.getItemCount()-1);
7980
}
8081

81-
boolean isLastVisible() {
82-
return true;
82+
@Override
83+
protected void onPause() {
84+
ShareAdapter.HeaderViewHolder.unseenMessagesCount = 0;
85+
super.onPause();
8386
}
84-
8587
}

app/src/main/java/com/ammar/sharing/activities/MessagesActivity/adaptersR/MessageAdapter/MessagesAdapter.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package com.ammar.sharing.activities.MessagesActivity.adaptersR.MessageAdapter;
22

3-
import android.view.View;
43
import android.view.ViewGroup;
5-
import android.widget.LinearLayout;
64

75
import androidx.annotation.NonNull;
86
import androidx.recyclerview.widget.RecyclerView;
97

108
import com.ammar.sharing.activities.MessagesActivity.adaptersR.MessageAdapter.viewHolders.MessageViewHolder;
11-
import com.ammar.sharing.custom.data.QueueMutableLiveData;
129
import com.ammar.sharing.models.Message;
1310

14-
import java.lang.ref.WeakReference;
1511
import java.util.ArrayList;
1612

1713

@@ -33,13 +29,16 @@ public int getItemViewType(int position) {
3329
@NonNull
3430
@Override
3531
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
36-
LinearLayout linearLayout = MessageViewHolder.Companion.constructNewMessageView(parent.getContext(), viewType == VIEW_TYPE_REMOTE);
37-
return new MessageViewHolder(linearLayout);
32+
return MessageViewHolder.Companion.constructNewMessageViewHolder(parent.getContext(), viewType == VIEW_TYPE_REMOTE);
3833
}
3934

4035
@Override
4136
public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) {
42-
holder.getTextView().setText(messages.get(position).getText());
37+
Message message = messages.get(position);
38+
holder.getContentTV().setText(message.getContent());
39+
if( holder.getAuthorTV() != null ) {
40+
holder.getAuthorTV().setText(message.getAuthor());
41+
}
4342
}
4443

4544
@Override

app/src/main/java/com/ammar/sharing/activities/MessagesActivity/adaptersR/MessageAdapter/viewHolders/MessageViewHolder.kt

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,33 @@ import android.content.Context
44
import android.graphics.Color
55
import android.graphics.drawable.ShapeDrawable
66
import android.graphics.drawable.shapes.RoundRectShape
7-
import android.text.TextUtils
8-
import android.util.Log
7+
import android.util.TypedValue
98
import android.view.Gravity
109
import android.view.View
1110
import android.view.ViewGroup
1211
import android.widget.FrameLayout
1312
import android.widget.LinearLayout
1413
import android.widget.TextView
1514
import androidx.core.content.res.ResourcesCompat
16-
import androidx.core.view.get
1715
import androidx.core.view.setPadding
1816
import androidx.recyclerview.widget.RecyclerView
1917
import com.ammar.sharing.R
2018
import com.ammar.sharing.common.utils.Utils
21-
import java.util.Locale
2219

23-
class MessageViewHolder(itemView: LinearLayout) : RecyclerView.ViewHolder(itemView) {
24-
val textView = itemView[0] as TextView
20+
class MessageViewHolder private constructor(itemView: LinearLayout) : RecyclerView.ViewHolder(itemView) {
21+
lateinit var contentTV: TextView
22+
var authorTV: TextView? = null
23+
2524
companion object {
26-
fun constructNewMessageView(context: Context, isRemote: Boolean): LinearLayout {
25+
fun constructNewMessageViewHolder(context: Context, isRemote: Boolean): MessageViewHolder {
2726

2827
val cornerRadius = Utils.dpToPx(12F)
29-
val messageView = TextView(context).apply {
28+
val messageContainer = LinearLayout(context).apply {
29+
orientation = LinearLayout.VERTICAL
3030
val padding = Utils.dpToPx(8f).toInt()
3131
setPadding(padding)
32-
if(isRemote) {
33-
setTextColor(ResourcesCompat.getColor(context.resources, R.color.text_color_dark, null))
34-
} else {
35-
setTextColor(ResourcesCompat.getColor(context.resources, R.color.text_color_light, null))
36-
}
3732
}
33+
3834
// setup corners
3935
val config = context.resources.configuration;
4036
val layoutDirection = config.layoutDirection;
@@ -76,8 +72,8 @@ class MessageViewHolder(itemView: LinearLayout) : RecyclerView.ViewHolder(itemVi
7672
val shape = RoundRectShape(radiuses, null, null)
7773
val shapeDrawable = ShapeDrawable(shape)
7874
shapeDrawable.paint.color = if(isRemote) Color.rgb(235, 235, 235) else ResourcesCompat.getColor(context.resources, R.color.colorSecondary, null)
79-
messageView.background = shapeDrawable
80-
messageView.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT).apply {
75+
messageContainer.background = shapeDrawable
76+
messageContainer.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT).apply {
8177
if( isRemote ) {
8278
marginEnd = Utils.dpToPx(18f).toInt()
8379
marginStart = Utils.dpToPx(4f).toInt()
@@ -87,15 +83,39 @@ class MessageViewHolder(itemView: LinearLayout) : RecyclerView.ViewHolder(itemVi
8783
}
8884
}
8985

86+
val messageContentTV = TextView(context).apply {
87+
if(isRemote) {
88+
setTextColor(ResourcesCompat.getColor(context.resources, R.color.text_color_dark, null))
89+
} else {
90+
setTextColor(ResourcesCompat.getColor(context.resources, R.color.text_color_light, null))
91+
}
92+
setTextIsSelectable(true)
93+
}
94+
95+
messageContainer.addView(messageContentTV);
96+
97+
9098
val linearLayout = LinearLayout(context).apply {
9199
layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply {
92100
bottomMargin = Utils.dpToPx(8f).toInt()
93101
}
94102
gravity = if( isRemote ) Gravity.END else Gravity.START
95-
addView(messageView)
103+
addView(messageContainer)
96104
}
97105

98-
return linearLayout;
106+
return MessageViewHolder(linearLayout).apply {
107+
contentTV = messageContentTV
108+
// specify author
109+
if( isRemote ) {
110+
val messageAuthorTV = TextView(context).apply {
111+
setTextSize(TypedValue.COMPLEX_UNIT_SP, 11f)
112+
setTextColor(0x77111111)
113+
gravity = Gravity.START
114+
}
115+
messageContainer.addView(messageAuthorTV)
116+
authorTV = messageAuthorTV
117+
}
118+
};
99119
}
100120
}
101121
}

app/src/main/java/com/ammar/sharing/common/Data.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
import androidx.lifecycle.MutableLiveData;
66

77
import com.ammar.sharing.custom.data.QueueMutableLiveData;
8-
import com.ammar.sharing.models.Message;
98

109
public class Data {
1110
// observers
1211
public static final MutableLiveData<Boolean> serverStatusObserver = new MutableLiveData<>();
13-
public static final QueueMutableLiveData<Bundle> filesListNotifier = new QueueMutableLiveData<>();
12+
public static final QueueMutableLiveData<Bundle> downloadsListNotifier = new QueueMutableLiveData<>();
1413
public static final QueueMutableLiveData<Bundle> filesSendNotifier = new QueueMutableLiveData<>();
1514
public static final QueueMutableLiveData<Bundle> usersListObserver = new QueueMutableLiveData<>();
1615
public static final MutableLiveData<Bundle> alertNotifier = new MutableLiveData<>();

0 commit comments

Comments
 (0)