Update
This commit is contained in:
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -4,7 +4,7 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "com.example.tasktracker"
|
||||
compileSdk = 35
|
||||
compileSdk = 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.example.tasktracker"
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
android:theme="@style/Theme.TaskTracker"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:targetApi="31">
|
||||
|
||||
<activity
|
||||
android:name=".Activities.EditTask"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".Activities.AddNewTask"
|
||||
android:exported="false" />
|
||||
|
||||
@@ -1,28 +1,32 @@
|
||||
package com.example.tasktracker.Activities;
|
||||
|
||||
import android.app.DatePickerDialog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.DatePicker;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.example.tasktracker.Activities.ViewModels.AddItemViewModel;
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.PublicKeyNames;
|
||||
import com.example.tasktracker.R;
|
||||
import com.example.tasktracker.databinding.ActivityAddNewTaskBinding;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class AddNewTask extends AppCompatActivity {
|
||||
public class AddNewTask extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
|
||||
private static final String TAG = "ADD_NEW_TASK";
|
||||
private static final String TOKEN_KEY = "TOKEN";
|
||||
|
||||
private ActivityAddNewTaskBinding binding;
|
||||
private static String token;
|
||||
private AddItemViewModel viewModel;
|
||||
private String stringDate = "";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -30,13 +34,20 @@ public class AddNewTask extends AppCompatActivity {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
token = getIntent().getStringExtra(TOKEN_KEY);
|
||||
token = getIntent().getStringExtra(PublicKeyNames.TOKEN_KEY);
|
||||
if(token == null)
|
||||
{
|
||||
Log.w(TAG, "Token is null");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
binding.btnDatePick.setOnClickListener(v->{
|
||||
DatePickerFragment fragment;
|
||||
fragment = new DatePickerFragment();
|
||||
fragment.show(getSupportFragmentManager(), "DATE PICK");
|
||||
});
|
||||
|
||||
viewModel = new ViewModelProvider(this).get(AddItemViewModel.class);
|
||||
viewModel.getClose().observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
@@ -60,19 +71,18 @@ public class AddNewTask extends AppCompatActivity {
|
||||
binding.AddTask.setOnClickListener(v->{
|
||||
String name = binding.TaskName.getText().toString();
|
||||
String description = binding.TaskDescription.getText().toString();
|
||||
String date = getDate();
|
||||
|
||||
if(name.isEmpty()) {
|
||||
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
if(date.isEmpty()) {
|
||||
if(stringDate.isEmpty()) {
|
||||
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterDate, Snackbar.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
long ID = generateID(name, description, date);
|
||||
Task task = new Task(ID, name, description, date);
|
||||
long ID = generateID(name, description, stringDate);
|
||||
Task task = new Task(ID, name, description, stringDate);
|
||||
viewModel.OfflineSaveData(task);
|
||||
});
|
||||
}
|
||||
@@ -88,7 +98,7 @@ public class AddNewTask extends AppCompatActivity {
|
||||
binding.AddTask.setOnClickListener(v->{
|
||||
String name = binding.TaskName.getText().toString();
|
||||
String description = binding.TaskDescription.getText().toString();
|
||||
String date = getDate();
|
||||
String date = binding.btnDatePick.getText().toString();
|
||||
|
||||
if(name.isEmpty()) {
|
||||
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterName, Snackbar.LENGTH_SHORT).show();
|
||||
@@ -105,16 +115,6 @@ public class AddNewTask extends AppCompatActivity {
|
||||
});
|
||||
}
|
||||
|
||||
private String getDate() {
|
||||
String day = binding.day.getText().toString();
|
||||
String month = binding.month.getText().toString();
|
||||
String year = binding.year.getText().toString();
|
||||
String minute = binding.minute.getText().toString();
|
||||
String hour = binding.hour.getText().toString();
|
||||
|
||||
return day + '.' + month + '.' + year + ' ' + minute + ':' + hour;
|
||||
}
|
||||
|
||||
private long generateID(String name, String Description, String date) {
|
||||
Random rand = new Random();
|
||||
|
||||
@@ -129,7 +129,15 @@ public class AddNewTask extends AppCompatActivity {
|
||||
|
||||
public static Intent getIntent(Context context, String token) {
|
||||
Intent intent = new Intent(context, AddNewTask.class);
|
||||
intent.putExtra(TOKEN_KEY, token);
|
||||
intent.putExtra(PublicKeyNames.TOKEN_KEY, token);
|
||||
return intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
|
||||
stringDate = Integer.toString(day) + '.'
|
||||
+ Integer.toString(month) + '.'
|
||||
+ Integer.toString(year);
|
||||
binding.btnDatePick.setText(stringDate);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.example.tasktracker.Activities;
|
||||
|
||||
import android.app.DatePickerDialog;
|
||||
import android.app.Dialog;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class DatePickerFragment extends DialogFragment {
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||
Calendar mCalendar = Calendar.getInstance();
|
||||
int year = mCalendar.get(Calendar.YEAR);
|
||||
int month = mCalendar.get(Calendar.MONTH);
|
||||
int dayOfMonth = mCalendar.get(Calendar.DAY_OF_MONTH);
|
||||
return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener)
|
||||
getActivity(), year, month, dayOfMonth);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
package com.example.tasktracker.Activities;
|
||||
|
||||
import android.app.DatePickerDialog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.DatePicker;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.example.tasktracker.Activities.ViewModels.EditTaskViewModel;
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.PublicKeyNames;
|
||||
import com.example.tasktracker.R;
|
||||
import com.example.tasktracker.databinding.ActivityEditTaskBinding;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
|
||||
private static final String TAG = "EDIT_TASK";
|
||||
private static final String TASK_ID_KEY = "TASK_ID";
|
||||
|
||||
private ActivityEditTaskBinding binding;
|
||||
private EditTaskViewModel viewModel;
|
||||
private String token;
|
||||
private long taskID = -1;
|
||||
private String taskDateString;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
viewModel = new EditTaskViewModel(getApplication());
|
||||
binding = ActivityEditTaskBinding.inflate(getLayoutInflater());
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
Intent intent = getIntent();
|
||||
taskID = intent.getLongExtra(TASK_ID_KEY, -1);
|
||||
if(taskID == -1) {
|
||||
Log.w(TAG, "No task id");
|
||||
return;
|
||||
}
|
||||
|
||||
binding.btnDatePick.setOnClickListener(v->{ // <-----
|
||||
DatePickerFragment fragment;
|
||||
fragment = new DatePickerFragment();
|
||||
fragment.show(getSupportFragmentManager(), "DATE PICK");
|
||||
});
|
||||
|
||||
viewModel.isLoading().observe(this, new Observer<Task>() {
|
||||
@Override
|
||||
public void onChanged(Task task) {
|
||||
binding.TaskName.setText(task.getTaskName());
|
||||
binding.TaskDescription.setText(task.getTaskDescription());
|
||||
taskDateString = task.getTaskDate();
|
||||
binding.btnDatePick.setText(taskDateString);
|
||||
}
|
||||
});
|
||||
viewModel.getClose().observe(this, new Observer<Boolean>() {
|
||||
@Override
|
||||
public void onChanged(Boolean aBoolean) {
|
||||
if(aBoolean)
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
token = intent.getStringExtra(PublicKeyNames.TOKEN_KEY);
|
||||
if(token == null)
|
||||
{
|
||||
Log.w(TAG, "Token is null");
|
||||
return;
|
||||
}
|
||||
|
||||
// Offline
|
||||
if(token.equals("null")) {
|
||||
Offline();
|
||||
}
|
||||
// Online
|
||||
else {
|
||||
Online();
|
||||
}
|
||||
}
|
||||
|
||||
private void Offline() {
|
||||
viewModel.LoadTaskOffline(taskID, this);
|
||||
binding.btnEditTask.setOnClickListener(v->{
|
||||
String name = binding.TaskName.getText().toString();
|
||||
String description = binding.TaskDescription.getText().toString();
|
||||
|
||||
Task task = new Task(taskID, name, description, taskDateString);
|
||||
viewModel.OfflineSaveData(task);
|
||||
});
|
||||
}
|
||||
|
||||
private void Online() {
|
||||
binding.btnEditTask.setOnClickListener(v->{
|
||||
String name = binding.TaskName.getText().toString();
|
||||
String description = binding.TaskDescription.getText().toString();
|
||||
|
||||
Task task = new Task(taskID, name, description, taskDateString);
|
||||
viewModel.OnlineSaveData(task, token);
|
||||
});
|
||||
viewModel.getLiveDataFail().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.LoadTaskOnline(token, taskID);
|
||||
}
|
||||
|
||||
public static Intent getIntent(Context context, String token, long taskID) {
|
||||
Intent intent = new Intent(context, EditTask.class);
|
||||
intent.putExtra(PublicKeyNames.TOKEN_KEY, token);
|
||||
intent.putExtra(TASK_ID_KEY, taskID);
|
||||
return intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
|
||||
taskDateString = Integer.toString(day) + '.'
|
||||
+ Integer.toString(month) + '.'
|
||||
+ Integer.toString(year);
|
||||
binding.btnDatePick.setText(taskDateString);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
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.util.Log;
|
||||
|
||||
@@ -10,10 +12,13 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.example.tasktracker.Answers.LoginAnswer;
|
||||
import com.example.tasktracker.Api.ApiFactory;
|
||||
import com.example.tasktracker.PublicKeyNames;
|
||||
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;
|
||||
@@ -24,7 +29,12 @@ import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
public class LoginActivity extends AppCompatActivity {
|
||||
private static final String TAG = "LOGIN_ACTIVITY";
|
||||
private ActivityLoginBinding binding;
|
||||
private CompositeDisposable compositeDisposable = new CompositeDisposable();
|
||||
private SharedPreferences sharedPreferences;
|
||||
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
|
||||
|
||||
public static Intent getIntent(Context context) {
|
||||
return new Intent(context, LoginActivity.class);
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeIntentLaunch")
|
||||
@Override
|
||||
@@ -34,6 +44,33 @@ public class LoginActivity extends AppCompatActivity {
|
||||
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);
|
||||
}
|
||||
|
||||
binding.buttonSingIn.setOnClickListener(v->{ SingIn(); });
|
||||
|
||||
binding.buttonSingUp.setOnClickListener(v->{ SingUp(); });
|
||||
@@ -74,6 +111,7 @@ public class LoginActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
String token = loginAnswer.getToken();
|
||||
sharedPreferences.edit().putString(PublicKeyNames.TOKEN_KEY, token).apply();
|
||||
OpenMainMenu(token);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@@ -115,6 +153,7 @@ public class LoginActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
String token = loginAnswer.getToken();
|
||||
sharedPreferences.edit().putString(PublicKeyNames.TOKEN_KEY, token).apply();
|
||||
OpenMainMenu(token);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@@ -127,6 +166,12 @@ public class LoginActivity extends AppCompatActivity {
|
||||
compositeDisposable.add(disposable);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
compositeDisposable.dispose();
|
||||
}
|
||||
|
||||
private void OpenMainMenu(String token)
|
||||
{
|
||||
@SuppressLint("UnsafeIntentLaunch")
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
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;
|
||||
@@ -15,15 +17,16 @@ import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.example.tasktracker.Activities.ViewModels.MainMenuViewModel;
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.Api.ApiFactory;
|
||||
import com.example.tasktracker.Api.TaskRepository;
|
||||
import com.example.tasktracker.PublicKeyNames;
|
||||
import com.example.tasktracker.R;
|
||||
import com.example.tasktracker.databinding.ActivityMainMenuBinding;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -33,14 +36,12 @@ import retrofit2.Response;
|
||||
|
||||
public class MainMenu extends AppCompatActivity {
|
||||
private static final String TAG = "MainMenu";
|
||||
private static final String TOKEN_KEY = "TOKEN";
|
||||
|
||||
private ActivityMainMenuBinding binding;
|
||||
private String token;
|
||||
private TaskAdapter taskAdapter;
|
||||
private MainMenuViewModel viewModel;
|
||||
|
||||
private List<Task> taskListCache;
|
||||
private List<Task> taskListCache = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -48,9 +49,8 @@ public class MainMenu extends AppCompatActivity {
|
||||
binding = ActivityMainMenuBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
token = getIntent().getStringExtra(TOKEN_KEY);
|
||||
if(token == null)
|
||||
{
|
||||
token = getIntent().getStringExtra(PublicKeyNames.TOKEN_KEY);
|
||||
if (token == null) {
|
||||
Log.e(TAG, "Token is empty");
|
||||
return;
|
||||
}
|
||||
@@ -61,6 +61,15 @@ public class MainMenu extends AppCompatActivity {
|
||||
Intent intent = AddNewTask.getIntent(this, token);
|
||||
startActivity(intent);
|
||||
});
|
||||
taskAdapter.setOnItemClick(new TaskAdapter.OnItemClick() {
|
||||
@Override
|
||||
public void Click(int position) {
|
||||
Task task = taskAdapter.getTaskList().get(position);
|
||||
@SuppressLint("UnsafeIntentLaunch")
|
||||
Intent intent = EditTask.getIntent(MainMenu.this, token, task.getID());
|
||||
startActivity(intent);
|
||||
}
|
||||
});
|
||||
viewModel = new ViewModelProvider(this).get(MainMenuViewModel.class);
|
||||
|
||||
binding.findLine.addTextChangedListener(new TextWatcher() {
|
||||
@@ -81,8 +90,7 @@ public class MainMenu extends AppCompatActivity {
|
||||
taskAdapter.setTaskList(tasks);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
viewModel.OnlineUpdateList(token);
|
||||
}
|
||||
}
|
||||
@@ -112,6 +120,18 @@ public class MainMenu extends AppCompatActivity {
|
||||
}
|
||||
});
|
||||
|
||||
binding.buttonSingOut.setOnClickListener(v -> {
|
||||
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).
|
||||
edit().
|
||||
remove(PublicKeyNames.TOKEN_KEY).
|
||||
apply();
|
||||
|
||||
@SuppressLint("UnsafeIntentLaunch")
|
||||
Intent intent = LoginActivity.getIntent(MainMenu.this);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
});
|
||||
|
||||
// offline
|
||||
if (token.equals("null")) {
|
||||
Offline();
|
||||
@@ -149,6 +169,12 @@ public class MainMenu extends AppCompatActivity {
|
||||
@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);
|
||||
@@ -217,15 +243,14 @@ public class MainMenu extends AppCompatActivity {
|
||||
taskAdapter.setTaskList(tasks);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
viewModel.OnlineUpdateList(token);
|
||||
}
|
||||
}
|
||||
|
||||
public static Intent getIntent (Context context, String token){
|
||||
Intent intent = new Intent(context, MainMenu.class);
|
||||
intent.putExtra(TOKEN_KEY, token);
|
||||
intent.putExtra(PublicKeyNames.TOKEN_KEY, token);
|
||||
return intent;
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -1,4 +1,4 @@
|
||||
package com.example.tasktracker.Activities;
|
||||
package com.example.tasktracker.Activities.ViewModels;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
@@ -7,7 +7,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.Api.ApiFactory;
|
||||
@@ -38,7 +37,7 @@ public class AddItemViewModel extends AndroidViewModel {
|
||||
|
||||
public void OnlineSaveData(Task task, String token) {
|
||||
|
||||
Call<Void> send = ApiFactory.getApiService().addTask(token, task);
|
||||
Call<Void> send = ApiFactory.getApiService().editTask(token, task);
|
||||
send.enqueue(new Callback<Void>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
package com.example.tasktracker.Activities.ViewModels;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.example.tasktracker.Activities.EditTask;
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.Api.ApiFactory;
|
||||
import com.example.tasktracker.Api.TaskDao;
|
||||
import com.example.tasktracker.Api.TaskRepository;
|
||||
|
||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
||||
import io.reactivex.rxjava3.disposables.Disposable;
|
||||
import io.reactivex.rxjava3.functions.Consumer;
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
||||
public class EditTaskViewModel extends AndroidViewModel {
|
||||
private static final String TAG = "EDIT_ITEM_VIEW_MODEL";
|
||||
|
||||
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
|
||||
private final MutableLiveData<Boolean> liveDataSave = new MutableLiveData<>();
|
||||
private final MutableLiveData<String> liveDataFail = new MutableLiveData<>();
|
||||
private final MutableLiveData<Task> liveDataLoad = new MutableLiveData<>();
|
||||
|
||||
public EditTaskViewModel(@NonNull Application application) {
|
||||
super(application);
|
||||
}
|
||||
|
||||
public void OfflineSaveData(Task task) {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
TaskRepository.newInstance(getApplication()).taskDao().addTask(task);
|
||||
liveDataSave.postValue(true);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
public void OnlineSaveData(Task task, String token) {
|
||||
|
||||
Call<Void> send = ApiFactory.getApiService().editTask(token, task);
|
||||
send.enqueue(new Callback<Void>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
|
||||
Log.d(TAG, "Task update successfully");
|
||||
liveDataSave.postValue(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable throwable) {
|
||||
Log.w(TAG, throwable.toString());
|
||||
liveDataFail.postValue(throwable.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void LoadTaskOffline(long taskID, EditTask owner) {
|
||||
TaskRepository.newInstance(getApplication()).taskDao().getTask(taskID).observe(owner, new Observer<Task>() {
|
||||
@Override
|
||||
public void onChanged(Task task) {
|
||||
liveDataLoad.postValue(task);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void LoadTaskOnline(String token, long taskID) {
|
||||
Disposable disposable = ApiFactory.getApiService().getTask(token, taskID)
|
||||
.subscribeOn(Schedulers.io()).subscribe(new Consumer<Task>() {
|
||||
@Override
|
||||
public void accept(Task task) throws Throwable {
|
||||
liveDataLoad.postValue(task);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@Override
|
||||
public void accept(Throwable throwable) throws Throwable {
|
||||
liveDataFail.postValue(throwable.getMessage());
|
||||
}
|
||||
});
|
||||
compositeDisposable.add(disposable);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCleared() {
|
||||
super.onCleared();
|
||||
compositeDisposable.dispose();
|
||||
}
|
||||
|
||||
public LiveData<Task> isLoading() {
|
||||
return liveDataLoad;
|
||||
}
|
||||
public LiveData<String> getLiveDataFail() {
|
||||
return liveDataFail;
|
||||
}
|
||||
public LiveData<Boolean> getClose() {
|
||||
return liveDataSave;
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -1,4 +1,4 @@
|
||||
package com.example.tasktracker.Activities;
|
||||
package com.example.tasktracker.Activities.ViewModels;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
@@ -6,11 +6,9 @@ import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.example.tasktracker.Answers.Task;
|
||||
import com.example.tasktracker.Api.ApiFactory;
|
||||
import com.example.tasktracker.Api.TaskRepository;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -30,10 +30,10 @@ public class Task implements Serializable {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public Task(long ID, String TaskName, String TaskDescription, String TaskData) {
|
||||
public Task(long ID, String TaskName, String TaskDescription, String TaskDate) {
|
||||
this.TaskName = TaskName;
|
||||
this.TaskDescription = TaskDescription;
|
||||
this.TaskDate = TaskData;
|
||||
this.TaskDate = TaskDate;
|
||||
this.ID = ID;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@ 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);
|
||||
|
||||
@@ -20,10 +23,13 @@ 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);
|
||||
|
||||
@GET("user/task/list")
|
||||
Single<ArrayList<Task>> getTaskList(@Query("token") String token);
|
||||
|
||||
@POST("user/task/add")
|
||||
Call<Void> addTask(@Query("token") String token, @Body Task task);
|
||||
@POST("user/task/edit")
|
||||
Call<Void> editTask(@Query("token") String token, @Body Task task);
|
||||
|
||||
@POST("user/task/remove")
|
||||
Call<Void> removeTask(@Query("token") String token, @Query("id") long ID);
|
||||
|
||||
@@ -18,6 +18,9 @@ public interface TaskDao {
|
||||
@Query("SELECT * FROM task_room")
|
||||
LiveData<List<Task>> getTaskList();
|
||||
|
||||
@Query("SELECT * FROM task_room ORDER BY (:id)")
|
||||
LiveData<Task> getTask(long id);
|
||||
|
||||
@Query("DELETE FROM task_room")
|
||||
void DropTable();
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.example.tasktracker;
|
||||
|
||||
public abstract class PublicKeyNames {
|
||||
public static final String TOKEN_LIST = "token_list";
|
||||
public static final String TOKEN_KEY = "TOKEN";
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.0 KiB |
@@ -21,56 +21,17 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textMultiLine"/>
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
<Button
|
||||
android:id="@+id/btnDatePick"
|
||||
android:text="@string/button_DefaultData"
|
||||
android:layout_width="200sp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
<EditText
|
||||
android:id="@+id/day"
|
||||
android:hint="@string/hint_Day"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:inputType="numberDecimal"/>
|
||||
<EditText
|
||||
android:id="@+id/month"
|
||||
android:hint="@string/hint_Month"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:inputType="numberDecimal"/>
|
||||
<EditText
|
||||
android:id="@+id/year"
|
||||
android:hint="@string/hint_Yar"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:inputType="numberDecimal"/>
|
||||
<EditText
|
||||
android:id="@+id/hour"
|
||||
android:hint="@string/hint_Hour"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:inputType="numberDecimal"/>
|
||||
<EditText
|
||||
android:id="@+id/minute"
|
||||
android:hint="@string/hint_Minute"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:inputType="numberDecimal"/>
|
||||
</LinearLayout>
|
||||
android:layout_margin="5sp"/>
|
||||
<Button
|
||||
android:id="@+id/AddTask"
|
||||
android:text="@string/button_AddTask"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5sp"/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".Activities.AddNewTask"
|
||||
android:orientation="vertical">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/TaskName"
|
||||
android:hint="@string/hint_TaskName"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPersonName"/>
|
||||
<EditText
|
||||
android:id="@+id/TaskDescription"
|
||||
android:hint="@string/hint_TaskDescription"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textMultiLine"/>
|
||||
<Button
|
||||
android:id="@+id/btnDatePick"
|
||||
android:text="@string/button_DefaultData"
|
||||
android:layout_width="200sp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5sp"/>
|
||||
<Button
|
||||
android:id="@+id/btnEditTask"
|
||||
android:text="@string/button_editTask"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5sp"/>
|
||||
</LinearLayout>
|
||||
@@ -8,7 +8,6 @@
|
||||
android:orientation="vertical"
|
||||
tools:context=".Activities.MainMenu">
|
||||
|
||||
|
||||
<EditText
|
||||
android:id="@+id/findLine"
|
||||
android:layout_width="match_parent"
|
||||
@@ -29,9 +28,18 @@
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
app:layout_constraintTop_toBottomOf="@id/findLine"/>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/button_SingOut"
|
||||
android:src="@drawable/exit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toTopOf="@+id/button_addNewTask"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_margin="20sp"/>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/button_addNewTask"
|
||||
android:src="@android:drawable/ic_menu_add"
|
||||
android:src="@drawable/add"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="button_NO">No</string>
|
||||
<string name="hint_Login">Login</string>
|
||||
<string name="hint_Password">Password</string>
|
||||
<string name="hint_Find">Task name</string>
|
||||
<string name="hint_Find">Name or description</string>
|
||||
<string name="hint_TaskName">Task name</string>
|
||||
<string name="hint_TaskDescription">Description</string>
|
||||
<string name="hint_Minute">Minute</string>
|
||||
@@ -22,8 +22,7 @@
|
||||
<string name="snackbar_EnterName">Enter task name</string>
|
||||
<string name="snackbar_EnterDate">Enter task date</string>
|
||||
<string name="snackbar_DataBaseError">Something went wrong.</string>
|
||||
<string name="title_AlertRemoveTask">Remove task?</string>
|
||||
<string name="message_RemoveTask">Task will remove on all devices.</string>
|
||||
<string name="button_editTask">Edit task</string>
|
||||
<string name="button_YES">Yes</string>
|
||||
<string name="hint_Day">Day</string>
|
||||
<string name="hint_Month">Month</string>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="button_NO">Нет</string>
|
||||
<string name="hint_Login">Логин</string>
|
||||
<string name="hint_Password">Пароль</string>
|
||||
<string name="hint_Find">Название задачи</string>
|
||||
<string name="hint_Find">Название или описание</string>
|
||||
<string name="hint_TaskName">Название задачи</string>
|
||||
<string name="hint_TaskDescription">Описание</string>
|
||||
<string name="hint_Minute">Минута</string>
|
||||
@@ -22,8 +22,7 @@
|
||||
<string name="snackbar_EnterName">Введите назвние</string>
|
||||
<string name="snackbar_EnterDate">Введите дату</string>
|
||||
<string name="snackbar_DataBaseError">Что-то пошло не так</string>
|
||||
<string name="title_AlertRemoveTask">Удалить задачу?</string>
|
||||
<string name="message_RemoveTask">Задача удалится на всех устройствах.</string>
|
||||
<string name="button_editTask">Редакировать</string>
|
||||
<string name="button_YES">Да</string>
|
||||
<string name="hint_Day">День</string>
|
||||
<string name="hint_Month">Месяц</string>
|
||||
|
||||
@@ -7,13 +7,15 @@
|
||||
<string name="button_offline">Offline</string>
|
||||
<string name="button_Sort">Sort</string>
|
||||
<string name="button_AddTask">Add task</string>
|
||||
<string name="button_editTask">Edit task</string>
|
||||
<string name="button_YES">Yes</string>
|
||||
<string name="button_NO">No</string>
|
||||
<string name="button_DefaultData" translatable="false">DD/MM/YEAR</string>
|
||||
|
||||
<!-- Hints -->
|
||||
<string name="hint_Login">Login</string>
|
||||
<string name="hint_Password">Password</string>
|
||||
<string name="hint_Find">Task name</string>
|
||||
<string name="hint_Find">Name or description</string>
|
||||
<string name="hint_TaskName">Task name</string>
|
||||
<string name="hint_TaskDescription">Description</string>
|
||||
<string name="hint_Day">Day</string>
|
||||
@@ -33,9 +35,4 @@
|
||||
<string name="snackbar_EnterDate">Enter task date</string>
|
||||
<string name="snackbar_DataBaseError">Something went wrong.</string>
|
||||
|
||||
<!-- Titles -->
|
||||
<string name="title_AlertRemoveTask">Remove task?</string>
|
||||
|
||||
<!-- Messages -->
|
||||
<string name="message_RemoveTask">Task will remove on all devices.</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user