View difference between Paste ID: cLgFhUSX and qSgEVSgn
SHOW: | | - or go back to the newest paste.
1
Task.java
2
---------
3
package com.example.mohamadpc.backendless;
4
5
import com.backendless.Backendless;
6
import com.backendless.async.callback.AsyncCallback;
7
import com.backendless.persistence.DataQueryBuilder;
8
9
import java.util.List;
10
11
public class Task {
12
    private java.util.Date updated;
13
    private Integer Priorty;
14
    private String ownerId;
15
    private java.util.Date closed;
16
    private java.util.Date target;
17
    private String name;
18
    private java.util.Date created;
19
    private String objectId;
20
    private boolean done;
21
22
    public void setOwnerId(String ownerId) {
23
        this.ownerId = ownerId;
24
    }
25
26
    public boolean getDone() {
27
        return done;
28
    }
29
30
    public void setDone(boolean done) {
31
        this.done = done;
32
    }
33
34
    public java.util.Date getUpdated() {
35
        return updated;
36
    }
37
38
    public Integer getPriorty() {
39
        return Priorty;
40
    }
41
42
    public void setPriorty(Integer Priorty) {
43
        this.Priorty = Priorty;
44
    }
45
46
    public String getOwnerId() {
47
        return ownerId;
48
    }
49
50
    public java.util.Date getClosed() {
51
        return closed;
52
    }
53
54
    public void setClosed(java.util.Date closed) {
55
        this.closed = closed;
56
    }
57
58
    public java.util.Date getTarget() {
59
        return target;
60
    }
61
62
    public void setTarget(java.util.Date target) {
63
        this.target = target;
64
    }
65
66
    public String getName() {
67
        return name;
68
    }
69
70
    public void setName(String name) {
71
        this.name = name;
72
    }
73
74
    public java.util.Date getCreated() {
75
        return created;
76
    }
77
78
    public String getObjectId() {
79
        return objectId;
80
    }
81
82
    public Task save() {
83
        return Backendless.Data.of(Task.class).save(this);
84
    }
85
86
    public void saveAsync(AsyncCallback<Task> callback) {
87
        Backendless.Data.of(Task.class).save(this, callback);
88
    }
89
90
    public Long remove() {
91
        return Backendless.Data.of(Task.class).remove(this);
92
    }
93
94
    public void removeAsync(AsyncCallback<Long> callback) {
95
        Backendless.Data.of(Task.class).remove(this, callback);
96
    }
97
98
    public static Task findById(String id) {
99
        return Backendless.Data.of(Task.class).findById(id);
100
    }
101
102
    public static void findByIdAsync(String id, AsyncCallback<Task> callback) {
103
        Backendless.Data.of(Task.class).findById(id, callback);
104
    }
105
106
    public static Task findFirst() {
107
        return Backendless.Data.of(Task.class).findFirst();
108
    }
109
110
    public static void findFirstAsync(AsyncCallback<Task> callback) {
111
        Backendless.Data.of(Task.class).findFirst(callback);
112
    }
113
114
    public static Task findLast() {
115
        return Backendless.Data.of(Task.class).findLast();
116
    }
117
118
    public static void findLastAsync(AsyncCallback<Task> callback) {
119
        Backendless.Data.of(Task.class).findLast(callback);
120
    }
121
122
    public static List<Task> find(DataQueryBuilder queryBuilder) {
123
        return Backendless.Data.of(Task.class).find(queryBuilder);
124
    }
125
126
    public static void findAsync(DataQueryBuilder queryBuilder, AsyncCallback<List<Task>> callback) {
127
        Backendless.Data.of(Task.class).find(queryBuilder, callback);
128
    }
129
}
130
131
RegisterActivity.java
132
----------------------
133
package com.example.mohamadpc.backendless;
134
135
import android.app.Activity;
136
import android.app.ProgressDialog;
137
import android.content.Context;
138
import android.os.Bundle;
139
import android.view.View;
140
import android.widget.EditText;
141
import android.widget.Toast;
142
143
import com.backendless.Backendless;
144
import com.backendless.BackendlessUser;
145
import com.backendless.async.callback.AsyncCallback;
146
import com.backendless.exceptions.BackendlessFault;
147
148
public class RegisterActivity extends Activity implements View.OnClickListener {
149
    private Context context;
150
    private EditText etUserEmail, etUserName, etPassword, etReTypePassword;
151
152
    @Override
153
    protected void onCreate(Bundle savedInstanceState) {
154
        super.onCreate(savedInstanceState);
155
        setContentView(R.layout.activity_register);
156
157
        setPointer();
158
    }
159
160
    private void setPointer() {
161
        this.context = this;
162
163
        etUserEmail = (EditText) findViewById(R.id.etRegisterUserEmail);
164
        etUserName = (EditText) findViewById(R.id.etRegisterUserName);
165
        etPassword = (EditText) findViewById(R.id.etRegisterPassword);
166
        etReTypePassword = (EditText) findViewById(R.id.etRegisterReTypePassword);
167
168
        findViewById(R.id.btnRegisterRgister).setOnClickListener(this);
169
        findViewById(R.id.btnRegisterCancel).setOnClickListener(this);
170
    }
171
172
    @Override
173
    public void onClick(View view) {
174
        switch (view.getId()) {
175
            case R.id.btnRegisterCancel:
176
                cancel();
177
                break;
178
            case R.id.btnRegisterRgister:
179
                String userEmail = etUserEmail.getText().toString();
180
                String userName = etUserName.getText().toString();
181
                String password = etPassword.getText().toString();
182
                String reTypePassword = etReTypePassword.getText().toString();
183
184
                if (isValidInput(userEmail, userName, password, reTypePassword))
185
                    register(userEmail, userName, password);
186
                break;
187
            default:
188
                Toast.makeText(this, "Unknown click event on " + view.getId(), Toast.LENGTH_SHORT).show();
189
        }
190
    }
191
192
    private boolean isValidInput(String userEmail, String userName, String password, String reTypePassword) {
193
        // no empty fields
194
        if (userEmail.isEmpty() || userName.isEmpty() ||
195
                password.isEmpty() ||
196
                reTypePassword.isEmpty()) {
197
            Toast.makeText(this, "Please fill all fields", Toast.LENGTH_LONG).show();
198
            return false;
199
        }
200
201
        // password match
202
        if (!password.equals(reTypePassword)) {
203
            Toast.makeText(this, "password fields do not match", Toast.LENGTH_LONG).show();
204
            return false;
205
        }
206
207
        // minimum password length
208
        if (password.length() < 3) {
209
            Toast.makeText(this, "password is too short", Toast.LENGTH_LONG).show();
210
            return false;
211
        }
212
        // valid email address
213
        if (!android.util.Patterns.EMAIL_ADDRESS.matcher(userEmail).matches()) {
214
            Toast.makeText(this, "invalid email address", Toast.LENGTH_LONG).show();
215
            return false;
216
        }
217
218
        return true;
219
220
    }
221
222
223
    private void cancel() {
224
        this.finish();
225
    }
226
227
    private void register(String userEmail, String userName, String password) {
228
        if (userEmail.isEmpty() || userName.isEmpty() || password.isEmpty()) {
229
            Toast.makeText(context, "missing data for registrationS", Toast.LENGTH_LONG).show();
230
            return;
231
        }
232
        final ProgressDialog pd = new ProgressDialog(context);
233
        pd.setMessage("Registering . . .");
234
        pd.show();
235
236
        BackendlessUser user = new BackendlessUser();
237
        user.setEmail(userEmail);
238
        user.setProperty("name", userName);
239
        user.setPassword(password);
240
241
        AsyncCallback<BackendlessUser> registerAsyncCallBack = new AsyncCallback<BackendlessUser>() {
242
            @Override
243
            public void handleResponse(BackendlessUser response) {
244
                pd.dismiss();
245
                finish();
246
            }
247
248
            @Override
249
            public void handleFault(BackendlessFault fault) {
250
                pd.cancel();
251
                Toast.makeText(context, "register faild", Toast.LENGTH_LONG).show();
252
                finish();
253
            }
254
        };
255
256
        Backendless.UserService.register(user, registerAsyncCallBack);
257
    }
258
}
259
260
LoginActivity.java
261
-------------------
262
package com.example.mohamadpc.backendless;
263
264
import android.app.Activity;
265
import android.app.ProgressDialog;
266
import android.content.Context;
267
import android.content.Intent;
268
import android.os.Bundle;
269
import android.view.View;
270
import android.widget.EditText;
271
import android.widget.Toast;
272
273
import com.backendless.Backendless;
274
import com.backendless.BackendlessUser;
275
import com.backendless.async.callback.AsyncCallback;
276
import com.backendless.exceptions.BackendlessFault;
277
278
public class LoginActivity extends Activity implements View.OnClickListener {
279
    private Context context;
280
    private EditText etUserName, etPassword;
281
282
    @Override
283
    protected void onCreate(Bundle savedInstanceState) {
284
        super.onCreate(savedInstanceState);
285
        setContentView(R.layout.activity_login);
286
287
        setPointer();
288
    }
289
290
    private void setPointer() {
291
        this.context = this;
292
        etUserName = (EditText) findViewById(R.id.etLoginUserName);
293
        etPassword = (EditText) findViewById(R.id.etLoginUserPassword);
294
295
        // register button to on click listener
296
        findViewById(R.id.btnLoginLogin).setOnClickListener(this);
297
        findViewById(R.id.btnLoginRegister).setOnClickListener(this);
298
299
        // initialize connection to BackEndLess database
300
        String applicationId = context.getResources().getString(R.string.application_Id);
301
        String apiKey = context.getResources().getString(R.string.api_key);
302
        Backendless.initApp(getApplicationContext(), applicationId, apiKey);
303
    }
304
305
    @Override
306
    public void onClick(View view) {
307
        switch (view.getId()) {
308
            case R.id.btnLoginLogin:
309
                login();
310
                break;
311
312
            case R.id.btnLoginRegister:
313
                register();
314
                break;
315
            default:
316
                Toast.makeText(this, "Unhandled Click on " + view.getId(), Toast.LENGTH_SHORT).show();
317
        }
318
    }
319
320
    private void register() {
321
        startActivity(new Intent(context, RegisterActivity.class));
322
    }
323
324
    private void login() {
325
        final String userName, password;
326
        userName = etUserName.getText().toString();
327
        password = etPassword.getText().toString();
328
329
        if (userName.isEmpty() || password.isEmpty()) {
330
            Toast.makeText(context, "Please fill in all your details!", Toast.LENGTH_LONG).show();
331
            return;
332
        }
333
        final ProgressDialog pd = new ProgressDialog(context);
334
        pd.setMessage("Login in progress . . .");
335
        pd.show();
336
        AsyncCallback<BackendlessUser> loginAsyncCallBack = new AsyncCallback<BackendlessUser>() {
337
            @Override
338
            public void handleResponse(BackendlessUser response) {
339
                Intent intent = new Intent(context, TasksActivity.class);
340
                intent.putExtra("currentUserName", response.getProperty("name") + "");
341
                intent.putExtra("currentUserId", response.getUserId());
342
343
                pd.dismiss();
344
                finish();
345
                startActivity(intent);
346
            }
347
348
            @Override
349
            public void handleFault(BackendlessFault fault) {
350
                pd.cancel();
351
                etUserName.setText("");
352
                etPassword.setText("");
353
                Toast.makeText(context, "Login failed", Toast.LENGTH_LONG).show();
354
355
            }
356
        };
357
358
        Backendless.UserService.login(userName, password, loginAsyncCallBack, true);
359
    }
360
}
361
362
TasksActivity.java
363
-------------------
364
package com.example.mohamadpc.backendless;
365
366
import android.app.Activity;
367
import android.app.AlertDialog;
368
import android.app.ProgressDialog;
369
import android.content.Context;
370
import android.content.DialogInterface;
371
import android.content.Intent;
372
import android.graphics.Color;
373
import android.os.Bundle;
374
import android.view.LayoutInflater;
375
import android.view.View;
376
import android.widget.AdapterView;
377
import android.widget.EditText;
378
import android.widget.ListView;
379
import android.widget.Toast;
380
381
import com.backendless.Backendless;
382
import com.backendless.async.callback.AsyncCallback;
383
import com.backendless.exceptions.BackendlessFault;
384
import com.backendless.persistence.DataQueryBuilder;
385
import com.nightonke.boommenu.BoomButtons.OnBMClickListener;
386
import com.nightonke.boommenu.BoomButtons.TextOutsideCircleButton;
387
import com.nightonke.boommenu.BoomMenuButton;
388
import com.nightonke.boommenu.ButtonEnum;
389
390
import java.util.List;
391
392
public class TasksActivity extends Activity {
393
    private String userName, userId;
394
    private Context context;
395
    private List<Task> myTasks;
396
    private ListView myTaskList;
397
    private BoomMenuButton bmb;
398
399
    @Override
400
    protected void onCreate(Bundle savedInstanceState) {
401
        super.onCreate(savedInstanceState);
402
        setContentView(R.layout.activity_tasks);
403
404
        setPointer();
405
        getIntentData();
406
        getUserTasks();
407
    }
408
409
    private void setPointer() {
410
        this.context = this;
411
412
        myTaskList = (ListView) findViewById(R.id.lstTasks);
413
        bmb = (BoomMenuButton) findViewById(R.id.btnboomMenu);
414
        buildBoomMenu();
415
416
        myTaskList.setAdapter(new TasksAdapter(myTasks, context));
417
        myTaskList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
418
            @Override
419
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
420
                myTaskList.setItemChecked(position, true);
421
            }
422
        });
423
        myTaskList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
424
            @Override
425
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
426
                myTaskList.setItemChecked(position, true);
427
            }
428
429
            @Override
430
            public void onNothingSelected(AdapterView<?> parent) {
431
432
            }
433
        });
434
    }
435
436
    private void getUserTasks() {
437
        final ProgressDialog pd = new ProgressDialog(context);
438
        pd.show();
439
440
        DataQueryBuilder queryBuilder = DataQueryBuilder.create();
441
        String whereClause = "ownerId='" + Backendless.UserService.loggedInUser() + "'";
442
        queryBuilder.setWhereClause(whereClause);
443
        //if we dont tell backendless the size of return records, it will be by defualt 10 result
444
        queryBuilder.setPageSize(100);
445
        //get our data from the database......
446
        Backendless.Data.of(Task.class).find(queryBuilder, new AsyncCallback<List<Task>>() {
447
            @Override
448
            public void handleResponse(List<Task> response) {
449
                myTasks = response;
450
                myTaskList.setAdapter(new TasksAdapter(myTasks, context));
451
                pd.dismiss();
452
                Toast.makeText(context, response.size() + " tasks was loaded from server", Toast.LENGTH_LONG).show();
453
            }
454
455
            @Override
456
            public void handleFault(BackendlessFault fault) {
457
                myTasks = null;
458
                Toast.makeText(context, "Error loading tasks from server !!!", Toast.LENGTH_LONG).show();
459
                pd.dismiss();
460
                finish();
461
            }
462
        });
463
    }
464
465
    private void buildBoomMenu() {
466
        bmb.setButtonEnum(ButtonEnum.TextOutsideCircle);
467
        for (int i = 0; i < bmb.getPiecePlaceEnum().pieceNumber(); i += 1) {
468
            TextOutsideCircleButton.Builder builder = new TextOutsideCircleButton.Builder();
469
            builder.textSize(16);
470
            switch (i) {
471
                case 0:
472
                    builder.normalColor(Color.RED);
473
                    builder.normalImageRes(R.drawable.add_task);
474
                    builder.normalText("Add");
475
                    builder.listener(new OnBMClickListener() {
476
                        @Override
477
                        public void onBoomButtonClick(int index) {
478
                            final AlertDialog.Builder addNewTask = new AlertDialog.Builder(context);
479
                            final View myDialogView = LayoutInflater.from(context).inflate(R.layout.dialog_new_task_layout, null);
480
481
                            addNewTask.setView(myDialogView);
482
                            addNewTask.setPositiveButton("Add", new DialogInterface.OnClickListener() {
483
                                @Override
484
                                public void onClick(final DialogInterface dialogInterface, int i) {
485
                                    String newTaskName = ((EditText) myDialogView.findViewById(R.id.etNewTaskName)).getText().toString();
486
                                    if (newTaskName.isEmpty()) {
487
                                        return;
488
                                    }
489
                                    Task newTask = new Task();
490
                                    newTask.setName(newTaskName);
491
                                    newTask.setDone(false);
492
                                    dialogInterface.dismiss();
493
                                    final ProgressDialog pd = new ProgressDialog(context);
494
                                    pd.setMessage("adding . . .");
495
                                    pd.show();
496
                                    Backendless.Persistence.of(Task.class).save(newTask, new AsyncCallback<Task>() {
497
                                        @Override
498
                                        public void handleResponse(Task response) {
499
                                            myTasks.add(response);
500
                                            ((TasksAdapter) myTaskList.getAdapter()).notifyDataSetChanged();
501
                                            pd.dismiss();
502
                                        }
503
504
                                        @Override
505
                                        public void handleFault(BackendlessFault fault) {
506
                                            pd.dismiss();
507
                                            Toast.makeText(context, "Error adding new task !!", Toast.LENGTH_LONG).show();
508
509
                                        }
510
                                    });
511
512
                                }
513
                            });
514
                            addNewTask.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
515
                                @Override
516
                                public void onClick(DialogInterface dialogInterface, int i) {
517
                                    dialogInterface.dismiss();
518
                                }
519
                            });
520
                            addNewTask.show();
521
                        }
522
                    });
523
                    break;
524
                case 1:
525
                    builder.normalColor(Color.CYAN);
526
                    builder.normalImageRes(R.drawable.delete_task);
527
                    builder.normalText("Delete");
528
                    builder.listener(new OnBMClickListener() {
529
                        @Override
530
                        public void onBoomButtonClick(int index) {
531
                            if (myTaskList.getCheckedItemPosition() > -1) {
532
                                final Task selectedTask = myTasks.get(myTaskList.getCheckedItemPosition());
533
                                final ProgressDialog pd = new ProgressDialog(context);
534
                                pd.setMessage("deleting . . .");
535
                                pd.show();
536
                                Backendless.Persistence.of(Task.class).remove(selectedTask, new AsyncCallback<Long>() {
537
                                    @Override
538
                                    public void handleResponse(Long response) {
539
                                        myTasks.remove(selectedTask);
540
                                        ((TasksAdapter) myTaskList.getAdapter()).notifyDataSetChanged();
541
                                        pd.dismiss();
542
                                    }
543
544
                                    @Override
545
                                    public void handleFault(BackendlessFault fault) {
546
                                        pd.dismiss();
547
                                        Toast.makeText(context, "Error deleteing task !!", Toast.LENGTH_LONG).show();
548
                                    }
549
                                });
550
551
                            } else {
552
                                Toast.makeText(context, "Select a task first !", Toast.LENGTH_SHORT).show();
553
                            }
554
                        }
555
                    });
556
                    break;
557
558
                case 2:
559
                    builder.normalColor(Color.GREEN);
560
                    builder.normalImageRes(R.drawable.move_task);
561
                    builder.normalText("Move");
562
                    builder.listener(new OnBMClickListener() {
563
                        @Override
564
                        public void onBoomButtonClick(int index) {
565
                            startActivityForResult(new Intent(context, SelectUserActivity.class), 1010101);
566
                        }
567
                    });
568
569
                    break;
570
                case 3:
571
                    builder.normalColor(Color.BLACK);
572
                    builder.normalImageRes(R.drawable.logout);
573
                    builder.normalText("Logout");
574
                    builder.listener(new OnBMClickListener() {
575
                        @Override
576
                        public void onBoomButtonClick(int index) {
577
                            Backendless.UserService.logout(new AsyncCallback<Void>() {
578
                                @Override
579
                                public void handleResponse(Void response) {
580
                                    TasksActivity.this.finish();
581
                                    startActivity(new Intent(context, LoginActivity.class));
582
                                }
583
584
                                @Override
585
                                public void handleFault(BackendlessFault fault) {
586
                                    Toast.makeText(context, "Error logout ...", Toast.LENGTH_SHORT).show();
587
                                }
588
                            });
589
590
                        }
591
                    });
592
                    break;
593
                default:
594
                    builder.normalText("");
595
                    break;
596
            }
597
598
            bmb.addBuilder(builder);
599
        }
600
601
    }
602
603
    private void getIntentData() {
604
        Intent intent = this.getIntent();
605
        if (!intent.hasExtra("currentUserName") || !intent.hasExtra("currentUserId")) {
606
            // user should login or register first
607
            startActivity(new Intent(context, LoginActivity.class));
608
            this.finish();
609
            return;
610
        }
611
612
        userName = intent.getStringExtra("currentUserName");
613
        userId = intent.getStringExtra("currentUserId");
614
    }
615
616
    public void addToList(Task response) {
617
        myTasks.add(response);
618
    }
619
620
    @Override
621
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
622
        super.onActivityResult(requestCode, resultCode, data);
623
        if (requestCode == 1010101 && resultCode == RESULT_OK) {
624
            String userId = data.getStringExtra("result");
625
626
            if (myTaskList.getCheckedItemPosition() > -1) {
627
                Task task = (Task) myTasks.get(myTaskList.getCheckedItemPosition());
628
                task.setOwnerId(userId);
629
                final ProgressDialog pd = new ProgressDialog(context);
630
                pd.setTitle("moving task ...");
631
                pd.show();
632
                Backendless.Persistence.of(Task.class).save(task, new AsyncCallback<Task>() {
633
                    @Override
634
                    public void handleResponse(Task response) {
635
                        myTasks.remove(myTaskList.getCheckedItemPosition());
636
                        ((TasksAdapter) myTaskList.getAdapter()).notifyDataSetChanged();
637
                        pd.dismiss();
638
                    }
639
640
                    @Override
641
                    public void handleFault(BackendlessFault fault) {
642
                        Toast.makeText(TasksActivity.this.context, "Error moving task", Toast.LENGTH_LONG).show();
643
                        pd.dismiss();
644
                    }
645
                });
646
            }
647
        }
648
    }
649
}
650
651
SelectUserActivity.java
652
------------------------
653
package com.example.mohamadpc.backendless;
654
655
import android.app.Activity;
656
import android.app.ProgressDialog;
657
import android.content.Context;
658
import android.content.Intent;
659
import android.os.Bundle;
660
import android.view.View;
661
import android.widget.AdapterView;
662
import android.widget.ListView;
663
664
import com.backendless.Backendless;
665
import com.backendless.BackendlessUser;
666
import com.backendless.async.callback.AsyncCallback;
667
import com.backendless.exceptions.BackendlessFault;
668
669
import java.util.List;
670
671
public class SelectUserActivity extends Activity implements View.OnClickListener {
672
    private Context context;
673
    private ListView usersList;
674
    private List<BackendlessUser> users;
675
676
    @Override
677
    protected void onCreate(Bundle savedInstanceState) {
678
        super.onCreate(savedInstanceState);
679
        setContentView(R.layout.activity_select_user);
680
681
        setPointer();
682
        loadUsersList();
683
    }
684
685
    private void setPointer() {
686
        this.context = this;
687
        usersList = (ListView) findViewById(R.id.usersList);
688
689
        findViewById(R.id.btnCancelSelect).setOnClickListener(this);
690
        findViewById(R.id.btnSelectUser).setOnClickListener(this);
691
692
        usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
693
            @Override
694
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
695
                usersList.setItemChecked(position, true);
696
            }
697
        });
698
699
        usersList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
700
            @Override
701
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
702
                usersList.setItemChecked(position, true);
703
            }
704
705
            @Override
706
            public void onNothingSelected(AdapterView<?> parent) {
707
            }
708
        });
709
710
711
    }
712
713
    private void loadUsersList() {
714
        final ProgressDialog pd = new ProgressDialog(context);
715
        pd.setMessage("Loading users list ...");
716
        pd.show();
717
        Backendless.Data.of(BackendlessUser.class).find(new AsyncCallback<List<BackendlessUser>>() {
718
            @Override
719
            public void handleResponse(List<BackendlessUser> response) {
720
                users = response;
721
                usersList.setAdapter(new UsersAdapter(users, context));
722
                pd.dismiss();
723
            }
724
725
            @Override
726
            public void handleFault(BackendlessFault fault) {
727
                pd.dismiss();
728
            }
729
        });
730
    }
731
732
733
    @Override
734
    public void onClick(View v) {
735
        Intent returnIntent = new Intent();
736
        int resultCode = Activity.RESULT_CANCELED;
737
        switch (v.getId()) {
738
            case R.id.btnCancelSelect:
739
                returnIntent.putExtra("result", "");
740
                break;
741
            case R.id.btnSelectUser:
742
                returnIntent.putExtra("result", users.get(usersList.getCheckedItemPosition()).getObjectId());
743
                resultCode = Activity.RESULT_OK;
744
745
                break;
746
        }
747
        setResult(resultCode, returnIntent);
748
        finish();
749
    }
750
}
751
752
TasksAdapter.java
753
------------------
754
package com.example.mohamadpc.backendless;
755
756
import android.app.ProgressDialog;
757
import android.content.Context;
758
import android.graphics.Color;
759
import android.view.LayoutInflater;
760
import android.view.View;
761
import android.view.ViewGroup;
762
import android.widget.BaseAdapter;
763
import android.widget.CompoundButton;
764
import android.widget.ListView;
765
import android.widget.Switch;
766
import android.widget.TextView;
767
768
import com.backendless.Backendless;
769
import com.backendless.async.callback.AsyncCallback;
770
import com.backendless.exceptions.BackendlessFault;
771
772
import java.util.List;
773
774
/**
775
 * Created by teacher on 10/26/2017.
776
 */
777
778
public class TasksAdapter extends BaseAdapter {
779
    private List<Task> myTasks;
780
    private Context context;
781
782
    public TasksAdapter(List<Task> myTasks, Context context) {
783
        this.myTasks = myTasks;
784
        this.context = context;
785
    }
786
787
    @Override
788
    public int getCount() {
789
        if (myTasks == null) return 0;
790
791
        return myTasks.size();
792
    }
793
794
    @Override
795
    public Task getItem(int i) {
796
        return myTasks.get(i);
797
    }
798
799
    @Override
800
    public long getItemId(int i) {
801
        return i;
802
    }
803
804
    @Override
805
    public View getView(final int i, View view, final ViewGroup viewGroup) {
806
        View myView = LayoutInflater.from(context).inflate(R.layout.task_item, null);
807
        Task task = myTasks.get(i);
808
809
        final Switch taskDone = (Switch) myView.findViewById(R.id.taskDone);
810
        final TextView tvTaskName = (TextView) myView.findViewById(R.id.taskName);
811
812
        tvTaskName.setText(myTasks.get(i).getName());
813
        taskDone.setChecked(myTasks.get(i).getDone());
814
        tvTaskName.setTextColor(getTaskColor(myTasks.get(i).getDone()));
815
816
        // mark selected row
817
        if (i == ((ListView) viewGroup).getCheckedItemPosition()) {
818
            myView.setBackgroundColor(Color.CYAN);
819
        }
820
821
        taskDone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
822
            @Override
823
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
824
                myTasks.get(i).setDone(isChecked);
825
                final ProgressDialog pd = new ProgressDialog(context);
826
                pd.setMessage("Updating task status ...");
827
                pd.show();
828
                Backendless.Persistence.of(Task.class).save(myTasks.get(i), new AsyncCallback<Task>() {
829
                    @Override
830
                    public void handleResponse(Task response) {
831
                        pd.dismiss();
832
                        TasksAdapter.this.notifyDataSetChanged();
833
                    }
834
835
                    @Override
836
                    public void handleFault(BackendlessFault fault) {
837
                        pd.dismiss();
838
                        TasksAdapter.this.notifyDataSetChanged();
839
                    }
840
                });
841
            }
842
        });
843
844
        return myView;
845
    }
846
847
    private int getTaskColor(Boolean switchStatus) {
848
        return switchStatus ? Color.GREEN : Color.RED;
849
    }
850
}
851
852
UsersAdapter.java
853
------------------
854
package com.example.mohamadpc.backendless;
855
856
import android.content.Context;
857
import android.graphics.Color;
858
import android.view.View;
859
import android.view.ViewGroup;
860
import android.widget.BaseAdapter;
861
import android.widget.ListView;
862
import android.widget.TextView;
863
864
import com.backendless.BackendlessUser;
865
866
import java.util.List;
867
868
/**
869
 * Created by teacher on 10/26/2017.
870
 */
871
872
public class UsersAdapter extends BaseAdapter {
873
    Context context;
874
    List<BackendlessUser> myUsers;
875
876
877
    public UsersAdapter(List<BackendlessUser> myUsers, Context context) {
878
        this.context = context;
879
        this.myUsers = myUsers;
880
881
    }
882
883
    @Override
884
    public int getCount() {
885
        if (myUsers == null) return 0;
886
887
        return myUsers.size();
888
    }
889
890
    @Override
891
    public BackendlessUser getItem(int i) {
892
        return myUsers.get(i);
893
    }
894
895
    @Override
896
    public long getItemId(int i) {
897
        return i;
898
    }
899
900
    @Override
901
    public View getView(final int i, View view, final ViewGroup viewGroup) {
902
        TextView tv = new TextView(context);
903
        tv.setTextSize(22);
904
        tv.setText(myUsers.get(i).getProperty("name") + "");
905
906
        if (i == ((ListView) viewGroup).getCheckedItemPosition()) {
907
            tv.setBackgroundColor(Color.CYAN);
908
        }
909
        return tv;
910
    }
911
}
912
913
activity_register.xml
914
---------------------
915
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
916
    android:layout_width="match_parent"
917
    android:layout_height="match_parent"
918
    android:orientation="vertical">
919
920
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
921
        android:layout_width="match_parent"
922
        android:layout_height="match_parent"
923
        android:layout_weight="1"
924
        android:orientation="vertical">
925
926
927
        <ImageView
928
            android:id="@+id/imageView"
929
            android:layout_width="match_parent"
930
            android:layout_height="match_parent"
931
            android:layout_weight="1"
932
            android:src="@drawable/register" />
933
934
935
    </LinearLayout>
936
937
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
938
        android:layout_width="match_parent"
939
        android:layout_height="match_parent"
940
        android:layout_weight="0.80"
941
        android:orientation="vertical">
942
943
        <EditText
944
            android:id="@+id/etRegisterUserEmail"
945
            android:layout_width="match_parent"
946
            android:layout_height="wrap_content"
947
            android:layout_weight="1"
948
            android:hint="Enter user email"
949
            android:inputType="textEmailAddress" />
950
951
        <EditText
952
            android:id="@+id/etRegisterUserName"
953
            android:layout_width="match_parent"
954
            android:layout_height="wrap_content"
955
            android:layout_weight="1"
956
            android:hint="Enter user name" />
957
958
        <EditText
959
            android:id="@+id/etRegisterPassword"
960
            android:layout_width="match_parent"
961
            android:layout_height="wrap_content"
962
            android:layout_weight="1"
963
            android:hint="Enter user password"
964
            android:inputType="textPassword" />
965
966
        <EditText
967
            android:id="@+id/etRegisterReTypePassword"
968
            android:layout_width="match_parent"
969
            android:layout_height="wrap_content"
970
            android:layout_weight="1"
971
            android:hint="ReType user password"
972
            android:inputType="textPassword" />
973
    </LinearLayout>
974
975
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
976
        android:layout_width="match_parent"
977
        android:layout_height="match_parent"
978
        android:layout_weight="1"
979
        android:orientation="horizontal">
980
981
982
        <Button
983
            android:id="@+id/btnRegisterRgister"
984
            android:layout_width="match_parent"
985
            android:layout_height="wrap_content"
986
            android:layout_margin="20dp"
987
            android:layout_weight="1"
988
            android:text="Register"
989
            android:textSize="22sp" />
990
991
        <Button
992
            android:id="@+id/btnRegisterCancel"
993
            android:layout_width="match_parent"
994
            android:layout_height="wrap_content"
995
            android:layout_margin="20dp"
996
            android:layout_weight="1"
997
            android:text="Cancel"
998
            android:textSize="22sp" />
999
    </LinearLayout>
1000
1001
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1002
        android:layout_width="match_parent"
1003
        android:layout_height="match_parent"
1004
        android:layout_weight="1"
1005
        android:orientation="vertical">
1006
1007
        <TextView
1008
            android:layout_width="match_parent"
1009
            android:layout_height="wrap_content"
1010
            android:layout_margin="20dp"
1011
            android:text="Bla bla bla"
1012
            android:textSize="22sp" />
1013
1014
    </LinearLayout>
1015
</LinearLayout>
1016
1017
activity_login.xml
1018
------------------
1019
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1020
    xmlns:tools="http://schemas.android.com/tools"
1021
    android:layout_width="match_parent"
1022
    android:layout_height="match_parent"
1023
    android:orientation="vertical">
1024
1025
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1026
        android:layout_width="match_parent"
1027
        android:layout_height="match_parent"
1028
        android:layout_weight="1"
1029
        android:orientation="vertical">
1030
1031
        <ImageView
1032
            android:layout_width="match_parent"
1033
            android:layout_height="match_parent"
1034
            android:layout_margin="16dp"
1035
            android:src="@drawable/app_logo_1" />
1036
    </LinearLayout>
1037
1038
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1039
        android:layout_width="match_parent"
1040
        android:layout_height="match_parent"
1041
        android:layout_weight="1"
1042
        android:orientation="vertical">
1043
1044
        <EditText
1045
            android:id="@+id/etLoginUserName"
1046
            android:layout_width="match_parent"
1047
            android:layout_height="wrap_content"
1048
            android:layout_marginLeft="16dp"
1049
            android:layout_marginRight="16dp"
1050
            android:layout_marginTop="20dp"
1051
            android:hint="@string/hint_user_name"
1052
            android:inputType="textEmailAddress" />
1053
1054
1055
        <EditText
1056
            android:id="@+id/etLoginUserPassword"
1057
            android:layout_width="match_parent"
1058
            android:layout_height="wrap_content"
1059
            android:layout_marginLeft="16dp"
1060
            android:layout_marginRight="16dp"
1061
            android:layout_marginTop="20dp"
1062
            android:hint="@string/hint_user_password"
1063
            android:inputType="textPassword" />
1064
    </LinearLayout>
1065
1066
    <LinearLayout
1067
        android:layout_width="match_parent"
1068
        android:layout_height="match_parent"
1069
        android:layout_weight="1"
1070
        android:orientation="vertical">
1071
1072
        <Button
1073
            android:id="@+id/btnLoginLogin"
1074
            android:layout_width="match_parent"
1075
            android:layout_height="wrap_content"
1076
            android:layout_marginLeft="16dp"
1077
            android:layout_marginRight="16dp"
1078
            android:layout_weight="1"
1079
            android:text="@string/cmd_login"
1080
            android:textSize="22sp" />
1081
1082
        <TextView
1083
            android:layout_width="match_parent"
1084
            android:layout_height="wrap_content"
1085
            android:layout_marginLeft="16dp"
1086
            android:layout_marginRight="16dp"
1087
            android:gravity="center"
1088
            android:text="or"
1089
            android:textSize="17sp" />
1090
1091
        <Button
1092
            android:id="@+id/btnLoginRegister"
1093
            android:layout_width="match_parent"
1094
            android:layout_height="wrap_content"
1095
            android:layout_marginLeft="16dp"
1096
            android:layout_marginRight="16dp"
1097
            android:text="@string/hint_register"
1098
            android:textSize="12sp" />
1099
1100
    </LinearLayout>
1101
1102
    <LinearLayout
1103
        android:layout_width="match_parent"
1104
        android:layout_height="match_parent"
1105
        android:layout_weight="1"
1106
        android:orientation="vertical">
1107
1108
        <TextView
1109
            android:layout_width="match_parent"
1110
            android:layout_height="match_parent"
1111
            android:layout_marginBottom="16dp"
1112
            android:layout_marginLeft="16dp"
1113
            android:layout_marginRight="16dp"
1114
            android:gravity="center|bottom"
1115
            android:text="@string/app_developer"
1116
            android:textSize="22sp" />
1117
    </LinearLayout>
1118
</LinearLayout>
1119
1120
activity_tasks.xml
1121
-------------------
1122
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
1123
    xmlns:app="http://schemas.android.com/apk/res-auto"
1124
    android:layout_width="match_parent"
1125
    android:layout_height="match_parent">
1126
1127
    <ListView
1128
        android:id="@+id/lstTasks"
1129
        android:layout_width="match_parent"
1130
        android:layout_height="match_parent"
1131
        android:choiceMode="singleChoice" />
1132
1133
    <com.nightonke.boommenu.BoomMenuButton
1134
        android:id="@+id/btnboomMenu"
1135
        android:layout_width="wrap_content"
1136
        android:layout_height="wrap_content"
1137
        android:layout_gravity="bottom|end"
1138
        app:bmb_buttonEnum="textOutsideCircle"
1139
        app:bmb_buttonPlaceEnum="buttonPlace_sc_4_1"
1140
        app:bmb_piecePlaceEnum="piecePlace_dot_4_1"
1141
        app:layout_anchor="@id/lstTasks"
1142
        app:layout_anchorGravity="bottom|end" />
1143
1144
</android.support.design.widget.CoordinatorLayout>
1145
1146
activity_select_user.xml
1147
------------------------
1148
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1149
    android:layout_width="match_parent"
1150
    android:layout_height="match_parent"
1151
    android:orientation="vertical">
1152
    xmlns:android="http://schemas.android.com/apk/res/android" />
1153
1154
    <ListView
1155
        android:id="@+id/usersList"
1156
        android:layout_width="match_parent"
1157
        android:layout_height="match_parent"
1158
        android:layout_weight="0.1"
1159
        android:choiceMode="singleChoice" />
1160
1161
    <LinearLayout
1162
        android:layout_width="match_parent"
1163
        android:layout_height="match_parent"
1164
        android:layout_weight="1"
1165
        android:orientation="horizontal">
1166
1167
        <Button
1168
            android:id="@+id/btnSelectUser"
1169
            android:layout_width="match_parent"
1170
            android:layout_height="wrap_content"
1171
            android:layout_weight="1"
1172
            android:text="Select" />
1173
1174
        <Button
1175
            android:id="@+id/btnCancelSelect"
1176
            android:layout_width="match_parent"
1177
            android:layout_height="wrap_content"
1178
            android:layout_weight="1"
1179
            android:text="Cancel" />
1180
    </LinearLayout>
1181
</LinearLayout>
1182
1183
task_item.xml
1184
-------------
1185
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1186
    xmlns:app="http://schemas.android.com/apk/res-auto"
1187
    android:layout_width="match_parent"
1188
    android:layout_height="wrap_content"
1189
    android:orientation="horizontal">
1190
1191
    <Switch
1192
        android:id="@+id/taskDone"
1193
        android:layout_width="wrap_content"
1194
        android:layout_height="wrap_content"
1195
        android:layout_marginBottom="10dp"
1196
        android:layout_marginLeft="16dp"
1197
        android:layout_marginTop="10dp"
1198
        android:focusable="false"
1199
        android:focusableInTouchMode="false" />
1200
1201
    <TextView
1202
        android:id="@+id/taskName"
1203
        android:layout_width="match_parent"
1204
        android:layout_height="wrap_content"
1205
        android:layout_gravity="center_vertical"
1206
        android:layout_marginRight="16dp"
1207
        android:text="Sample task data.."
1208
        android:textColor="#ff0000"
1209
        android:textSize="18sp" />
1210
</LinearLayout>
1211
1212
dialog_new_task_layout.xml
1213
--------------------------
1214
<?xml version="1.0" encoding="utf-8"?>
1215
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
1216
    android:layout_width="match_parent"
1217
    android:layout_height="wrap_content"
1218
    android:background="#000000"
1219
    android:orientation="vertical">
1220
1221
    <TextView
1222
        android:layout_width="wrap_content"
1223
        android:layout_height="wrap_content"
1224
        android:layout_gravity="center"
1225
        android:layout_marginBottom="20dp"
1226
        android:text="Add new task !!!"
1227
        android:textColor="#ff0000"
1228
        android:textSize="22sp" />
1229
1230
    <EditText
1231
        android:id="@+id/etNewTaskName"
1232
        android:layout_width="match_parent"
1233
        android:layout_height="wrap_content"
1234
        android:layout_margin="16dp"
1235
        android:background="#ffffff"
1236
        android:hint="Enter task name here"
1237
        android:text=""
1238
        android:textColor="#000000"
1239
        android:textSize="22sp" />
1240
</LinearLayout>