· 6 years ago · Jan 05, 2020, 09:28 AM
1/////////////// Java Files ///////////////////////////////
2//----------------- Defaults.java ---------------------------
3
4package com.sgl.recyclerviewassignment;
5
6public class Defaults {
7
8 static final String APPLICATION_ID = "Enter your own backendless application id";
9 static final String API_KEY = "Enter your own backendless api key";
10}
11
12//------------------------------ MainActivity.java -------------------------------
13
14package com.sgl.recyclerviewassignment;
15
16import androidx.appcompat.app.AppCompatActivity;
17
18import android.content.Context;
19import android.content.Intent;
20import android.os.Bundle;
21import android.view.View;
22
23import com.backendless.Backendless;
24
25public class MainActivity extends AppCompatActivity {
26
27 Context context;
28
29 @Override
30 protected void onCreate(Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.activity_main);
33 setPointer();
34 }
35
36 private void setPointer() {
37 this.context = this;
38 Backendless.initApp(context, Defaults.APPLICATION_ID, Defaults.API_KEY);
39 findViewById(R.id.btnWPLogin).setOnClickListener(new View.OnClickListener() {
40 @Override
41 public void onClick(View v) {
42 startActivity(new Intent(context, LoginActivity.class));
43 }
44 });
45 findViewById(R.id.btnWPRegister).setOnClickListener(new View.OnClickListener() {
46 @Override
47 public void onClick(View v) {
48 startActivity(new Intent(context, RegisterActivity.class));
49 }
50 });
51 }
52}
53
54//-------------------- grooms.java (generated from backendless code generator) -------------------
55
56package com.sgl.recyclerviewassignment;
57
58import com.backendless.Backendless;
59import com.backendless.BackendlessUser;
60import com.backendless.async.callback.AsyncCallback;
61import com.backendless.persistence.*;
62import com.backendless.geo.GeoPoint;
63
64import java.util.List;
65import java.util.Date;
66
67public class grooms
68{
69 private String objectId;
70 private Boolean isConnected;
71 private String ownerId;
72 private Date created;
73 private Date updated;
74 private String name;
75 private Integer age;
76 private String image;
77 public String getObjectId()
78 {
79 return objectId;
80 }
81
82 public Boolean getIsConnected()
83 {
84 return isConnected;
85 }
86
87 public void setIsConnected( Boolean isConnected )
88 {
89 this.isConnected = isConnected;
90 }
91
92 public String getOwnerId()
93 {
94 return ownerId;
95 }
96
97 public Date getCreated()
98 {
99 return created;
100 }
101
102 public Date getUpdated()
103 {
104 return updated;
105 }
106
107 public String getName()
108 {
109 return name;
110 }
111
112 public void setName( String name )
113 {
114 this.name = name;
115 }
116
117 public Integer getAge()
118 {
119 return age;
120 }
121
122 public void setAge( Integer age )
123 {
124 this.age = age;
125 }
126
127 public String getImage()
128 {
129 return image;
130 }
131
132 public void setImage( String image )
133 {
134 this.image = image;
135 }
136
137
138 public grooms save()
139 {
140 return Backendless.Data.of( grooms.class ).save( this );
141 }
142
143 public void saveAsync( AsyncCallback<grooms> callback )
144 {
145 Backendless.Data.of( grooms.class ).save( this, callback );
146 }
147
148 public Long remove()
149 {
150 return Backendless.Data.of( grooms.class ).remove( this );
151 }
152
153 public void removeAsync( AsyncCallback<Long> callback )
154 {
155 Backendless.Data.of( grooms.class ).remove( this, callback );
156 }
157
158 public static grooms findById( String id )
159 {
160 return Backendless.Data.of( grooms.class ).findById( id );
161 }
162
163 public static void findByIdAsync( String id, AsyncCallback<grooms> callback )
164 {
165 Backendless.Data.of( grooms.class ).findById( id, callback );
166 }
167
168 public static grooms findFirst()
169 {
170 return Backendless.Data.of( grooms.class ).findFirst();
171 }
172
173 public static void findFirstAsync( AsyncCallback<grooms> callback )
174 {
175 Backendless.Data.of( grooms.class ).findFirst( callback );
176 }
177
178 public static grooms findLast()
179 {
180 return Backendless.Data.of( grooms.class ).findLast();
181 }
182
183 public static void findLastAsync( AsyncCallback<grooms> callback )
184 {
185 Backendless.Data.of( grooms.class ).findLast( callback );
186 }
187
188 public static List<grooms> find( DataQueryBuilder queryBuilder )
189 {
190 return Backendless.Data.of( grooms.class ).find( queryBuilder );
191 }
192
193 public static void findAsync( DataQueryBuilder queryBuilder, AsyncCallback<List<grooms>> callback )
194 {
195 Backendless.Data.of( grooms.class ).find( queryBuilder, callback );
196 }
197}
198
199//------------------------- LoginActivity.java -------------------------------------
200
201package com.sgl.recyclerviewassignment;
202
203import androidx.appcompat.app.AppCompatActivity;
204
205import android.content.Context;
206import android.content.Intent;
207import android.os.Bundle;
208import android.os.Environment;
209import android.util.Log;
210import android.view.View;
211import android.widget.EditText;
212import android.widget.Toast;
213
214import com.backendless.Backendless;
215import com.backendless.BackendlessUser;
216import com.backendless.async.callback.AsyncCallback;
217import com.backendless.exceptions.BackendlessFault;
218
219import java.io.File;
220
221public class LoginActivity extends AppCompatActivity {
222
223 Context context;
224 String imageFileName, firstName;
225
226 @Override
227 protected void onCreate(Bundle savedInstanceState) {
228 super.onCreate(savedInstanceState);
229 setContentView(R.layout.activity_login);
230 setPointer();
231 }
232
233 private void setPointer() {
234 this.context = this;
235 imageFileName = Environment.getExternalStorageDirectory() + File.separator + "myPic.jpg";
236 findViewById(R.id.btnLogin).setOnClickListener(new View.OnClickListener() {
237 @Override
238 public void onClick(View v) {
239 final String uEmail = ((EditText)findViewById(R.id.inputLoginEmail)).getText().toString();
240 final String uPass = ((EditText)findViewById(R.id.inputLoginPassword)).getText().toString();
241 Backendless.UserService.login(uEmail, uPass, new AsyncCallback<BackendlessUser>() {
242 @Override
243 public void handleResponse(BackendlessUser response) {
244 Intent intent = new Intent(context, GroomsActivity.class);
245 intent.putExtra("name", response.getProperty("firstName").toString());
246 intent.putExtra("imageFileName", imageFileName);
247 startActivity(intent);
248 }
249
250 @Override
251 public void handleFault(BackendlessFault fault) {
252 Log.e("Login Error", "handleFault: " + fault.getMessage());
253 Toast.makeText(context, "Invalid email or password! Try again.", Toast.LENGTH_LONG).show();
254 }
255 });
256 }
257 });
258 }
259}
260
261//---------------------------- RegisterActivity.java -------------------------------------
262
263package com.sgl.recyclerviewassignment;
264
265import androidx.annotation.NonNull;
266import androidx.annotation.Nullable;
267import androidx.appcompat.app.AppCompatActivity;
268import androidx.core.app.ActivityCompat;
269import androidx.core.content.ContextCompat;
270
271import android.Manifest;
272import android.content.Context;
273import android.content.Intent;
274import android.content.pm.PackageManager;
275import android.graphics.Bitmap;
276import android.graphics.BitmapFactory;
277import android.net.Uri;
278import android.os.Bundle;
279import android.os.Environment;
280import android.os.StrictMode;
281import android.provider.MediaStore;
282import android.util.Log;
283import android.view.View;
284import android.widget.EditText;
285import android.widget.ImageView;
286import android.widget.Toast;
287
288import com.backendless.Backendless;
289import com.backendless.BackendlessUser;
290import com.backendless.async.callback.AsyncCallback;
291import com.backendless.exceptions.BackendlessFault;
292import com.backendless.files.BackendlessFile;
293
294import java.io.File;
295import java.util.ArrayList;
296import java.util.HashMap;
297import java.util.List;
298import java.util.UUID;
299
300public class RegisterActivity extends AppCompatActivity {
301
302 Context context;
303 BackendlessUser newUser;
304 // Permission id
305 private static final int CAMERA_PERMISSION = 100;
306 private boolean cameraEnabled = false;
307 // Camera
308 String imageFileName, fileRef;
309 private static final int CAMERA_ACTIVITY = 200;
310
311 // New user data
312 String firstName, lastName, email, password;
313 int age;
314
315 @Override
316 protected void onCreate(Bundle savedInstanceState) {
317 super.onCreate(savedInstanceState);
318 setContentView(R.layout.activity_register);
319 setPointer();
320 }
321
322 private void setPointer() {
323 this.context = this;
324 imageFileName = "";
325 checkUserPermissions();
326 findViewById(R.id.btnReg).setOnClickListener(new View.OnClickListener() {
327 @Override
328 public void onClick(View v) {
329 if(validateNewUserParameters()) {
330 Bitmap myImage = BitmapFactory.decodeFile(imageFileName);
331 fileRef = UUID.randomUUID().toString() + ".jpg";
332 Backendless.Files.Android.upload(myImage, Bitmap.CompressFormat.JPEG, 100,
333 fileRef, "brides", new AsyncCallback<BackendlessFile>() {
334 @Override
335 public void handleResponse(BackendlessFile response) {
336 buildNewUserObject();
337 registerNewUser();
338 }
339
340 @Override
341 public void handleFault(BackendlessFault fault) {
342 Log.e("IMAGE Capture Error", "handleFault: " + fault.getMessage());
343 Toast.makeText(context, "Failed to load the picture!", Toast.LENGTH_LONG).show();
344 }
345 });
346 } else {
347 Toast.makeText(context, "Missing or invalid user parameters!", Toast.LENGTH_LONG).show();
348 }
349 }
350 });
351 findViewById(R.id.cameraLogo).setOnClickListener(new View.OnClickListener() {
352 @Override
353 public void onClick(View v) {
354 if(!cameraEnabled) {
355 Toast.makeText(context, "Missing camera permission", Toast.LENGTH_LONG).show();
356 return;
357 }
358 // Avoid API26 policy restrictions
359 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
360 StrictMode.setVmPolicy(builder.build());
361 // Call Android image capture
362 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
363 // Set a pointer to the camera file name (path to file)
364 imageFileName = Environment.getExternalStorageDirectory() + File.separator + "myPic.jpg";
365 Log.i("FILE LOCATION", "onClick: " + imageFileName);
366 File file = new File(imageFileName);
367 // Set a pointer to the file location
368 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
369 // Start the camera activity and wait for results (when activity is done)
370 try {
371 startActivityForResult(intent, CAMERA_ACTIVITY);
372 } catch(Exception e) {
373 Log.e("CAMERA ERROR", "onClick: " + e.getMessage());
374 }
375 }
376 });
377 }
378
379 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
380 super.onActivityResult(requestCode, resultCode, data);
381 switch(requestCode) {
382 case CAMERA_ACTIVITY:
383 // Convert the image file to a bitmap object
384 final File file = new File(imageFileName);
385 Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
386 ((ImageView)findViewById(R.id.imageCamera)).setImageBitmap(bitmap);
387 break;
388
389 }
390 }
391
392 // Check the user permissions and request permissions if any permission is missing
393 private void checkUserPermissions() {
394 List<String> missingPermissions = new ArrayList<>();
395 int cameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
396 int readExternalStorePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
397 int writeExternalStorePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
398
399 if(cameraPermission != PackageManager.PERMISSION_GRANTED) {
400 missingPermissions.add(Manifest.permission.CAMERA);
401 } else {
402 cameraEnabled = true;
403 }
404 if(readExternalStorePermission != PackageManager.PERMISSION_GRANTED) {
405 missingPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
406 }
407 if(writeExternalStorePermission != PackageManager.PERMISSION_GRANTED) {
408 missingPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
409 }
410 if(!missingPermissions.isEmpty()) {
411 // Ask for permission
412 ActivityCompat.requestPermissions(this, missingPermissions.toArray(new String[missingPermissions.size()]), CAMERA_PERMISSION);
413 }
414 }
415
416 @Override
417 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
418 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
419 switch (requestCode) {
420 case CAMERA_PERMISSION:
421 cameraEnabled = grantResults[0] == PackageManager.PERMISSION_GRANTED;
422 break;
423 }
424 }
425
426 private boolean validateNewUserParameters() {
427 firstName = ((EditText)findViewById(R.id.inputRegFirstName)).getText().toString();
428 lastName = ((EditText)findViewById(R.id.inputRegLastName)).getText().toString();
429 email = ((EditText)findViewById(R.id.inputRegEmail)).getText().toString();
430 password = ((EditText)findViewById(R.id.inputRegPassword)).getText().toString();
431 age = Integer.parseInt(((EditText)findViewById(R.id.inputRegAge)).getText().toString());
432 if(firstName.length() < 2 || lastName.length() < 2) {
433 Toast.makeText(context, "first or last name are too short!", Toast.LENGTH_SHORT).show();
434 return false;
435 }
436 if(age < 18 || age > 90) {
437 if(age < 18) {
438 Toast.makeText(context, "this is an adults app!", Toast.LENGTH_SHORT).show();
439 } else {
440 Toast.makeText(context, "You're too late old man!", Toast.LENGTH_SHORT).show();
441 }
442 return false;
443 }
444 if(password.length() < 5) {
445 Toast.makeText(context, "Password is not strong enough!", Toast.LENGTH_SHORT).show();
446 return false;
447 }
448 if(!validateEmail()) {
449 Toast.makeText(context, "Incorrect email format!", Toast.LENGTH_SHORT).show();
450 return false;
451 }
452 return true;
453 }
454
455 private boolean validateEmail() {
456 String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
457 return email.matches(emailPattern);
458 }
459
460
461
462 private void registerNewUser() {
463 Backendless.UserService.register(newUser, new AsyncCallback<BackendlessUser>() {
464 @Override
465 public void handleResponse(BackendlessUser response) {
466 Intent intent = new Intent(context, GroomsActivity.class);
467 intent.putExtra("name", firstName);
468 intent.putExtra("imageFileName", imageFileName);
469 startActivity(intent);
470 }
471
472 @Override
473 public void handleFault(BackendlessFault fault) {
474 Log.e("Register Error", "handleFault: " + fault.getMessage());
475 Toast.makeText(context, "Failed to register new user.", Toast.LENGTH_LONG).show();
476 }
477 });
478 }
479
480 private void buildNewUserObject() {
481 newUser = new BackendlessUser();
482 final HashMap<String, Object> props = new HashMap<>();
483 props.put("firstName", firstName);
484 props.put("lastName", lastName);
485 props.put("age", age);
486 props.put("email", email);
487 props.put("password", password);
488 props.put("image", fileRef);
489 newUser.setProperties(props);
490 }
491}
492
493//----------------------------- GroomsAdapter.java ---------------------------------
494
495package com.sgl.recyclerviewassignment;
496
497import android.graphics.Color;
498import android.view.LayoutInflater;
499import android.view.View;
500import android.view.ViewGroup;
501import android.widget.ImageView;
502import android.widget.ProgressBar;
503import android.widget.TextView;
504
505import androidx.annotation.NonNull;
506import androidx.cardview.widget.CardView;
507import androidx.recyclerview.widget.RecyclerView;
508
509import java.util.List;
510
511public class GroomsAdapter extends RecyclerView.Adapter<GroomsAdapter.ViewHolder> {
512
513 public class ViewHolder extends RecyclerView.ViewHolder {
514
515 CardView userStatus;
516 ImageView userImage;
517 TextView userName;
518 TextView userAge;
519
520 public ViewHolder(@NonNull View itemView) {
521 super(itemView);
522 userStatus = itemView.findViewById(R.id.uStatus);
523 userName = itemView.findViewById(R.id.uName);
524 userAge = itemView.findViewById(R.id.uAge);
525 userImage = itemView.findViewById(R.id.uImage);
526 }
527 }
528
529 private List<grooms> groomsList;
530
531 public GroomsAdapter(List<grooms> groomList) {
532
533 this.groomsList = groomList;
534 }
535
536 @NonNull
537 @Override
538 public GroomsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
539 View groomsView = LayoutInflater.from(parent.getContext()).inflate(R.layout.groom_item, parent, false);
540 return new GroomsAdapter.ViewHolder(groomsView); // Returning the groom item view to the holder class
541 }
542
543 @Override
544 public void onBindViewHolder(@NonNull final GroomsAdapter.ViewHolder holder, int position) {
545 grooms groom = groomsList.get(position);
546 holder.userName.setText(String.valueOf(groom.getName()));
547 holder.userAge.setText(String.valueOf(groom.getAge()));
548 holder.userStatus.setCardBackgroundColor(groom.getIsConnected() ? Color.GREEN : Color.RED);
549 holder.userStatus.setEnabled(groom.getIsConnected());
550
551 holder.userImage.setImageResource(R.drawable.groom1);
552 }
553
554 @Override
555 public int getItemCount() {
556 return groomsList.size();
557 }
558}
559
560//--------------------- GroomsActivity.java ---------------------------------------
561
562package com.sgl.recyclerviewassignment;
563
564import androidx.appcompat.app.AppCompatActivity;
565import androidx.recyclerview.widget.RecyclerView;
566import androidx.recyclerview.widget.StaggeredGridLayoutManager;
567
568import android.content.Context;
569import android.content.Intent;
570import android.graphics.Bitmap;
571import android.graphics.BitmapFactory;
572import android.os.Bundle;
573import android.util.Log;
574import android.view.View;
575import android.widget.ImageView;
576import android.widget.ProgressBar;
577import android.widget.TextView;
578import android.widget.Toast;
579
580import com.backendless.Backendless;
581import com.backendless.BackendlessUser;
582import com.backendless.async.callback.AsyncCallback;
583import com.backendless.exceptions.BackendlessFault;
584import com.backendless.files.FileInfo;
585
586import java.io.File;
587import java.util.ArrayList;
588import java.util.List;
589
590public class GroomsActivity extends AppCompatActivity {
591
592 RecyclerView mRecyclerView;
593 StaggeredGridLayoutManager layoutManager;
594 TextView title;
595 String imagePath, uName;
596 Context context;
597
598 @Override
599 protected void onCreate(Bundle savedInstanceState) {
600 super.onCreate(savedInstanceState);
601 setContentView(R.layout.activity_grooms);
602 setPointer();
603 }
604
605 private void setPointer() {
606 this.context = this;
607 findViewById(R.id.btnLogout).setOnClickListener(new View.OnClickListener() {
608 @Override
609 public void onClick(View v) {
610 Backendless.UserService.logout(new AsyncCallback<Void>() {
611 @Override
612 public void handleResponse(Void response) {
613 startActivity(new Intent(context, MainActivity.class));
614 }
615
616 @Override
617 public void handleFault(BackendlessFault fault) {
618 Log.e("LOGOUT", "handleFault: " + fault.getMessage());
619 }
620 });
621
622 }
623 });
624
625 Bundle extras = getIntent().getExtras();
626 if(extras != null) {
627 imagePath = extras.getString("imageFileName");
628 uName = extras.getString("name");
629 }
630 title = findViewById(R.id.groomsPageTitle);
631 mRecyclerView = findViewById(R.id.recycler_view);
632 layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
633 mRecyclerView.setLayoutManager(layoutManager);
634
635 title.setText(title.getText().toString() + " " + uName);
636
637 final File file = new File(imagePath);
638 Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
639 ((ImageView)findViewById(R.id.bride)).setImageBitmap(bitmap);
640
641 Backendless.Data.of(grooms.class).find(new AsyncCallback<List<grooms>>() {
642 @Override
643 public void handleResponse(List<grooms> response) {
644
645 GroomsAdapter myAdapter = new GroomsAdapter(response);
646 mRecyclerView.setAdapter(myAdapter);
647
648 }
649
650 @Override
651 public void handleFault(BackendlessFault fault) {
652 Log.e("GROOMS DATA ERROR", "handleFault: " + fault.getMessage());
653 }
654 });
655 }
656}
657
658/////////////////////////////// Layout files //////////////////////////////////
659//----------------------------- activity_main.xml ----------------------------------
660
661<?xml version="1.0" encoding="utf-8"?>
662<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
663 xmlns:app="http://schemas.android.com/apk/res-auto"
664 xmlns:tools="http://schemas.android.com/tools"
665 android:layout_width="match_parent"
666 android:layout_height="match_parent"
667 android:background="@drawable/ic_launcher_foreground"
668 tools:context=".MainActivity">
669
670 <LinearLayout
671 android:layout_width="match_parent"
672 android:layout_height="match_parent"
673 android:gravity="center"
674 android:layout_marginStart="30dp"
675 android:layout_marginEnd="30dp"
676 android:layout_marginTop="100dp"
677 android:layout_marginBottom="100dp"
678 android:orientation="vertical">
679
680 <TextView
681 android:id="@+id/txtWelcomeTitle"
682 android:layout_width="match_parent"
683 android:layout_height="match_parent"
684 android:layout_weight="1"
685 android:gravity="center"
686 android:textColor="@color/colorPrimaryDark"
687 android:text="@string/grooms_app"
688 android:textSize="48sp" />
689
690 <TextView
691 android:id="@+id/txtWelcomeSubtitle"
692 android:layout_width="match_parent"
693 android:layout_height="match_parent"
694 android:layout_weight="1"
695 android:gravity="center_horizontal"
696 android:textColor="@color/colorPrimary"
697 android:text="@string/welcome_sub_title"
698 android:textSize="36sp" />
699
700 <LinearLayout
701 android:layout_width="match_parent"
702 android:layout_height="match_parent"
703 android:layout_weight="1"
704 android:gravity="center"
705 android:orientation="horizontal">
706
707 <Button
708 android:id="@+id/btnWPLogin"
709 style="@style/Widget.AppCompat.Button.Colored"
710 android:layout_width="match_parent"
711 android:layout_height="wrap_content"
712 android:layout_weight="1"
713 android:textSize="20sp"
714 android:text="@string/wp_btn_login" />
715
716 <Button
717 android:id="@+id/btnWPRegister"
718 style="@style/Widget.AppCompat.Button.Colored"
719 android:layout_width="match_parent"
720 android:layout_height="wrap_content"
721 android:layout_weight="1"
722 android:textSize="20sp"
723 android:text="@string/wp_btn_register" />
724 </LinearLayout>
725 </LinearLayout>
726</androidx.constraintlayout.widget.ConstraintLayout>
727
728//----------------------------- activity_login.xml ----------------------------------
729
730<?xml version="1.0" encoding="utf-8"?>
731<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
732 xmlns:app="http://schemas.android.com/apk/res-auto"
733 xmlns:tools="http://schemas.android.com/tools"
734 android:layout_width="match_parent"
735 android:layout_height="match_parent"
736 tools:context=".LoginActivity">
737
738 <LinearLayout
739 android:layout_width="match_parent"
740 android:layout_height="match_parent"
741 android:layout_marginStart="30dp"
742 android:layout_marginEnd="30dp"
743 android:orientation="vertical">
744
745 <TextView
746 android:id="@+id/txt_login_title"
747 android:layout_width="match_parent"
748 android:layout_height="match_parent"
749 android:layout_weight="2"
750 android:gravity="center"
751 android:textColor="@color/colorPrimary"
752 android:text="@string/txt_login_title"
753 android:textSize="48sp" />
754
755 <TableLayout
756 android:layout_width="match_parent"
757 android:layout_height="match_parent"
758 android:gravity="center"
759 android:layout_weight="2">
760
761 <TableRow
762 android:layout_width="match_parent"
763 android:layout_height="match_parent"
764 android:gravity="center"
765 android:layout_marginBottom="50dp">
766
767 <TextView
768 android:id="@+id/txtLoginEmail"
769 android:layout_width="wrap_content"
770 android:layout_height="wrap_content"
771 android:layout_marginEnd="10dp"
772 android:text="@string/txtLoginEmail"
773 android:textColor="@color/colorPrimaryDark"
774 android:textSize="20sp" />
775
776 <EditText
777 android:id="@+id/inputLoginEmail"
778 android:layout_width="wrap_content"
779 android:layout_height="wrap_content"
780 android:autofillHints=""
781 android:ems="10"
782 android:inputType="textWebEmailAddress"
783 android:labelFor="@id/inputLoginEmail"
784 android:textColor="@color/colorPrimaryDark"
785 android:textSize="20sp" />
786 </TableRow>
787
788 <TableRow
789 android:layout_width="match_parent"
790 android:layout_height="match_parent"
791 android:gravity="top">
792
793 <TextView
794 android:id="@+id/txtLoginPassword"
795 android:layout_width="wrap_content"
796 android:layout_height="wrap_content"
797 android:layout_marginEnd="10dp"
798 android:text="@string/txtLoginPassword"
799 android:textColor="@color/colorPrimaryDark"
800 android:textSize="20sp" />
801
802 <EditText
803 android:id="@+id/inputLoginPassword"
804 android:layout_width="wrap_content"
805 android:layout_height="wrap_content"
806 android:autofillHints=""
807 android:ems="10"
808 android:inputType="textPassword"
809 android:labelFor="@id/inputLoginPassword"
810 android:textColor="@color/colorPrimaryDark"
811 android:textSize="20sp" />
812 </TableRow>
813
814 </TableLayout>
815 <Button
816 android:id="@+id/btnLogin"
817 style="@style/Widget.AppCompat.Button.Colored"
818 android:layout_width="match_parent"
819 android:layout_height="wrap_content"
820 android:layout_marginBottom="150dp"
821 android:text="@string/btnLogin" />
822 </LinearLayout>
823</androidx.constraintlayout.widget.ConstraintLayout>
824
825//----------------------- activity_register.xml ---------------------------------
826
827<?xml version="1.0" encoding="utf-8"?>
828<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
829 xmlns:app="http://schemas.android.com/apk/res-auto"
830 xmlns:tools="http://schemas.android.com/tools"
831 android:layout_width="match_parent"
832 android:layout_height="match_parent"
833 tools:context=".RegisterActivity">
834
835 <LinearLayout
836 android:layout_width="match_parent"
837 android:layout_height="match_parent"
838 android:layout_marginStart="30dp"
839 android:layout_marginEnd="30dp"
840 android:orientation="vertical">
841
842 <TextView
843 android:id="@+id/txt_login_title"
844 android:layout_width="match_parent"
845 android:layout_height="match_parent"
846 android:layout_weight="13"
847 android:gravity="center"
848 android:text="@string/txt_reg_title"
849 android:textColor="#8147a2"
850 android:textSize="36sp" />
851
852 <TableLayout
853 android:layout_width="match_parent"
854 android:layout_height="match_parent"
855 android:layout_weight="6"
856 android:gravity="top">
857
858 <TableRow
859 android:layout_width="match_parent"
860 android:layout_height="match_parent"
861 android:layout_marginBottom="10dp"
862 android:gravity="center">
863
864 <TextView
865 android:id="@+id/txtRegFirstName"
866 android:layout_width="wrap_content"
867 android:layout_height="wrap_content"
868 android:layout_marginEnd="10dp"
869 android:text="@string/txtRegFirstName"
870 android:textColor="#8147ed"
871 android:textSize="16sp" />
872
873 <EditText
874 android:id="@+id/inputRegFirstName"
875 android:layout_width="wrap_content"
876 android:layout_height="wrap_content"
877 android:autofillHints=""
878 android:ems="10"
879 android:inputType="textPersonName"
880 android:labelFor="@id/inputRegFirstName"
881 android:textColor="#8147ed"
882 android:textSize="16sp" />
883 </TableRow>
884
885 <TableRow
886 android:layout_width="match_parent"
887 android:layout_height="match_parent"
888 android:layout_marginBottom="10dp"
889 android:gravity="center">
890
891 <TextView
892 android:id="@+id/txtRegLastName"
893 android:layout_width="wrap_content"
894 android:layout_height="wrap_content"
895 android:layout_marginEnd="10dp"
896 android:text="@string/txtRegLastName"
897 android:textColor="#8147ed"
898 android:textSize="16sp" />
899
900 <EditText
901 android:id="@+id/inputRegLastName"
902 android:layout_width="wrap_content"
903 android:layout_height="wrap_content"
904 android:autofillHints=""
905 android:ems="10"
906 android:inputType="textPersonName"
907 android:labelFor="@id/inputRegLastName"
908 android:textColor="#8147ed"
909 android:textSize="16sp" />
910 </TableRow>
911
912 <TableRow
913 android:layout_width="match_parent"
914 android:layout_height="match_parent"
915 android:layout_marginBottom="10dp"
916 android:gravity="center">
917
918 <TextView
919 android:id="@+id/txtRegAge"
920 android:layout_width="wrap_content"
921 android:layout_height="wrap_content"
922 android:layout_marginEnd="10dp"
923 android:text="@string/txtRegAge"
924 android:textColor="#8147ed"
925 android:textSize="16sp" />
926
927 <EditText
928 android:id="@+id/inputRegAge"
929 android:layout_width="wrap_content"
930 android:layout_height="wrap_content"
931 android:autofillHints=""
932 android:ems="10"
933 android:inputType="number"
934 android:labelFor="@id/inputRegAge"
935 android:textColor="#8147ed"
936 android:textSize="16sp" />
937 </TableRow>
938
939 <TableRow
940 android:layout_width="match_parent"
941 android:layout_height="match_parent"
942 android:layout_marginBottom="10dp"
943 android:gravity="center">
944
945 <TextView
946 android:id="@+id/txtRegEmail"
947 android:layout_width="wrap_content"
948 android:layout_height="wrap_content"
949 android:layout_marginEnd="10dp"
950 android:text="@string/txtRegEmail"
951 android:textColor="#8147ed"
952 android:textSize="16sp" />
953
954 <EditText
955 android:id="@+id/inputRegEmail"
956 android:layout_width="wrap_content"
957 android:layout_height="wrap_content"
958 android:autofillHints=""
959 android:ems="10"
960 android:inputType="textEmailAddress"
961 android:labelFor="@id/inputRegEmail"
962 android:textColor="#8147ed"
963 android:textSize="16sp" />
964 </TableRow>
965
966 <TableRow
967 android:layout_width="match_parent"
968 android:layout_height="match_parent"
969 android:layout_marginBottom="10dp"
970 android:gravity="center">
971
972 <TextView
973 android:id="@+id/txtRgePassword"
974 android:layout_width="wrap_content"
975 android:layout_height="wrap_content"
976 android:layout_marginEnd="10dp"
977 android:text="@string/txtRgePassword"
978 android:textColor="#8147ed"
979 android:textSize="16sp" />
980
981 <EditText
982 android:id="@+id/inputRegPassword"
983 android:layout_width="wrap_content"
984 android:layout_height="wrap_content"
985 android:autofillHints=""
986 android:ems="10"
987 android:inputType="textPassword"
988 android:labelFor="@id/inputRegPassword"
989 android:textColor="#8147ed"
990 android:textSize="16sp" />
991 </TableRow>
992
993 <TableRow
994 android:layout_width="match_parent"
995 android:layout_height="match_parent"
996 android:layout_marginBottom="10dp"
997 android:gravity="center">
998
999 <ImageView
1000 android:id="@+id/cameraLogo"
1001 android:layout_width="wrap_content"
1002 android:layout_height="wrap_content"
1003 android:layout_marginEnd="10dp"
1004 android:src="@drawable/camera" />
1005
1006 <ImageView
1007 android:id="@+id/imageCamera"
1008 android:layout_width="60dp"
1009 android:layout_height="60dp"
1010 android:src="@drawable/face1" />
1011 </TableRow>
1012
1013 </TableLayout>
1014
1015 <Button
1016 android:id="@+id/btnReg"
1017 style="@style/Widget.AppCompat.Button.Colored"
1018 android:layout_width="match_parent"
1019 android:layout_height="wrap_content"
1020 android:layout_marginBottom="50dp"
1021 android:text="@string/btnRegister" />
1022 </LinearLayout>
1023
1024</androidx.constraintlayout.widget.ConstraintLayout>
1025
1026//------------------------------ activity_grooms.xml ------------------------------
1027
1028<?xml version="1.0" encoding="utf-8"?>
1029<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
1030 xmlns:app="http://schemas.android.com/apk/res-auto"
1031 xmlns:tools="http://schemas.android.com/tools"
1032 android:layout_width="match_parent"
1033 android:layout_height="match_parent"
1034 android:layout_gravity="center"
1035 tools:context=".GroomsActivity">
1036
1037 <LinearLayout
1038 android:layout_width="match_parent"
1039 android:layout_height="match_parent"
1040 android:orientation="vertical">
1041
1042 <LinearLayout
1043 android:layout_width="match_parent"
1044 android:layout_height="wrap_content"
1045 android:gravity="end"
1046 android:layout_margin="10dp"
1047 android:orientation="horizontal">
1048 <Button
1049 android:layout_width="wrap_content"
1050 android:layout_height="wrap_content"
1051 android:id="@+id/btnLogout"
1052 android:text="Logout"
1053 android:layout_marginEnd="100dp"
1054 style="@style/Widget.AppCompat.Button.Colored" />
1055 <TextView
1056 android:id="@+id/groomsPageTitle"
1057 android:layout_width="wrap_content"
1058 android:layout_height="wrap_content"
1059 android:gravity="center"
1060 android:textSize="28sp"
1061 android:layout_marginEnd="30dp"
1062 android:text="@string/groom_page_welcome" />
1063
1064 <ImageView
1065 android:id="@+id/bride"
1066 android:layout_width="70dp"
1067 android:layout_height="70dp"
1068 android:contentDescription="@string/mypic"
1069 app:srcCompat="@drawable/face3" />
1070 </LinearLayout>
1071
1072 <TextView
1073 android:id="@+id/groomsPageSubTitle"
1074 android:layout_width="match_parent"
1075 android:layout_height="wrap_content"
1076 android:gravity="center"
1077 android:textSize="32sp"
1078 android:text="@string/choose_your_groom" />
1079
1080 <androidx.recyclerview.widget.RecyclerView
1081 android:layout_width="match_parent"
1082 android:layout_height="wrap_content"
1083 android:id="@+id/recycler_view"/>
1084 </LinearLayout>
1085</androidx.constraintlayout.widget.ConstraintLayout>
1086
1087//-------------------------- groom_item.xml -------------------------
1088
1089<?xml version="1.0" encoding="utf-8"?>
1090<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
1091 android:layout_width="match_parent"
1092 android:layout_height="wrap_content"
1093 android:id="@+id/uStatus"
1094 xmlns:app="http://schemas.android.com/apk/res-auto"
1095 app:cardCornerRadius="3dp"
1096 app:cardElevation="3dp"
1097 app:cardUseCompatPadding="true">
1098
1099 <RelativeLayout
1100 android:layout_width="wrap_content"
1101 android:layout_height="wrap_content"
1102 android:padding="16dp">
1103 <ImageView
1104 android:layout_width="75dp"
1105 android:layout_height="75dp"
1106 android:id="@+id/uImage"
1107 android:src="@mipmap/ic_launcher" />
1108 <TextView
1109 android:layout_width="wrap_content"
1110 android:layout_height="wrap_content"
1111 android:id="@+id/uName"
1112 android:text="@string/title"
1113 android:textSize="22sp"
1114 android:textColor="#000"
1115 android:textStyle="bold"
1116 android:layout_toRightOf="@+id/uImage"
1117 android:layout_toEndOf="@+id/uImage"
1118 android:layout_marginLeft="10dp"
1119 android:layout_marginStart="10dp" />
1120
1121 <TextView
1122 android:layout_width="wrap_content"
1123 android:layout_height="wrap_content"
1124 android:text="@string/description"
1125 android:id="@+id/uAge"
1126 android:textSize="18sp"
1127 android:textColor="#1232f9"
1128 android:layout_toRightOf="@+id/uImage"
1129 android:layout_toEndOf="@id/uImage"
1130 android:layout_marginLeft="10dp"
1131 android:layout_marginStart="10dp"
1132 android:layout_below="@id/uName" />
1133
1134 </RelativeLayout>
1135
1136</androidx.cardview.widget.CardView>
1137
1138//////////////////////////// Manifest ///////////////////////////
1139//---------------- AndroidManifets.xml --------------------------
1140
1141<?xml version="1.0" encoding="utf-8"?>
1142<manifest xmlns:android="http://schemas.android.com/apk/res/android"
1143 package="com.sgl.recyclerviewassignment">
1144
1145 <uses-permission android:name="android.permission.INTERNET"/>
1146 <uses-permission android:name="android.permission.CAMERA" />
1147 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1148 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1149
1150 <application
1151 android:allowBackup="true"
1152 android:icon="@mipmap/ic_launcher"
1153 android:label="@string/app_name"
1154 android:roundIcon="@mipmap/ic_launcher_round"
1155 android:supportsRtl="true"
1156 android:theme="@style/AppTheme">
1157 <activity android:name=".GroomsActivity"></activity>
1158 <activity android:name=".RegisterActivity" />
1159 <activity android:name=".LoginActivity" />
1160 <activity android:name=".MainActivity">
1161 <intent-filter>
1162 <action android:name="android.intent.action.MAIN" />
1163
1164 <category android:name="android.intent.category.LAUNCHER" />
1165 </intent-filter>
1166 </activity>
1167 </application>
1168
1169</manifest>
1170
1171//////////////////////// Gradle (Module) /////////////////////////
1172//--------------------- app ------------------------------------
1173
1174apply plugin: 'com.android.application'
1175
1176android {
1177 compileSdkVersion 29
1178 buildToolsVersion "29.0.2"
1179 defaultConfig {
1180 applicationId "com.sgl.recyclerviewassignment"
1181 minSdkVersion 26
1182 targetSdkVersion 29
1183 versionCode 1
1184 versionName "1.0"
1185 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1186 }
1187 buildTypes {
1188 release {
1189 minifyEnabled false
1190 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
1191 }
1192 }
1193}
1194
1195dependencies {
1196 implementation fileTree(dir: 'libs', include: ['*.jar'])
1197 implementation 'androidx.appcompat:appcompat:1.1.0'
1198 implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
1199 testImplementation 'junit:junit:4.12'
1200 androidTestImplementation 'androidx.test.ext:junit:1.1.1'
1201 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
1202
1203 // Backendless dependencies configuration
1204 implementation 'com.backendless:backendless:5.3.1'
1205
1206 // required for real-time database and real-time messaging
1207 implementation ('io.socket:socket.io-client:1.0.0') {
1208 // excluding org.json which is provided by Android
1209 exclude group: 'org.json', module: 'json'
1210 }
1211 implementation 'androidx.recyclerview:recyclerview:1.1.0'
1212 implementation 'androidx.cardview:cardview:1.0.0'
1213
1214 //glide
1215 implementation 'com.github.bumptech.glide:glide:4.10.0'
1216
1217 //picasso
1218 implementation 'com.squareup.picasso:picasso:2.71828'
1219}