This commit is contained in:
Данил
2025-05-20 15:30:39 +07:00
parent 78d741935b
commit 4139a34b13
17 changed files with 7501 additions and 370 deletions
@@ -27,7 +27,8 @@ public class AddNewTask extends AppCompatActivity implements DatePickerDialog.On
private static final String TAG = "ADD_NEW_TASK"; private static final String TAG = "ADD_NEW_TASK";
private ActivityAddNewTaskBinding binding; private ActivityAddNewTaskBinding binding;
private static String token; private String login;
private String password;
private AddItemViewModel viewModel; private AddItemViewModel viewModel;
private String stringDate = ""; private String stringDate = "";
private String stringTime = ""; private String stringTime = "";
@@ -38,13 +39,6 @@ public class AddNewTask extends AppCompatActivity implements DatePickerDialog.On
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(binding.getRoot()); setContentView(binding.getRoot());
token = getIntent().getStringExtra(PublicKeyNames.TOKEN_KEY);
if(token == null)
{
Log.w(TAG, "Token is null");
return;
}
binding.btnDatePick.setOnClickListener(v->{ binding.btnDatePick.setOnClickListener(v->{
DatePickerFragment fragment = new DatePickerFragment(); DatePickerFragment fragment = new DatePickerFragment();
fragment.show(getSupportFragmentManager(), "DATE PICK"); fragment.show(getSupportFragmentManager(), "DATE PICK");
@@ -63,8 +57,11 @@ public class AddNewTask extends AppCompatActivity implements DatePickerDialog.On
} }
}); });
login = getIntent().getStringExtra(PublicKeyNames.LOGIN_KEY);
password = getIntent().getStringExtra(PublicKeyNames.PASSWORD_KEY);
// Offline // Offline
if(token.equals("null")) { if(login == null || password == null) {
Offline(); Offline();
} }
// Online // Online
@@ -82,19 +79,9 @@ public class AddNewTask extends AppCompatActivity implements DatePickerDialog.On
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show();
return; return;
} }
if(stringDate.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterDate, Snackbar.LENGTH_SHORT).show();
return;
}
if(stringTime.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterDate, Snackbar.LENGTH_SHORT).show();
return;
}
String dateTime = stringDate + ' ' + stringTime; long ID = generateID(name, description, stringDate, stringTime);
Task task = new Task(ID, stringDate, name, description, stringTime);
long ID = generateID(name, description, dateTime);
Task task = new Task(ID, name, description, dateTime);
viewModel.OfflineSaveData(task); viewModel.OfflineSaveData(task);
}); });
} }
@@ -116,38 +103,29 @@ public class AddNewTask extends AppCompatActivity implements DatePickerDialog.On
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show();
return; return;
} }
if(stringDate.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterDate, Snackbar.LENGTH_SHORT).show();
return;
}
if(stringTime.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterDate, Snackbar.LENGTH_SHORT).show();
return;
}
String dateTime = stringDate + ' ' + stringTime; long ID = generateID(name, description, stringDate, stringTime);
Task task = new Task(ID, stringDate, name, description, stringTime);
long ID = generateID(name, description, dateTime); viewModel.OnlineSaveData(task, login, password);
Task task = new Task(ID, name, description, dateTime);
viewModel.OnlineSaveData(task, token);
}); });
} }
private long generateID(String name, String Description, String date) { private long generateID(String name, String Description, String date, String time) {
Random rand = new Random(); Random rand = new Random();
long key1 = name.hashCode(); long key1 = name.hashCode();
long key2 = Description.hashCode(); long key2 = Description.hashCode();
long key3 = date.hashCode(); long key3 = date.hashCode();
long key4 = rand.nextInt(); long key4 = time.hashCode();
long key5 = rand.nextInt();
long hash = key1 ^ key2 ^ key3 ^ key4; return key1 ^ key2 ^ key3 ^ key4 ^ key5;
return hash;
} }
public static Intent getIntent(Context context, String token) { public static Intent getIntent(Context context, String login, String password) {
Intent intent = new Intent(context, AddNewTask.class); Intent intent = new Intent(context, AddNewTask.class);
intent.putExtra(PublicKeyNames.TOKEN_KEY, token); intent.putExtra(PublicKeyNames.LOGIN_KEY, login);
intent.putExtra(PublicKeyNames.PASSWORD_KEY, password);
return intent; return intent;
} }
@@ -26,7 +26,7 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
private ActivityEditTaskBinding binding; private ActivityEditTaskBinding binding;
private EditTaskViewModel viewModel; private EditTaskViewModel viewModel;
private String token; private String login, password;
private long taskID = -1; private long taskID = -1;
private String taskDateString; private String taskDateString;
private String taskTimeString; private String taskTimeString;
@@ -59,12 +59,20 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
public void onChanged(Task task) { public void onChanged(Task task) {
binding.TaskName.setText(task.getTaskName()); binding.TaskName.setText(task.getTaskName());
binding.TaskDescription.setText(task.getTaskDescription()); binding.TaskDescription.setText(task.getTaskDescription());
String dateTime = task.getTaskDate(); taskDateString = task.getTaskDate();
String[] buf = dateTime.split(" "); taskTimeString = task.getTaskTime();
taskDateString = buf[0]; if(taskDateString == null) {
taskTimeString = buf[1]; binding.btnDatePick.setText(R.string.button_DefaultData);
binding.btnDatePick.setText(taskDateString); }
binding.btnTimePick.setText(taskTimeString); else {
binding.btnDatePick.setText(taskDateString);
}
if(taskTimeString == null) {
binding.btnTimePick.setText(R.string.button_DefaultTime);
}
else {
binding.btnTimePick.setText(taskTimeString);
}
} }
}); });
viewModel.getClose().observe(this, new Observer<Boolean>() { viewModel.getClose().observe(this, new Observer<Boolean>() {
@@ -75,15 +83,11 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
} }
}); });
token = intent.getStringExtra(PublicKeyNames.TOKEN_KEY); login = intent.getStringExtra(PublicKeyNames.LOGIN_KEY);
if(token == null) password = intent.getStringExtra(PublicKeyNames.PASSWORD_KEY);
{
Log.w(TAG, "Token is null");
return;
}
// Offline // Offline
if(token.equals("null")) { if(login == null || password == null) {
Offline(); Offline();
} }
// Online // Online
@@ -98,7 +102,7 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
String name = binding.TaskName.getText().toString(); String name = binding.TaskName.getText().toString();
String description = binding.TaskDescription.getText().toString(); String description = binding.TaskDescription.getText().toString();
Task task = new Task(taskID, name, description, taskDateString + ' ' +taskTimeString); Task task = new Task(taskID, taskDateString, name, description, taskTimeString);
viewModel.OfflineSaveData(task); viewModel.OfflineSaveData(task);
}); });
} }
@@ -108,8 +112,8 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
String name = binding.TaskName.getText().toString(); String name = binding.TaskName.getText().toString();
String description = binding.TaskDescription.getText().toString(); String description = binding.TaskDescription.getText().toString();
Task task = new Task(taskID, name, description, taskDateString + ' ' +taskTimeString); Task task = new Task(taskID, taskDateString, name, description, taskTimeString);
viewModel.OnlineSaveData(task, token); viewModel.OnlineSaveData(task, login, password);
}); });
viewModel.getLiveDataFail().observe(this, new Observer<String>() { viewModel.getLiveDataFail().observe(this, new Observer<String>() {
@Override @Override
@@ -119,12 +123,13 @@ public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDa
} }
}); });
viewModel.LoadTaskOnline(token, taskID); viewModel.LoadTaskOnline(login, password, taskID);
} }
public static Intent getIntent(Context context, String token, long taskID) { public static Intent getIntent(Context context, String login, String password, long taskID) {
Intent intent = new Intent(context, EditTask.class); Intent intent = new Intent(context, EditTask.class);
intent.putExtra(PublicKeyNames.TOKEN_KEY, token); intent.putExtra(PublicKeyNames.LOGIN_KEY, login);
intent.putExtra(PublicKeyNames.PASSWORD_KEY, password);
intent.putExtra(TASK_ID_KEY, taskID); intent.putExtra(TASK_ID_KEY, taskID);
return intent; return intent;
} }
@@ -1,7 +1,6 @@
package com.example.tasktracker.Activities; package com.example.tasktracker.Activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
@@ -17,10 +16,6 @@ import com.example.tasktracker.R;
import com.example.tasktracker.databinding.ActivityLoginBinding; import com.example.tasktracker.databinding.ActivityLoginBinding;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import java.util.Objects;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer; import io.reactivex.rxjava3.functions.Consumer;
@@ -28,139 +23,117 @@ import io.reactivex.rxjava3.schedulers.Schedulers;
public class LoginActivity extends AppCompatActivity { public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LOGIN_ACTIVITY"; private static final String TAG = "LOGIN_ACTIVITY";
private ActivityLoginBinding binding; private ActivityLoginBinding binding;
private SharedPreferences sharedPreferences;
private final CompositeDisposable compositeDisposable = new CompositeDisposable(); private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public static Intent getIntent(Context context) { private String login;
return new Intent(context, LoginActivity.class); private String password;
}
@SuppressLint("UnsafeIntentLaunch") @SuppressLint("UnsafeIntentLaunch")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
login = getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).getString(PublicKeyNames.LOGIN_KEY, null);
password = getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).getString(PublicKeyNames.PASSWORD_KEY, null);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
binding = ActivityLoginBinding.inflate(getLayoutInflater()); binding = ActivityLoginBinding.inflate(getLayoutInflater());
EdgeToEdge.enable(this); EdgeToEdge.enable(this);
setContentView(binding.getRoot()); setContentView(binding.getRoot());
sharedPreferences = getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE); if(login != null && password != null)
String token = sharedPreferences.getString(PublicKeyNames.TOKEN_KEY, ""); SingIn();
if(!token.isEmpty())
{
Disposable disposable = ApiFactory.getApiService()
.checkToken(token)
.observeOn(Schedulers.io()).subscribe(new Consumer<LoginAnswer>() {
@Override
public void accept(LoginAnswer loginAnswer) throws Throwable {
if(loginAnswer.getStatus().equals("ok")) {
Intent intent = MainMenu.getIntent(LoginActivity.this, token);
startActivity(intent);
finish();
} else {
sharedPreferences.edit().putString(PublicKeyNames.TOKEN_KEY, "").apply();
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Throwable {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.e(TAG, Objects.requireNonNull(throwable.getMessage()));
}
});
compositeDisposable.add(disposable);
}
binding.buttonSingIn.setOnClickListener(v->{ SingIn(); }); binding.buttonSingIn.setOnClickListener(v->{
login = binding.fieldLogin.getText().toString();
password = binding.fieldPassword.getText().toString();
if(login.isEmpty())
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterLogin, Snackbar.LENGTH_SHORT).show();
if(password.isEmpty())
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
binding.buttonSingUp.setOnClickListener(v->{ SingUp(); }); SingIn();
});
binding.buttonSingUp.setOnClickListener(v->{
login = binding.fieldLogin.getText().toString();
password = binding.fieldPassword.getText().toString();
if(login.isEmpty())
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterLogin, Snackbar.LENGTH_SHORT).show();
if(password.isEmpty())
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
SingUp();
});
binding.buttonOffline.setOnClickListener(v->{ binding.buttonOffline.setOnClickListener(v->{
Intent intent = MainMenu.getIntent(this, "null"); startActivity(MainMenu.getIntent(this, null,null));
startActivity(intent);
finish(); finish();
}); });
} }
private void SingIn() private void SingIn() {
{ Disposable disposable = ApiFactory.getApiService().singin(login, password)
String login = binding.fieldLogin.getText().toString(); .subscribeOn(Schedulers.io()).subscribe(new Consumer<LoginAnswer>() {
if(login.isEmpty())
{
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterLogin, Snackbar.LENGTH_SHORT).show();
return;
}
String pass = binding.fieldPassword.getText().toString();
if(pass.isEmpty())
{
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
Single<LoginAnswer> loginAnswer = ApiFactory.getApiService().singin(login, pass);
Disposable disposable = loginAnswer
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<LoginAnswer>() {
@Override @Override
public void accept(LoginAnswer loginAnswer) throws Throwable { public void accept(LoginAnswer loginAnswer) throws Throwable {
if (loginAnswer.getStatus().equals("error")) { if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return;
}
else if (loginAnswer.getStatus().equals("error")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return; return;
} }
String token = loginAnswer.getToken(); @SuppressLint("UnsafeIntentLaunch") Intent intent = MainMenu.getIntent(LoginActivity.this, login, password);
sharedPreferences.edit().putString(PublicKeyNames.TOKEN_KEY, token).apply(); startActivity(intent);
OpenMainMenu(token); finish();
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).edit()
.putString(PublicKeyNames.LOGIN_KEY, login)
.putString(PublicKeyNames.PASSWORD_KEY, password)
.apply();
} }
}, new Consumer<Throwable>() { }, new Consumer<Throwable>() {
@Override @Override
public void accept(Throwable throwable) throws Throwable { public void accept(Throwable throwable) throws Throwable {
Log.w(TAG, throwable.toString()); Log.e(TAG, throwable.getMessage());
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
} }
}); });
compositeDisposable.add(disposable); compositeDisposable.add(disposable);
} }
private void SingUp() {
private void SingUp() Disposable disposable = ApiFactory.getApiService().singup(login, password)
{ .subscribeOn(Schedulers.io()).subscribe(new Consumer<LoginAnswer>() {
String login = binding.fieldLogin.getText().toString();
if(login.isEmpty())
{
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterLogin, Snackbar.LENGTH_SHORT).show();
return;
}
String pass = binding.fieldPassword.getText().toString();
if(pass.isEmpty())
{
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
Single<LoginAnswer> loginAnswer = ApiFactory.getApiService().singup(login, pass);
Disposable disposable = loginAnswer
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<LoginAnswer>() {
@Override @Override
public void accept(LoginAnswer loginAnswer) throws Throwable { public void accept(LoginAnswer loginAnswer) throws Throwable {
if (loginAnswer.getStatus().equals("error")) { if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_AlredyCreated, Snackbar.LENGTH_LONG).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return;
}
else if (loginAnswer.getStatus().equals("error")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_AlredyCreated, Snackbar.LENGTH_SHORT).show();
return; return;
} }
String token = loginAnswer.getToken(); @SuppressLint("UnsafeIntentLaunch") Intent intent = MainMenu.getIntent(LoginActivity.this, login, password);
sharedPreferences.edit().putString(PublicKeyNames.TOKEN_KEY, token).apply(); startActivity(intent);
OpenMainMenu(token); finish();
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).edit()
.putString(PublicKeyNames.LOGIN_KEY, login)
.putString(PublicKeyNames.PASSWORD_KEY, password)
.apply();
} }
}, new Consumer<Throwable>() { }, new Consumer<Throwable>() {
@Override @Override
public void accept(Throwable throwable) throws Throwable { public void accept(Throwable throwable) throws Throwable {
Log.e(TAG, throwable.getMessage());
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.w(TAG, throwable.toString());
} }
}); });
compositeDisposable.add(disposable); compositeDisposable.add(disposable);
@@ -171,12 +144,4 @@ public class LoginActivity extends AppCompatActivity {
super.onDestroy(); super.onDestroy();
compositeDisposable.dispose(); compositeDisposable.dispose();
} }
private void OpenMainMenu(String token)
{
@SuppressLint("UnsafeIntentLaunch")
Intent intent = MainMenu.getIntent(this, token);
startActivity(intent);
finish();
}
} }
@@ -3,7 +3,6 @@ package com.example.tasktracker.Activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.Editable; import android.text.Editable;
@@ -38,7 +37,8 @@ public class MainMenu extends AppCompatActivity {
private static final String TAG = "MainMenu"; private static final String TAG = "MainMenu";
private ActivityMainMenuBinding binding; private ActivityMainMenuBinding binding;
private String token; private String login;
private String password;
private TaskAdapter taskAdapter; private TaskAdapter taskAdapter;
private MainMenuViewModel viewModel; private MainMenuViewModel viewModel;
private List<Task> taskListCache = new ArrayList<>(); private List<Task> taskListCache = new ArrayList<>();
@@ -49,16 +49,11 @@ public class MainMenu extends AppCompatActivity {
binding = ActivityMainMenuBinding.inflate(getLayoutInflater()); binding = ActivityMainMenuBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); setContentView(binding.getRoot());
token = getIntent().getStringExtra(PublicKeyNames.TOKEN_KEY);
if (token == null) {
Log.e(TAG, "Token is empty");
return;
}
taskAdapter = new TaskAdapter(); taskAdapter = new TaskAdapter();
binding.scrollTask.setAdapter(taskAdapter); binding.scrollTask.setAdapter(taskAdapter);
binding.buttonAddNewTask.setOnClickListener(v -> { binding.buttonAddNewTask.setOnClickListener(v -> {
Intent intent = AddNewTask.getIntent(this, token); Intent intent = AddNewTask.getIntent(this, login, password);
startActivity(intent); startActivity(intent);
}); });
taskAdapter.setOnItemClick(new TaskAdapter.OnItemClick() { taskAdapter.setOnItemClick(new TaskAdapter.OnItemClick() {
@@ -66,7 +61,7 @@ public class MainMenu extends AppCompatActivity {
public void Click(int position) { public void Click(int position) {
Task task = taskAdapter.getTaskList().get(position); Task task = taskAdapter.getTaskList().get(position);
@SuppressLint("UnsafeIntentLaunch") @SuppressLint("UnsafeIntentLaunch")
Intent intent = EditTask.getIntent(MainMenu.this, token, task.getID()); Intent intent = EditTask.getIntent(MainMenu.this, login, password, task.getId());
startActivity(intent); startActivity(intent);
} }
}); });
@@ -82,7 +77,7 @@ public class MainMenu extends AppCompatActivity {
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String find = binding.findLine.getText().toString(); String find = binding.findLine.getText().toString();
if (find.isEmpty()) { if (find.isEmpty()) {
if (token.equals("null")) { if (login.equals("null")) {
TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(MainMenu.this, new Observer<List<Task>>() { TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(MainMenu.this, new Observer<List<Task>>() {
@Override @Override
public void onChanged(List<Task> tasks) { public void onChanged(List<Task> tasks) {
@@ -91,7 +86,7 @@ public class MainMenu extends AppCompatActivity {
} }
}); });
} else { } else {
viewModel.OnlineUpdateList(token); viewModel.OnlineUpdateList(login, password);
} }
} }
new Thread(new Runnable() { new Thread(new Runnable() {
@@ -99,7 +94,7 @@ public class MainMenu extends AppCompatActivity {
public void run() { public void run() {
List<Task> searchList = new ArrayList<>(); List<Task> searchList = new ArrayList<>();
for (int i = 0; i < taskListCache.size(); i++) { for (int i = 0; i < taskListCache.size(); i++) {
if (taskListCache.get(i).getTaskName().toLowerCase().contains(charSequence) || if (taskListCache.get(i).getTaskTime().toLowerCase().contains(charSequence) ||
taskListCache.get(i).getTaskDescription().toLowerCase().contains(charSequence)) { taskListCache.get(i).getTaskDescription().toLowerCase().contains(charSequence)) {
searchList.add(taskListCache.get(i)); searchList.add(taskListCache.get(i));
} }
@@ -123,135 +118,130 @@ public class MainMenu extends AppCompatActivity {
binding.buttonSingOut.setOnClickListener(v -> { binding.buttonSingOut.setOnClickListener(v -> {
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE). getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).
edit(). edit().
remove(PublicKeyNames.TOKEN_KEY). remove(PublicKeyNames.LOGIN_KEY).
remove(PublicKeyNames.PASSWORD_KEY).
apply(); apply();
@SuppressLint("UnsafeIntentLaunch") @SuppressLint("UnsafeIntentLaunch")
Intent intent = LoginActivity.getIntent(MainMenu.this); Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent); startActivity(intent);
finish(); finish();
}); });
// offline viewModel.getOnLoad().observe(this, new Observer<List<Task>>() {
if (token.equals("null")) { @Override
Offline(); public void onChanged(List<Task> tasks) {
} taskListCache = tasks;
//online taskAdapter.setTaskList(tasks);
else {
Online();
} }
});
login = getIntent().getStringExtra(PublicKeyNames.LOGIN_KEY);
password = getIntent().getStringExtra(PublicKeyNames.PASSWORD_KEY);
// offline
if (login == null || password == null) {
Offline();
} }
//online
else {
Online();
}
}
public void Offline () { public void Offline() {
viewModel.getOnLoad().observe(this, new Observer<List<Task>>() { ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
@Override ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
public void onChanged(List<Task> tasks) { @Override
taskListCache = tasks; public boolean onMove(@NonNull RecyclerView recyclerView,
taskAdapter.setTaskList(tasks); @NonNull RecyclerView.ViewHolder viewHolder,
} @NonNull RecyclerView.ViewHolder target) {
}); return false;
}
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, @Override
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
@Override int position = viewHolder.getAdapterPosition();
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override Task task = taskAdapter.getItem(position);
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { new Thread(new Runnable() {
int position = viewHolder.getAdapterPosition(); @Override
public void run() {
Task task = taskAdapter.getItem(position); TaskRepository.newInstance(getApplication()).taskDao().delete(task);
new Thread(new Runnable() { for (int i = 0; i < taskListCache.size(); ++i) {
@Override if (taskListCache.get(i).getId() == task.getId()) {
public void run() { taskListCache.remove(i);
TaskRepository.newInstance(getApplication()).taskDao().delete(task); break;
for (int i = 0; i < taskListCache.size(); ++i) {
if (taskListCache.get(i).getID() == task.getID()) {
taskListCache.remove(i);
break;
}
} }
} }
}).start(); }
taskAdapter.removeItemByPosition(position); }).start();
} taskAdapter.removeItemByPosition(position);
}); }
helper.attachToRecyclerView(binding.scrollTask); });
} helper.attachToRecyclerView(binding.scrollTask);
}
private void Online () { private void Online() {
viewModel.onFail().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.w(TAG, s);
}
});
viewModel.getOnLoad().observe(this, new Observer<List<Task>>() { ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
Task task = taskAdapter.getItem(position);
ApiFactory.getApiService().removeTask(login, password, task.getId()).enqueue(new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
Task task = taskAdapter.getItem(position);
taskAdapter.removeItemByPosition(position);
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable throwable) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.w(TAG, Objects.requireNonNull(throwable.getMessage()));
}
});
}
});
helper.attachToRecyclerView(binding.scrollTask);
}
@Override
protected void onResume() {
super.onResume();
if (login == null || password == null) {
TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(this, new Observer<List<Task>>() {
@Override @Override
public void onChanged(List<Task> tasks) { public void onChanged(List<Task> tasks) {
taskListCache = tasks; taskListCache = tasks;
taskAdapter.setTaskList(tasks); taskAdapter.setTaskList(tasks);
} }
}); });
viewModel.onFail().observe(this, new Observer<String>() { } else {
@Override viewModel.OnlineUpdateList(login, password);
public void onChanged(String s) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.w(TAG, s);
}
});
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
Task task = taskAdapter.getItem(position);
ApiFactory.getApiService().removeTask(token, task.getID()).enqueue(new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
Task task = taskAdapter.getItem(position);
taskAdapter.removeItemByPosition(position);
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable throwable) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
Log.w(TAG, Objects.requireNonNull(throwable.getMessage()));
}
});
}
});
helper.attachToRecyclerView(binding.scrollTask);
} }
}
@Override public static Intent getIntent(Context context, String login, String password) {
protected void onResume () { Intent intent = new Intent(context, MainMenu.class);
super.onResume(); intent.putExtra(PublicKeyNames.LOGIN_KEY, login);
if (token.equals("null")) { intent.putExtra(PublicKeyNames.PASSWORD_KEY, password);
TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(this, new Observer<List<Task>>() { return intent;
@Override }
public void onChanged(List<Task> tasks) {
taskListCache = tasks;
taskAdapter.setTaskList(tasks);
}
});
} else {
viewModel.OnlineUpdateList(token);
}
}
public static Intent getIntent (Context context, String token){ }
Intent intent = new Intent(context, MainMenu.class);
intent.putExtra(PublicKeyNames.TOKEN_KEY, token);
return intent;
}
}
@@ -41,7 +41,7 @@ public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder
Task task = taskList.get(position); Task task = taskList.get(position);
holder.binding.TaskName.setText(task.getTaskName()); holder.binding.TaskName.setText(task.getTaskName());
holder.binding.TaskDescription.setText(task.getTaskDescription()); holder.binding.TaskDescription.setText(task.getTaskDescription());
holder.binding.TaskDate.setText(task.getTaskDate()); holder.binding.TaskDate.setText(task.getTaskDate() + ' ' + task.getTaskTime());
holder.binding.getRoot().setOnClickListener(v->{ holder.binding.getRoot().setOnClickListener(v->{
if(onItemClick != null) if(onItemClick != null)
onItemClick.Click(position); onItemClick.Click(position);
@@ -35,9 +35,9 @@ public class AddItemViewModel extends AndroidViewModel {
}).start(); }).start();
} }
public void OnlineSaveData(Task task, String token) { public void OnlineSaveData(Task task, String login, String password) {
Call<Void> send = ApiFactory.getApiService().editTask(token, task); Call<Void> send = ApiFactory.getApiService().editTask(login, password, task);
send.enqueue(new Callback<Void>() { send.enqueue(new Callback<Void>() {
@Override @Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) { public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
@@ -45,9 +45,9 @@ public class EditTaskViewModel extends AndroidViewModel {
}).start(); }).start();
} }
public void OnlineSaveData(Task task, String token) { public void OnlineSaveData(Task task, String login, String password) {
Call<Void> send = ApiFactory.getApiService().editTask(token, task); Call<Void> send = ApiFactory.getApiService().editTask(login, password, task);
send.enqueue(new Callback<Void>() { send.enqueue(new Callback<Void>() {
@Override @Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) { public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
@@ -72,8 +72,8 @@ public class EditTaskViewModel extends AndroidViewModel {
}); });
} }
public void LoadTaskOnline(String token, long taskID) { public void LoadTaskOnline(String login, String password, long taskID) {
Disposable disposable = ApiFactory.getApiService().getTask(token, taskID) Disposable disposable = ApiFactory.getApiService().getTask(login, password, taskID)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<Task>() { .subscribeOn(Schedulers.io()).subscribe(new Consumer<Task>() {
@Override @Override
public void accept(Task task) throws Throwable { public void accept(Task task) throws Throwable {
@@ -28,8 +28,8 @@ public class MainMenuViewModel extends AndroidViewModel {
super(application); super(application);
} }
public void OnlineUpdateList(String token) { public void OnlineUpdateList(String login, String password) {
Single<ArrayList<Task>> single = ApiFactory.getApiService().getTaskList(token); Single<ArrayList<Task>> single = ApiFactory.getApiService().getTaskList(login, password);
Disposable disposable = single.subscribeOn(Schedulers.io()).subscribe(new Consumer<ArrayList<Task>>() { Disposable disposable = single.subscribeOn(Schedulers.io()).subscribe(new Consumer<ArrayList<Task>>() {
@Override @Override
public void accept(ArrayList<Task> tasks) throws Throwable { public void accept(ArrayList<Task> tasks) throws Throwable {
@@ -8,14 +8,7 @@ public class LoginAnswer implements Serializable {
@SerializedName("status") @SerializedName("status")
private String status; private String status;
@SerializedName("token")
private String token;
public String getStatus() { public String getStatus() {
return status; return status;
} }
public String getToken() {
return token;
}
} }
@@ -1,84 +1,72 @@
package com.example.tasktracker.Answers; package com.example.tasktracker.Answers;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Expose;
import java.io.Serializable;
import java.util.Objects;
@Entity(tableName = "task_room") @Entity(tableName = "task_room")
public class Task implements Serializable { public class Task {
@PrimaryKey(autoGenerate = false)
@SerializedName("id") @SerializedName("id")
private long ID; @PrimaryKey(autoGenerate = true)
private long id;
@SerializedName("taskName")
private String TaskName;
@SerializedName("taskDescription")
private String TaskDescription;
@SerializedName("taskDate") @SerializedName("taskDate")
private String TaskDate; private String taskDate;
@SerializedName("taskName")
public Task() { private String taskName;
@SerializedName("taskDescription")
private String taskDescription;
@SerializedName("taskTime")
private String taskTime;
public Task(long id, String taskDate, String taskName, String taskDescription, String taskTime) {
this.id = id;
this.taskDate = taskDate;
this.taskName = taskName;
this.taskDescription = taskDescription;
this.taskTime = taskTime;
} }
@Ignore public long getId() {
public Task(long ID, String TaskName, String TaskDescription, String TaskDate) { return id;
this.TaskName = TaskName;
this.TaskDescription = TaskDescription;
this.TaskDate = TaskDate;
this.ID = ID;
} }
public String getTaskName() { public void setId(long id) {
return TaskName; this.id = id;
}
public String getTaskDescription() {
return TaskDescription;
} }
public String getTaskDate() { public String getTaskDate() {
return TaskDate; return taskDate;
}
public long getID() {
return ID;
}
public void setTaskName(String taskName) {
TaskName = taskName;
}
public void setTaskDescription(String taskDescription) {
TaskDescription = taskDescription;
} }
public void setTaskDate(String taskDate) { public void setTaskDate(String taskDate) {
TaskDate = taskDate; this.taskDate = taskDate;
} }
public void setID(long id) { public String getTaskName() {
ID = id; return taskName;
} }
public void setTaskName(String taskName) {
@Override this.taskName = taskName;
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Task task = (Task) o;
return ID == task.ID && Objects.equals(TaskName, task.TaskName) && Objects.equals(TaskDescription, task.TaskDescription) && Objects.equals(TaskDate, task.TaskDate);
} }
@Override public String getTaskDescription() {
public int hashCode() { return taskDescription;
return Objects.hash(ID, TaskName, TaskDescription, TaskDate);
} }
public void setTaskDescription(String taskDescription) {
this.taskDescription = taskDescription;
}
public String getTaskTime() {
return taskTime;
}
public void setTaskTime(String taskTime) {
this.taskTime = taskTime;
}
} }
@@ -5,7 +5,8 @@ import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
public class ApiFactory { public class ApiFactory {
private static final String BASE_URL = "http://147.45.255.215:8080/"; //private static final String BASE_URL = "http://147.45.255.215:8080/";
private static final String BASE_URL = "http://192.168.0.3:8080/";
private static ApiService apiService = null; private static ApiService apiService = null;
@@ -13,9 +13,6 @@ import retrofit2.http.POST;
import retrofit2.http.Query; import retrofit2.http.Query;
public interface ApiService { public interface ApiService {
@GET("user")
Single<LoginAnswer> checkToken(@Query("token") String token);
@GET("singin") @GET("singin")
Single<LoginAnswer> singin(@Query("login") String login, @Query("password") String password); Single<LoginAnswer> singin(@Query("login") String login, @Query("password") String password);
@@ -23,14 +20,14 @@ public interface ApiService {
Single<LoginAnswer> singup(@Query("login") String login, @Query("password") String password); Single<LoginAnswer> singup(@Query("login") String login, @Query("password") String password);
@GET("user/task") @GET("user/task")
Single<Task> getTask(@Query("token") String token, @Query("id") long id); Single<Task> getTask(@Query("login") String login, @Query("password") String password, @Query("id") long id);
@GET("user/task/list") @GET("user/task/list")
Single<ArrayList<Task>> getTaskList(@Query("token") String token); Single<ArrayList<Task>> getTaskList(@Query("login") String login, @Query("password") String password);
@POST("user/task/edit") @POST("user/task/edit")
Call<Void> editTask(@Query("token") String token, @Body Task task); Call<Void> editTask(@Query("login") String login, @Query("password") String password, @Body Task task);
@POST("user/task/remove") @POST("user/task/remove")
Call<Void> removeTask(@Query("token") String token, @Query("id") long ID); Call<Void> removeTask(@Query("login") String login, @Query("password") String password, @Query("id") long ID);
} }
@@ -2,5 +2,6 @@ package com.example.tasktracker;
public abstract class PublicKeyNames { public abstract class PublicKeyNames {
public static final String TOKEN_LIST = "token_list"; public static final String TOKEN_LIST = "token_list";
public static final String TOKEN_KEY = "TOKEN"; public static final String LOGIN_KEY = "LOGIN";
public static final String PASSWORD_KEY = "PASSWORD";
} }
+2 -3
View File
@@ -18,10 +18,8 @@
<string name="snackbar_InvalidLogin">Incorrect login or password</string> <string name="snackbar_InvalidLogin">Incorrect login or password</string>
<string name="snackbar_AlredyCreated">This accaunt alredy created</string> <string name="snackbar_AlredyCreated">This accaunt alredy created</string>
<string name="snackbar_InternetError">Something went wrong. Check your internet connection.</string> <string name="snackbar_InternetError">Something went wrong. Check your internet connection.</string>
<string name="snackebar_FailUpdateTaskList">Fail update task list!</string> <string name="snackbar_FailUpdateTaskList">Fail update task list!</string>
<string name="snackbar_EnterName">Enter task name</string> <string name="snackbar_EnterName">Enter task name</string>
<string name="snackbar_EnterDate">Enter task date</string>
<string name="snackbar_EnterTime">Enter time</string>
<string name="snackbar_DataBaseError">Something went wrong.</string> <string name="snackbar_DataBaseError">Something went wrong.</string>
<string name="button_editTask">Edit task</string> <string name="button_editTask">Edit task</string>
<string name="button_YES">Yes</string> <string name="button_YES">Yes</string>
@@ -29,4 +27,5 @@
<string name="hint_Month">Month</string> <string name="hint_Month">Month</string>
<string name="hint_Yar">Year</string> <string name="hint_Yar">Year</string>
<string name="hint_Hour">Hour</string> <string name="hint_Hour">Hour</string>
<string name="snackbar_BigLoginPassword">Login or password is too long.</string>
</resources> </resources>
+3 -4
View File
@@ -18,10 +18,8 @@
<string name="snackbar_InvalidLogin">Неправильный логин или пароль</string> <string name="snackbar_InvalidLogin">Неправильный логин или пароль</string>
<string name="snackbar_AlredyCreated">Этот аккаунт уже создан</string> <string name="snackbar_AlredyCreated">Этот аккаунт уже создан</string>
<string name="snackbar_InternetError">Что-то пошло не так. Проверьте подключение к интернету.</string> <string name="snackbar_InternetError">Что-то пошло не так. Проверьте подключение к интернету.</string>
<string name="snackebar_FailUpdateTaskList">Неудалось обновить список задач!</string> <string name="snackbar_FailUpdateTaskList">Неудалось обновить список задач!</string>
<string name="snackbar_EnterName">Введите назвние</string> <string name="snackbar_EnterName">Введите нзвание</string>
<string name="snackbar_EnterDate">Введите дату</string>
<string name="snackbar_EnterTime">Введите время</string>
<string name="snackbar_DataBaseError">Что-то пошло не так</string> <string name="snackbar_DataBaseError">Что-то пошло не так</string>
<string name="button_editTask">Редакировать</string> <string name="button_editTask">Редакировать</string>
<string name="button_YES">Да</string> <string name="button_YES">Да</string>
@@ -29,4 +27,5 @@
<string name="hint_Month">Месяц</string> <string name="hint_Month">Месяц</string>
<string name="hint_Yar">Год</string> <string name="hint_Yar">Год</string>
<string name="hint_Hour">Час</string> <string name="hint_Hour">Час</string>
<string name="snackbar_BigLoginPassword">Логин или пороль слишком длинный.</string>
</resources> </resources>
+2 -3
View File
@@ -31,10 +31,9 @@
<string name="snackbar_InvalidLogin">Incorrect login or password</string> <string name="snackbar_InvalidLogin">Incorrect login or password</string>
<string name="snackbar_AlredyCreated">This accaunt alredy created</string> <string name="snackbar_AlredyCreated">This accaunt alredy created</string>
<string name="snackbar_InternetError">Something went wrong. Check your internet connection.</string> <string name="snackbar_InternetError">Something went wrong. Check your internet connection.</string>
<string name="snackebar_FailUpdateTaskList">Fail update task list!</string> <string name="snackbar_FailUpdateTaskList">Fail update task list!</string>
<string name="snackbar_EnterName">Enter task name</string> <string name="snackbar_EnterName">Enter task name</string>
<string name="snackbar_EnterDate">Enter task date</string>
<string name="snackbar_EnterTime">Enter time</string>
<string name="snackbar_DataBaseError">Something went wrong.</string> <string name="snackbar_DataBaseError">Something went wrong.</string>
<string name="snackbar_BigLoginPassword">Login or password is too long.</string>
</resources> </resources>
+7216
View File
File diff suppressed because it is too large Load Diff