Refactor and settup for release configuration

This commit is contained in:
Данил
2025-06-14 19:31:09 +07:00
parent 7217515b38
commit 58bcb3e6f7
35 changed files with 362 additions and 7458 deletions
+1
View File
@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
+11 -5
View File
@@ -3,12 +3,13 @@ plugins {
} }
android { android {
namespace = "com.example.tasktracker" namespace = "com.samsungschool.tasktracker"
compileSdk = 36 compileSdk = 36
defaultConfig { defaultConfig {
applicationId = "com.example.tasktracker" applicationId = "com.samsungschool.tasktracker"
minSdk = 27 minSdk = 27
//noinspection OldTargetApi
targetSdk = 35 targetSdk = 35
versionCode = 1 versionCode = 1
versionName = "1.0" versionName = "1.0"
@@ -22,7 +23,12 @@ android {
buildTypes { buildTypes {
release { release {
isMinifyEnabled = false // Optimisation code
isMinifyEnabled = true
// Optimization resource
//isShrinkResources = true
// Off logs
//isDebuggable = false
proguardFiles( proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro" "proguard-rules.pro"
@@ -30,8 +36,8 @@ android {
} }
} }
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_1_8
} }
} }
+4 -1
View File
@@ -18,4 +18,7 @@
# If you keep the line number information, uncomment this to # If you keep the line number information, uncomment this to
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile
-keep class com.samsungschool.tasktracker.Answers.** { *; }
Binary file not shown.
Binary file not shown.
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.samsungschool.tasktracker",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "1.0",
"outputFile": "app-release.apk"
}
],
"elementType": "File",
"baselineProfiles": [
{
"minApi": 28,
"maxApi": 30,
"baselineProfiles": [
"baselineProfiles/1/app-release.dm"
]
},
{
"minApi": 31,
"maxApi": 2147483647,
"baselineProfiles": [
"baselineProfiles/0/app-release.dm"
]
}
],
"minSdkVersionForDexing": 27
}
@@ -1,4 +1,4 @@
package com.example.tasktracker; package com.samsungschool.tasktracker;
import android.content.Context; import android.content.Context;
@@ -21,6 +21,6 @@ public class ExampleInstrumentedTest {
public void useAppContext() { public void useAppContext() {
// Context of the app under test. // Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.tasktracker", appContext.getPackageName()); assertEquals("com.samsungschool.tasktracker", appContext.getPackageName());
} }
} }
@@ -1,158 +0,0 @@
package com.example.tasktracker.Activities;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import com.example.tasktracker.Answers.StatusAnswer;
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 io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LOGIN_ACTIVITY";
private ActivityLoginBinding binding;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
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());
if(login != null && password != null)
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();
return;
}
if(password.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
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();
return;
}
if(password.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
SingUp();
});
binding.buttonOffline.setOnClickListener(v->{
startActivity(MainMenu.getIntent(this, null,null));
finish();
});
}
private void SingIn() {
Disposable disposable = ApiFactory.getApiService().singin(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override
public void accept(StatusAnswer loginAnswer) throws Throwable {
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;
}
@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();
}
});
compositeDisposable.add(disposable);
}
private void SingUp() {
Disposable disposable = ApiFactory.getApiService().singup(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override
public void accept(StatusAnswer loginAnswer) throws Throwable {
if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_BigLoginPassword, Snackbar.LENGTH_SHORT).show();
return;
}
else if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_SmallLoginPassword, Snackbar.LENGTH_SHORT).show();
return;
}
else if (loginAnswer.getStatus().equals("error")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_AlredyCreated, Snackbar.LENGTH_SHORT).show();
return;
}
@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();
}
});
compositeDisposable.add(disposable);
}
@Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.dispose();
}
}
@@ -1,11 +1,10 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.TimePickerDialog; import android.app.TimePickerDialog;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker; import android.widget.DatePicker;
import android.widget.TimePicker; import android.widget.TimePicker;
@@ -13,12 +12,12 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.example.tasktracker.Activities.ViewModels.AddItemViewModel; import com.samsungschool.tasktracker.Activities.ViewModels.AddItemViewModel;
import com.example.tasktracker.Activities.ViewModels.TimePickerFragment; import com.samsungschool.tasktracker.Activities.ViewModels.TimePickerFragment;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.PublicKeyNames; import com.samsungschool.tasktracker.PublicKeyNames;
import com.example.tasktracker.R; import com.samsungschool.tasktracker.R;
import com.example.tasktracker.databinding.ActivityAddNewTaskBinding; import com.samsungschool.tasktracker.databinding.ActivityAddNewTaskBinding;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import java.util.Random; import java.util.Random;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.Dialog; import android.app.Dialog;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.TimePickerDialog; import android.app.TimePickerDialog;
@@ -12,12 +12,12 @@ import android.widget.TimePicker;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import com.example.tasktracker.Activities.ViewModels.EditTaskViewModel; import com.samsungschool.tasktracker.Activities.ViewModels.EditTaskViewModel;
import com.example.tasktracker.Activities.ViewModels.TimePickerFragment; import com.samsungschool.tasktracker.Activities.ViewModels.TimePickerFragment;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.PublicKeyNames; import com.samsungschool.tasktracker.PublicKeyNames;
import com.example.tasktracker.R; import com.samsungschool.tasktracker.R;
import com.example.tasktracker.databinding.ActivityEditTaskBinding; import com.samsungschool.tasktracker.databinding.ActivityEditTaskBinding;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { public class EditTask extends AppCompatActivity implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
@@ -0,0 +1,143 @@
package com.samsungschool.tasktracker.Activities;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import com.samsungschool.tasktracker.Activities.ViewModels.LoginViewModel;
import com.samsungschool.tasktracker.Answers.StatusAnswer;
import com.samsungschool.tasktracker.PublicKeyNames;
import com.samsungschool.tasktracker.R;
import com.samsungschool.tasktracker.databinding.ActivityLoginBinding;
import com.google.android.material.snackbar.Snackbar;
public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LOGIN_ACTIVITY";
private ActivityLoginBinding binding;
private LoginViewModel viewModel;
private String login;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
viewModel = new LoginViewModel(getApplication());
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());
viewModel.getSingInSuccess().observe(this, new Observer<StatusAnswer>() {
@Override
public void onChanged(StatusAnswer statusAnswer) {
Log.d(TAG, "good");
if(statusAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return;
}
else if (statusAnswer.getStatus().equals("error")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return;
}
Log.d(TAG, "good1");
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).edit()
.putString(PublicKeyNames.LOGIN_KEY, login)
.putString(PublicKeyNames.PASSWORD_KEY, password)
.apply();
startActivity(MainMenu.getIntent(LoginActivity.this, login, password));
finish();
}
});
viewModel.getSingInFail().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d(TAG, "fail");
Log.e(TAG, s);
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
}
});
viewModel.getSingUpSuccess().observe(this, new Observer<StatusAnswer>() {
@Override
public void onChanged(StatusAnswer statusAnswer) {
switch (statusAnswer.getStatus()) {
case "big":
Snackbar.make(binding.getRoot(), R.string.snackbar_BigLoginPassword, Snackbar.LENGTH_SHORT).show();
return;
case "small":
Snackbar.make(binding.getRoot(), R.string.snackbar_SmallLoginPassword, Snackbar.LENGTH_SHORT).show();
return;
case "error":
Snackbar.make(binding.getRoot(), R.string.snackbar_AlredyCreated, Snackbar.LENGTH_SHORT).show();
return;
}
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).edit()
.putString(PublicKeyNames.LOGIN_KEY, login)
.putString(PublicKeyNames.PASSWORD_KEY, password)
.apply();
@SuppressLint("UnsafeIntentLaunch") Intent intent = MainMenu.getIntent(LoginActivity.this, login, password);
startActivity(intent);
finish();
}
});
viewModel.getSingUpFail().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e(TAG, s);
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show();
}
});
if(login != null && password != null)
viewModel.SingIn(login, password);
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();
return;
}
if(password.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
viewModel.SingIn(login, password);
});
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();
return;
}
if(password.isEmpty()) {
Snackbar.make(binding.getRoot(), R.string.snackbar_EnterPassword, Snackbar.LENGTH_SHORT).show();
return;
}
viewModel.SingUp(login, password);
});
binding.buttonOffline.setOnClickListener(v->{
startActivity(MainMenu.getIntent(this, null,null));
finish();
});
}
}
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
import static android.view.View.INVISIBLE; import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
@@ -19,13 +19,13 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.example.tasktracker.Activities.ViewModels.MainMenuViewModel; import com.samsungschool.tasktracker.Activities.ViewModels.MainMenuViewModel;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.Api.ApiFactory; import com.samsungschool.tasktracker.Api.ApiFactory;
import com.example.tasktracker.Api.TaskRepository; import com.samsungschool.tasktracker.Api.TaskRepository;
import com.example.tasktracker.PublicKeyNames; import com.samsungschool.tasktracker.PublicKeyNames;
import com.example.tasktracker.R; import com.samsungschool.tasktracker.R;
import com.example.tasktracker.databinding.ActivityMainMenuBinding; import com.samsungschool.tasktracker.databinding.ActivityMainMenuBinding;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList; import java.util.ArrayList;
@@ -1,17 +1,16 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
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 androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.example.tasktracker.Answers.StatusAnswer; import com.samsungschool.tasktracker.Answers.StatusAnswer;
import com.example.tasktracker.Api.ApiFactory; import com.samsungschool.tasktracker.Api.ApiFactory;
import com.example.tasktracker.PublicKeyNames; import com.samsungschool.tasktracker.PublicKeyNames;
import com.example.tasktracker.R; import com.samsungschool.tasktracker.R;
import com.example.tasktracker.databinding.ActivitySettingsBinding; import com.samsungschool.tasktracker.databinding.ActivitySettingsBinding;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -70,7 +69,7 @@ public class SettingsActivity extends AppCompatActivity {
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.subscribe(new Consumer<StatusAnswer>() { .subscribe(new Consumer<StatusAnswer>() {
@Override @Override
public void accept(StatusAnswer statusAnswer) throws Throwable { public void accept(StatusAnswer statusAnswer) {
if (statusAnswer.getStatus().equals("ok")) { if (statusAnswer.getStatus().equals("ok")) {
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE) getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE)
.edit() .edit()
@@ -87,7 +86,7 @@ public class SettingsActivity extends AppCompatActivity {
} }
}, new Consumer<Throwable>() { }, new Consumer<Throwable>() {
@Override @Override
public void accept(Throwable throwable) throws Throwable { public void accept(Throwable throwable) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_SHORT).show();
} }
}); });
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities; package com.samsungschool.tasktracker.Activities;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -7,9 +7,9 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.R; import com.samsungschool.tasktracker.R;
import com.example.tasktracker.databinding.ItemBinding; import com.samsungschool.tasktracker.databinding.ItemBinding;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities.ViewModels; package com.samsungschool.tasktracker.Activities.ViewModels;
import android.app.Application; import android.app.Application;
import android.util.Log; import android.util.Log;
@@ -8,9 +8,9 @@ import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.Api.ApiFactory; import com.samsungschool.tasktracker.Api.ApiFactory;
import com.example.tasktracker.Api.TaskRepository; import com.samsungschool.tasktracker.Api.TaskRepository;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities.ViewModels; package com.samsungschool.tasktracker.Activities.ViewModels;
import android.app.Application; import android.app.Application;
import android.util.Log; import android.util.Log;
@@ -9,11 +9,10 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import com.example.tasktracker.Activities.EditTask; import com.samsungschool.tasktracker.Activities.EditTask;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.Api.ApiFactory; import com.samsungschool.tasktracker.Api.ApiFactory;
import com.example.tasktracker.Api.TaskDao; import com.samsungschool.tasktracker.Api.TaskRepository;
import com.example.tasktracker.Api.TaskRepository;
import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.disposables.Disposable;
@@ -76,12 +75,12 @@ public class EditTaskViewModel extends AndroidViewModel {
Disposable disposable = ApiFactory.getApiService().getTask(login, password, 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) {
liveDataLoad.postValue(task); liveDataLoad.postValue(task);
} }
}, new Consumer<Throwable>() { }, new Consumer<Throwable>() {
@Override @Override
public void accept(Throwable throwable) throws Throwable { public void accept(Throwable throwable) {
liveDataFail.postValue(throwable.getMessage()); liveDataFail.postValue(throwable.getMessage());
} }
}); });
@@ -0,0 +1,84 @@
package com.samsungschool.tasktracker.Activities.ViewModels;
import android.app.Application;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;
import com.samsungschool.tasktracker.Answers.StatusAnswer;
import com.samsungschool.tasktracker.Api.ApiFactory;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class LoginViewModel extends AndroidViewModel {
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
private final MutableLiveData<StatusAnswer> SingInSuccess = new MutableLiveData<>();
private final MutableLiveData<String> SingInFail = new MutableLiveData<>();
private final MutableLiveData<StatusAnswer> SingUpSuccess = new MutableLiveData<>();
private final MutableLiveData<String> SingUpFail = new MutableLiveData<>();
public LoginViewModel(@NonNull Application application) {
super(application);
}
public void SingIn(String login, String password) {
Disposable disposable = ApiFactory.getApiService().singin(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override
public void accept(StatusAnswer statusAnswer) {
SingInSuccess.postValue(statusAnswer);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
SingInFail.postValue(throwable.getMessage());
}
});
compositeDisposable.add(disposable);
}
public void SingUp(String login, String password) {
Disposable disposable = ApiFactory.getApiService().singup(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override
public void accept(StatusAnswer statusAnswer) {
SingUpSuccess.postValue(statusAnswer);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
SingUpFail.postValue(throwable.getMessage());
}
});
compositeDisposable.add(disposable);
}
public MutableLiveData<StatusAnswer> getSingInSuccess() {
return SingInSuccess;
}
public MutableLiveData<String> getSingInFail() {
return SingInFail;
}
public MutableLiveData<StatusAnswer> getSingUpSuccess() {
return SingUpSuccess;
}
public MutableLiveData<String> getSingUpFail() {
return SingUpFail;
}
@Override
protected void onCleared() {
super.onCleared();
Log.d("LoginViewModel", "onCleared");
compositeDisposable.dispose();
}
}
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities.ViewModels; package com.samsungschool.tasktracker.Activities.ViewModels;
import android.app.Application; import android.app.Application;
@@ -7,8 +7,8 @@ import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import com.example.tasktracker.Api.ApiFactory; import com.samsungschool.tasktracker.Api.ApiFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -32,12 +32,12 @@ public class MainMenuViewModel extends AndroidViewModel {
Single<ArrayList<Task>> single = ApiFactory.getApiService().getTaskList(login, password); 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) {
Load.postValue(tasks); Load.postValue(tasks);
} }
}, new Consumer<Throwable>() { }, new Consumer<Throwable>() {
@Override @Override
public void accept(Throwable throwable) throws Throwable { public void accept(Throwable throwable) {
failLoad.postValue(throwable.getMessage()); failLoad.postValue(throwable.getMessage());
} }
}); });
@@ -1,4 +1,4 @@
package com.example.tasktracker.Activities.ViewModels; package com.samsungschool.tasktracker.Activities.ViewModels;
import android.app.Dialog; import android.app.Dialog;
import android.app.TimePickerDialog; import android.app.TimePickerDialog;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Answers; package com.samsungschool.tasktracker.Answers;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
@@ -1,14 +1,12 @@
package com.example.tasktracker.Answers; package com.samsungschool.tasktracker.Answers;
import androidx.room.Entity; import androidx.room.Entity;
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;
@Entity(tableName = "task_room") @Entity(tableName = "task_room")
public class Task { public class Task {
@SerializedName("id") @SerializedName("id")
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
private long id; private long id;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Api; package com.samsungschool.tasktracker.Api;
import retrofit2.Retrofit; import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
@@ -1,7 +1,7 @@
package com.example.tasktracker.Api; package com.samsungschool.tasktracker.Api;
import com.example.tasktracker.Answers.StatusAnswer; import com.samsungschool.tasktracker.Answers.StatusAnswer;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import java.util.ArrayList; import java.util.ArrayList;
@@ -1,4 +1,4 @@
package com.example.tasktracker.Api; package com.samsungschool.tasktracker.Api;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.room.Dao; import androidx.room.Dao;
@@ -7,12 +7,10 @@ import androidx.room.Insert;
import androidx.room.OnConflictStrategy; import androidx.room.OnConflictStrategy;
import androidx.room.Query; import androidx.room.Query;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
import java.util.List; import java.util.List;
import retrofit2.Call;
@Dao @Dao
public interface TaskDao { public interface TaskDao {
@Query("SELECT * FROM task_room") @Query("SELECT * FROM task_room")
@@ -1,4 +1,4 @@
package com.example.tasktracker.Api; package com.samsungschool.tasktracker.Api;
import android.app.Application; import android.app.Application;
@@ -6,7 +6,7 @@ import androidx.room.Database;
import androidx.room.Room; import androidx.room.Room;
import androidx.room.RoomDatabase; import androidx.room.RoomDatabase;
import com.example.tasktracker.Answers.Task; import com.samsungschool.tasktracker.Answers.Task;
@Database(entities = {Task.class}, version = 1) @Database(entities = {Task.class}, version = 1)
public abstract class TaskRepository extends RoomDatabase { public abstract class TaskRepository extends RoomDatabase {
@@ -1,4 +1,4 @@
package com.example.tasktracker; package com.samsungschool.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";
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
@@ -1,4 +1,4 @@
package com.example.tasktracker; package com.samsungschool.tasktracker;
import org.junit.Test; import org.junit.Test;
+3 -3
View File
@@ -1,10 +1,10 @@
[versions] [versions]
agp = "8.9.2" agp = "8.9.3"
gson = "2.10.1"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.2.1" junitVersion = "1.2.1"
espressoCore = "3.6.1" espressoCore = "3.6.1"
appcompat = "1.7.0" appcompat = "1.7.1"
gson = "2.10.1"
material = "1.12.0" material = "1.12.0"
activity = "1.10.1" activity = "1.10.1"
constraintlayout = "2.2.1" constraintlayout = "2.2.1"
+1 -1
View File
@@ -1,4 +1,4 @@
#Sat May 10 10:37:50 NOVT 2025 #Sat Jun 14 12:52:41 NOVT 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
-7216
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -21,4 +21,3 @@ dependencyResolutionManagement {
rootProject.name = "TaskTracker" rootProject.name = "TaskTracker"
include(":app") include(":app")