1
1
package com .example .chatfull ;
2
2
3
+ import android .Manifest ;
3
4
import android .app .DownloadManager ;
4
5
import android .content .Context ;
5
6
import android .content .DialogInterface ;
6
7
import android .content .Intent ;
8
+ import android .content .SharedPreferences ;
9
+ import android .content .pm .PackageManager ;
7
10
import android .content .res .TypedArray ;
8
11
import android .database .Cursor ;
9
12
import android .graphics .Color ;
10
13
import android .net .Uri ;
14
+ import android .os .Build ;
11
15
import android .os .Bundle ;
12
16
import android .os .Environment ;
17
+ import android .os .Handler ;
13
18
import android .provider .OpenableColumns ;
14
19
import android .util .Base64 ;
15
20
import android .util .Log ;
27
32
import androidx .annotation .Nullable ;
28
33
import androidx .appcompat .app .AppCompatActivity ;
29
34
import androidx .appcompat .widget .Toolbar ;
35
+ import androidx .core .app .ActivityCompat ;
30
36
31
37
import com .bumptech .glide .Glide ;
32
38
import com .flask .colorpicker .ColorPickerView ;
33
39
import com .flask .colorpicker .OnColorSelectedListener ;
34
40
import com .flask .colorpicker .builder .ColorPickerClickListener ;
35
41
import com .flask .colorpicker .builder .ColorPickerDialogBuilder ;
42
+ import com .google .gson .Gson ;
36
43
import com .stfalcon .chatkit .commons .ImageLoader ;
37
44
import com .stfalcon .chatkit .messages .MessageHolders ;
38
45
import com .stfalcon .chatkit .messages .MessagesList ;
45
52
import java .io .InputStream ;
46
53
import java .util .ArrayList ;
47
54
import java .util .Calendar ;
55
+ import java .util .Date ;
56
+ import java .util .List ;
48
57
49
58
public class ChatActivity extends AppCompatActivity
50
59
implements MessageHolders .ContentChecker <Message >,
51
- MessagesListAdapter .OnMessageLongClickListener <Message > {
60
+ MessagesListAdapter .OnMessageLongClickListener <Message >,
61
+ MessagesListAdapter .OnLoadMoreListener {
52
62
53
63
private static final int PICK_FILE_REQUEST = 1 ;
54
64
private static final int PICK_IMAGE_REQUEST = 2 ;
55
65
private static final byte CONTENT_TYPE_FILE = 1 ;
66
+ private static final int REQUEST_WRITE_EXTERNAL_STORAGE = 200 ;
67
+ private static String PREFERENCE_FILE_KEY ;
68
+ private final static String SHARED_PREFERENCES_KEY_MESSAGE_LIST = "User_Info_List" ;
69
+ SharedPreferences sharedPref ;
70
+ SharedPreferences .Editor editor ;
71
+ Gson gson ;
56
72
57
73
private User user ;
58
74
private SendMessage sender ;
59
75
private MessageReceiveServer messageReceiveServer ;
60
76
61
77
MessagesList messagesList ;
62
78
protected final String senderId = "1" ;
79
+ private static final int TOTAL_MESSAGES_COUNT = 20 ;
80
+ private Date lastLoadedDate ;
63
81
64
82
MessagesListAdapter <Message > adapter ;
65
- int cnt = 0 ;
83
+ int cnt = 0 ; //Sets message counter id
66
84
67
85
Button btnSend ;
68
86
ImageButton btnAttachment , btnImage ;
@@ -71,12 +89,13 @@ public class ChatActivity extends AppCompatActivity
71
89
RelativeLayout back_view ;
72
90
int [] colors ;
73
91
74
- ArrayList <Message > messageArrayList ;
92
+ List <Message > messageArrayList ;
75
93
76
94
@ Override
77
95
protected void onCreate (Bundle savedInstanceState ) {
78
96
super .onCreate (savedInstanceState );
79
97
setContentView (R .layout .activity_chat_alternate );
98
+ isStoragePermissionGranted ();
80
99
81
100
user = (User ) getIntent ().getSerializableExtra ("user" );
82
101
@@ -131,6 +150,47 @@ public void loadImage(ImageView imageView, @Nullable String url, @Nullable Objec
131
150
ta .recycle ();
132
151
133
152
adapter .setOnMessageLongClickListener (this );
153
+
154
+ messageArrayList = new ArrayList <Message >();
155
+ gson = new Gson ();
156
+
157
+ PREFERENCE_FILE_KEY = user .getId ();
158
+ sharedPref = this .getSharedPreferences (
159
+ PREFERENCE_FILE_KEY , Context .MODE_PRIVATE );
160
+ editor = sharedPref .edit ();
161
+
162
+ String jsonDataString = sharedPref .getString (SHARED_PREFERENCES_KEY_MESSAGE_LIST ,"" );
163
+ if (jsonDataString .length () > 0 ) {
164
+ Message messageArray [] = gson .fromJson (jsonDataString , Message [].class );
165
+ for (Message msg : messageArray ) {
166
+ messageArrayList .add (msg );
167
+ }
168
+ adapter .addToEnd (messageArrayList ,false );
169
+ Log .e ("MESSAGE_SIZE" , messageArrayList .size () + "" );
170
+ }
171
+ }
172
+
173
+ public boolean isStoragePermissionGranted () {
174
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
175
+ if (checkSelfPermission (android .Manifest .permission .WRITE_EXTERNAL_STORAGE )
176
+ == PackageManager .PERMISSION_GRANTED ) {
177
+ return true ;
178
+ } else {
179
+ ActivityCompat .requestPermissions (this , new String []{Manifest .permission .WRITE_EXTERNAL_STORAGE }, REQUEST_WRITE_EXTERNAL_STORAGE );
180
+ return false ;
181
+ }
182
+ }
183
+ else { //permission is automatically granted on sdk<23 upon installation
184
+ return true ;
185
+ }
186
+ }
187
+
188
+ @ Override
189
+ public void onRequestPermissionsResult (int requestCode , String [] permissions , int [] grantResults ) {
190
+ super .onRequestPermissionsResult (requestCode , permissions , grantResults );
191
+ if (grantResults .length > 0 && grantResults [0 ] == PackageManager .PERMISSION_GRANTED ){
192
+ //resume tasks needing this permission
193
+ }
134
194
}
135
195
136
196
private void setClipboard (Context context , String text ) {
@@ -202,6 +262,8 @@ public void onBtnSendClick(View view) {
202
262
message .setFilename (null );
203
263
adapter .addToStart (message , true );
204
264
265
+ messageArrayList .add (message );
266
+
205
267
sender = new SendMessage (user .getIpAddress (), user .getPort (), message , this );
206
268
sender .execute ();
207
269
Log .e ("SEND" , input .getText ().toString ());
@@ -242,6 +304,9 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
242
304
message .setIsFile (true );
243
305
244
306
adapter .addToStart (message , true );
307
+
308
+ messageArrayList .add (message );
309
+
245
310
sender = new SendMessage (user .getIpAddress (), user .getPort (), message , this );
246
311
sender .execute ();
247
312
}
@@ -260,6 +325,9 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
260
325
message .setIsFile (false );
261
326
262
327
adapter .addToStart (message , true );
328
+
329
+ messageArrayList .add (message );
330
+
263
331
sender = new SendMessage (user .getIpAddress (), user .getPort (), message , this );
264
332
sender .execute ();
265
333
}
@@ -367,6 +435,9 @@ public void run() {
367
435
} else if (msg .isColor ()) {
368
436
back_view .setBackgroundColor (msg .getColor ());
369
437
}
438
+
439
+ if (!msg .isColor ())
440
+ messageArrayList .add (msg );
370
441
}
371
442
});
372
443
}
@@ -381,6 +452,15 @@ protected void onDestroy() {
381
452
super .onDestroy ();
382
453
}
383
454
455
+ @ Override
456
+ protected void onPause () {
457
+ super .onPause ();
458
+
459
+ String jsonDataString = gson .toJson (messageArrayList );
460
+ editor .putString (SHARED_PREFERENCES_KEY_MESSAGE_LIST , jsonDataString );
461
+ editor .commit ();
462
+ }
463
+
384
464
@ Override
385
465
public void onBackPressed () {
386
466
Log .e ("CHAT_ACTIVITY" , "PAUSE" );
@@ -455,4 +535,30 @@ public void onMessageLongClick(Message message) {
455
535
downloadManager .addCompletedDownload (message .getId () + message .getFilename (), message .getId () + message .getFilename (), true , "image/*" , file .getAbsolutePath (), file .length (), true );
456
536
}
457
537
}
538
+
539
+ @ Override
540
+ public void onLoadMore (int page , int totalItemsCount ) {
541
+ Log .i ("TAG" , "onLoadMore: " + page + " " + totalItemsCount );
542
+ if (totalItemsCount < TOTAL_MESSAGES_COUNT ) {
543
+ loadMessages ();
544
+ }
545
+ }
546
+
547
+ protected void loadMessages () {
548
+ new Handler ().postDelayed (new Runnable () { //imitation of internet connection
549
+ @ Override
550
+ public void run () {
551
+ Log .e ("load" ,"Ashche" );
552
+ ArrayList <Message > more_messages = new ArrayList <>();
553
+ for (int i =0 , j =0 ; i <messageArrayList .size () && j <10 ; i ++){
554
+ if (messageArrayList .get (i ).getCreatedAt ().before (lastLoadedDate )){
555
+ more_messages .add (messageArrayList .get (i ));
556
+ j ++;
557
+ }
558
+ }
559
+ lastLoadedDate = more_messages .get (more_messages .size () - 1 ).getCreatedAt ();
560
+ adapter .addToEnd (more_messages , false );
561
+ }
562
+ }, 500 );
563
+ }
458
564
}
0 commit comments