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