From 44539a9a45a0ca9d8eec23cdfd49bdcd82c6d185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=BB?= <119668441+Jiga228@users.noreply.github.com> Date: Mon, 12 May 2025 00:25:00 +0700 Subject: [PATCH] Create repository --- .gitignore | 15 ++ README.md | 2 +- app/.gitignore | 1 + app/build.gradle.kts | 63 +++++ app/proguard-rules.pro | 21 ++ .../tasktracker/ExampleInstrumentedTest.java | 26 ++ app/src/main/AndroidManifest.xml | 38 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 68997 bytes .../Activities/AddItemViewModel.java | 63 +++++ .../tasktracker/Activities/AddNewTask.java | 135 ++++++++++ .../tasktracker/Activities/LoginActivity.java | 137 +++++++++++ .../tasktracker/Activities/MainMenu.java | 232 ++++++++++++++++++ .../Activities/MainMenuViewModel.java | 62 +++++ .../tasktracker/Activities/TaskAdapter.java | 82 +++++++ .../tasktracker/Answers/LoginAnswer.java | 21 ++ .../com/example/tasktracker/Answers/Task.java | 84 +++++++ .../example/tasktracker/Api/ApiFactory.java | 24 ++ .../example/tasktracker/Api/ApiService.java | 30 +++ .../com/example/tasktracker/Api/TaskDao.java | 29 +++ .../tasktracker/Api/TaskRepository.java | 26 ++ .../res/drawable/ic_launcher_background.xml | 74 ++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ app/src/main/res/drawable/icon.png | Bin 0 -> 7287 bytes .../main/res/layout/activity_add_new_task.xml | 76 ++++++ app/src/main/res/layout/activity_login.xml | 78 ++++++ .../main/res/layout/activity_main_menu.xml | 41 ++++ app/src/main/res/layout/item.xml | 48 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2144 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 4524 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3878 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1320 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 2428 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2344 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 3150 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 5788 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 5634 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 4754 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 11768 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 8650 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 6806 bytes .../ic_launcher_foreground.webp | Bin 0 -> 19486 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 12524 bytes app/src/main/res/values-en/strings.xml | 32 +++ app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values-ru/strings.xml | 32 +++ app/src/main/res/values/colors.xml | 5 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 41 ++++ app/src/main/res/values/themes.xml | 9 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../main/res/xml/network_security_config.xml | 4 + .../example/tasktracker/ExampleUnitTest.java | 17 ++ build.gradle.kts | 4 + gradle.properties | 21 ++ gradle/libs.versions.toml | 36 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++ gradlew.bat | 89 +++++++ settings.gradle.kts | 24 ++ 63 files changed, 1995 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/tasktracker/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/example/tasktracker/Activities/AddItemViewModel.java create mode 100644 app/src/main/java/com/example/tasktracker/Activities/AddNewTask.java create mode 100644 app/src/main/java/com/example/tasktracker/Activities/LoginActivity.java create mode 100644 app/src/main/java/com/example/tasktracker/Activities/MainMenu.java create mode 100644 app/src/main/java/com/example/tasktracker/Activities/MainMenuViewModel.java create mode 100644 app/src/main/java/com/example/tasktracker/Activities/TaskAdapter.java create mode 100644 app/src/main/java/com/example/tasktracker/Answers/LoginAnswer.java create mode 100644 app/src/main/java/com/example/tasktracker/Answers/Task.java create mode 100644 app/src/main/java/com/example/tasktracker/Api/ApiFactory.java create mode 100644 app/src/main/java/com/example/tasktracker/Api/ApiService.java create mode 100644 app/src/main/java/com/example/tasktracker/Api/TaskDao.java create mode 100644 app/src/main/java/com/example/tasktracker/Api/TaskRepository.java create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/icon.png create mode 100644 app/src/main/res/layout/activity_add_new_task.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main_menu.xml create mode 100644 app/src/main/res/layout/item.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-en/strings.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-ru/strings.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/test/java/com/example/tasktracker/ExampleUnitTest.java create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/README.md b/README.md index ac52d9c..eda3a1c 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# TaskTraker \ No newline at end of file +Это клиентская часть приложения. Если вы хотите запустить его локально замените IP в файле ApiFactory на ваш. \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..6b831bb --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,63 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.example.tasktracker" + compileSdk = 35 + + defaultConfig { + applicationId = "com.example.tasktracker" + minSdk = 27 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { + viewBinding = true + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + implementation(libs.room.runtime) + // If this project only uses Java source, use the Java annotationProcessor + // No additional plugins are necessary + annotationProcessor(libs.room.compiler) + // optional - RxJava3 support for Room + implementation(libs.room.rxjava3) + + implementation(libs.gson) + implementation(libs.retrofit) + implementation(libs.converter.gson) + implementation(libs.adapter.rxjava3) + implementation(libs.rxandroid) + // Because RxAndroid releases are few and far between, it is recommended you also + // explicitly depend on RxJava's latest version for bug fixes and new features. + // (see https://github.com/ReactiveX/RxJava/releases for latest 3.x.x version) + implementation(libs.rxjava) + + implementation(libs.appcompat) + implementation(libs.material) + implementation(libs.activity) + implementation(libs.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/tasktracker/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/tasktracker/ExampleInstrumentedTest.java new file mode 100644 index 0000000..9b4e559 --- /dev/null +++ b/app/src/androidTest/java/com/example/tasktracker/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.tasktracker; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.tasktracker", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..819adcd --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..39a16aa20aad78b02aff9c330628568588a67ad5 GIT binary patch literal 68997 zcmeFYr|Ro0-|!C%d~}Z(a5*Gg4S3iLsl*(l35_g&+=- zdK@da;*JR@*ZO$(mdX2;8HQxKyZ$1c0st=%hs~&(0{?yHEExtNy8A^p{{Q{b|DA&W ze?$RlePdHyg6Qkx$FXc?VGz$KeGxM76!!mdny3CS>}zOVS-8}5R&HP*)|LIS+IUQj zX6(i)6Kp{!PFb3%=gQf>aQKaM&iX4j+U0oVm%8`W`Te8)MYHc7w`%OW4}$iU<;Do; zMRR1M=|rZsNSuJjLoUqVuZN)s+*=>Q&9%Nu*XvHPwaz{t*Q4=kzHd(IMDHg8ZKs{< zxXWmR^tL>bv6{=o{hxwM)jQ)SAS!DLU@y)tP1XGbK1x-9XFP)=g({nWzfsp%&U;x* zM~&22%yR2~!?0D`>~QN=p9)rg7AmNc0b9kZ=PWDR{Gz*T_wTkqS{7|%zoUqlrva7v| zk=bXsF(7*XLiWJe$48x%lQ#xSQ%}n0sg@fXzpYrtGYk<%s=q+*3AUYhq}O z46ZRBfKZ-OC~Hmc8MP4%4Ubo3*?a7y!Nm~e8%*5Ys+|-3a?3-4XpY8TI(?__1y|to zV-$DMysK#aNV%Bh$X_oXu(>;kQZfaGH-MkOy_aiJaFpCJh6#qwhob9R8_(#5%BBf7 zFeg55m9&-f+2Iyg3e2&Et&yU>Wg6�yt8X>{;weUIW8Dhp3+#JAJHNQHSJToqgWl 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]w<Fl`alzesQi^4CcoUvk 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 F{a?M&yyXA@ literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/example/tasktracker/Activities/AddItemViewModel.java b/app/src/main/java/com/example/tasktracker/Activities/AddItemViewModel.java new file mode 100644 index 0000000..d48a1f3 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/AddItemViewModel.java @@ -0,0 +1,63 @@ +package com.example.tasktracker.Activities; + +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.Answers.Task; +import com.example.tasktracker.Api.ApiFactory; +import com.example.tasktracker.Api.TaskRepository; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class AddItemViewModel extends AndroidViewModel { + private static final String TAG = "ADD_ITEM_VIEW_MODEL"; + private final MutableLiveData liveDataSave = new MutableLiveData<>(); + private final MutableLiveData Failure = new MutableLiveData<>(); + + public AddItemViewModel(@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 send = ApiFactory.getApiService().addTask(token, task); + send.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + Log.d(TAG, "Task add successfully"); + liveDataSave.postValue(true); + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable throwable) { + Log.w(TAG, throwable.toString()); + Failure.postValue(throwable.getMessage()); + } + }); + } + + public LiveData getFailure() { + return Failure; + } + public LiveData getClose() { + return liveDataSave; + } +} diff --git a/app/src/main/java/com/example/tasktracker/Activities/AddNewTask.java b/app/src/main/java/com/example/tasktracker/Activities/AddNewTask.java new file mode 100644 index 0000000..ef52dbb --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/AddNewTask.java @@ -0,0 +1,135 @@ +package com.example.tasktracker.Activities; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.example.tasktracker.Answers.Task; +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 { + 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; + + @Override + protected void onCreate(Bundle savedInstanceState) { + binding = ActivityAddNewTaskBinding.inflate(getLayoutInflater()); + super.onCreate(savedInstanceState); + setContentView(binding.getRoot()); + + token = getIntent().getStringExtra(TOKEN_KEY); + if(token == null) + { + Log.w(TAG, "Token is null"); + return; + } + + viewModel = new ViewModelProvider(this).get(AddItemViewModel.class); + viewModel.getClose().observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if(aBoolean) + finish(); + } + }); + + // Offline + if(token.equals("null")) { + Offline(); + } + // Online + else { + Online(); + } + } + + private void Offline() { + 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()) { + 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); + viewModel.OfflineSaveData(task); + }); + } + + private void Online() { + viewModel.getFailure().observe(this, new Observer() { + @Override + public void onChanged(String s) { + Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_SHORT).show(); + } + }); + + 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()) { + 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); + viewModel.OnlineSaveData(task, token); + }); + } + + 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(); + + long key1 = name.hashCode(); + long key2 = Description.hashCode(); + long key3 = date.hashCode(); + long key4 = rand.nextInt(); + + long hash = key1 ^ key2 ^ key3 ^ key4; + return hash; + } + + public static Intent getIntent(Context context, String token) { + Intent intent = new Intent(context, AddNewTask.class); + intent.putExtra(TOKEN_KEY, token); + return intent; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tasktracker/Activities/LoginActivity.java b/app/src/main/java/com/example/tasktracker/Activities/LoginActivity.java new file mode 100644 index 0000000..9f08c41 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/LoginActivity.java @@ -0,0 +1,137 @@ +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.LoginAnswer; +import com.example.tasktracker.Api.ApiFactory; +import com.example.tasktracker.R; +import com.example.tasktracker.databinding.ActivityLoginBinding; +import com.google.android.material.snackbar.Snackbar; + +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; +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(); + + @SuppressLint("UnsafeIntentLaunch") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityLoginBinding.inflate(getLayoutInflater()); + EdgeToEdge.enable(this); + setContentView(binding.getRoot()); + + binding.buttonSingIn.setOnClickListener(v->{ SingIn(); }); + + binding.buttonSingUp.setOnClickListener(v->{ SingUp(); }); + + binding.buttonOffline.setOnClickListener(v->{ + Intent intent = MainMenu.getIntent(this, "null"); + startActivity(intent); + 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 = ApiFactory.getApiService().singin(login, pass); + Disposable disposable = loginAnswer + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @Override + public void accept(LoginAnswer loginAnswer) throws Throwable { + if (loginAnswer.getStatus().equals("error")) { + Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show(); + return; + } + + String token = loginAnswer.getToken(); + OpenMainMenu(token); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Throwable { + Log.w(TAG, throwable.toString()); + 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 = ApiFactory.getApiService().singup(login, pass); + Disposable disposable = loginAnswer + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @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(); + return; + } + + String token = loginAnswer.getToken(); + OpenMainMenu(token); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Throwable { + Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_LONG).show(); + Log.w(TAG, throwable.toString()); + } + }); + compositeDisposable.add(disposable); + } + + private void OpenMainMenu(String token) + { + @SuppressLint("UnsafeIntentLaunch") + Intent intent = MainMenu.getIntent(this, token); + startActivity(intent); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tasktracker/Activities/MainMenu.java b/app/src/main/java/com/example/tasktracker/Activities/MainMenu.java new file mode 100644 index 0000000..996cf39 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/MainMenu.java @@ -0,0 +1,232 @@ +package com.example.tasktracker.Activities; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.tasktracker.Answers.Task; +import com.example.tasktracker.Api.ApiFactory; +import com.example.tasktracker.Api.TaskRepository; +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; + +import retrofit2.Call; +import retrofit2.Callback; +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 taskListCache; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMainMenuBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + token = getIntent().getStringExtra(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); + startActivity(intent); + }); + viewModel = new ViewModelProvider(this).get(MainMenuViewModel.class); + + binding.findLine.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + String find = binding.findLine.getText().toString(); + if(find.isEmpty()) { + if(token.equals("null")) { + TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(MainMenu.this, new Observer>() { + @Override + public void onChanged(List tasks) { + taskListCache = tasks; + taskAdapter.setTaskList(tasks); + } + }); + } + else { + viewModel.OnlineUpdateList(token); + } + } + new Thread(new Runnable() { + @Override + public void run() { + List searchList = new ArrayList<>(); + for (int i = 0; i < taskListCache.size(); i++) { + if (taskListCache.get(i).getTaskName().toLowerCase().contains(charSequence) || + taskListCache.get(i).getTaskDescription().toLowerCase().contains(charSequence)) { + searchList.add(taskListCache.get(i)); + } + } + new Handler(getMainLooper()).post(new Runnable() { + @Override + public void run() { + taskAdapter.setTaskList(searchList); + } + }); + } + }).start(); + } + + @Override + public void afterTextChanged(Editable editable) { + + } + }); + + // offline + if(token.equals("null")) { + Offline(); + } + //online + else { + Online(); + } + } + + public void Offline() { + viewModel.getOnLoad().observe(this, new Observer>() { + @Override + public void onChanged(List tasks) { + taskListCache = tasks; + taskAdapter.setTaskList(tasks); + } + }); + + 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); + new Thread(new Runnable() { + @Override + public void run() { + TaskRepository.newInstance(getApplication()).taskDao().delete(task); + } + }).start(); + taskAdapter.removeItemByPosition(position); + } + }); + helper.attachToRecyclerView(binding.scrollTask); + } + + private void Online() { + + viewModel.getOnLoad().observe(this, new Observer>() { + @Override + public void onChanged(List tasks) { + taskListCache = tasks; + taskAdapter.setTaskList(tasks); + } + }); + viewModel.onFail().observe(this, new Observer() { + @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() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + Task task = taskAdapter.getItem(position); + taskAdapter.removeItemByPosition(position); + } + + @Override + public void onFailure(@NonNull Call 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(token.equals("null")) { + TaskRepository.newInstance(getApplication()).taskDao().getTaskList().observe(this, new Observer>() { + @Override + public void onChanged(List 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(TOKEN_KEY, token); + return intent; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tasktracker/Activities/MainMenuViewModel.java b/app/src/main/java/com/example/tasktracker/Activities/MainMenuViewModel.java new file mode 100644 index 0000000..0057f85 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/MainMenuViewModel.java @@ -0,0 +1,62 @@ +package com.example.tasktracker.Activities; + +import android.app.Application; + +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; + +import io.reactivex.rxjava3.core.Single; +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 MainMenuViewModel extends AndroidViewModel { + private final CompositeDisposable compositeDisposable = new CompositeDisposable(); + private final MutableLiveData> Load = new MutableLiveData<>(); + private final MutableLiveData failLoad = new MutableLiveData<>(); + + public MainMenuViewModel(@NonNull Application application) { + super(application); + } + + public void OnlineUpdateList(String token) { + Single> single = ApiFactory.getApiService().getTaskList(token); + Disposable disposable = single.subscribeOn(Schedulers.io()).subscribe(new Consumer>() { + @Override + public void accept(ArrayList tasks) throws Throwable { + Load.postValue(tasks); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Throwable { + failLoad.postValue(throwable.getMessage()); + } + }); + compositeDisposable.add(disposable); + } + + public LiveData> getOnLoad() { + return Load; + } + + public LiveData onFail() { + return failLoad; + } + + @Override + protected void onCleared() { + super.onCleared(); + compositeDisposable.dispose(); + } +} diff --git a/app/src/main/java/com/example/tasktracker/Activities/TaskAdapter.java b/app/src/main/java/com/example/tasktracker/Activities/TaskAdapter.java new file mode 100644 index 0000000..cbef260 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Activities/TaskAdapter.java @@ -0,0 +1,82 @@ +package com.example.tasktracker.Activities; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.tasktracker.Answers.Task; +import com.example.tasktracker.R; +import com.example.tasktracker.databinding.ItemBinding; + +import java.util.ArrayList; +import java.util.List; + +public class TaskAdapter extends RecyclerView.Adapter { + private List taskList = new ArrayList<>(); + + public List getTaskList() { + return taskList; + } + + public void setTaskList(@NonNull List taskList) + { + this.taskList = taskList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item, parent, false); + + return new TaskViewHolder(ItemBinding.bind(view)); + } + + @Override + public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) { + 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.getRoot().setOnClickListener(v->{ + if(onItemClick != null) + onItemClick.Click(position); + }); + } + + interface OnItemClick { + void Click(int position); + } + OnItemClick onItemClick; + void setOnItemClick(OnItemClick onItemClick) { + this.onItemClick = onItemClick; + } + + @Override + public int getItemCount() { + return taskList.size(); + } + + Task getItem(int position) { + return taskList.get(position); + } + + void removeItemByPosition(int position) + { + taskList.remove(position); + notifyDataSetChanged(); + } + + static class TaskViewHolder extends RecyclerView.ViewHolder { + ItemBinding binding; + TaskViewHolder(ItemBinding binding) + { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/main/java/com/example/tasktracker/Answers/LoginAnswer.java b/app/src/main/java/com/example/tasktracker/Answers/LoginAnswer.java new file mode 100644 index 0000000..fe79501 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Answers/LoginAnswer.java @@ -0,0 +1,21 @@ +package com.example.tasktracker.Answers; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +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; + } +} diff --git a/app/src/main/java/com/example/tasktracker/Answers/Task.java b/app/src/main/java/com/example/tasktracker/Answers/Task.java new file mode 100644 index 0000000..aad0b36 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Answers/Task.java @@ -0,0 +1,84 @@ +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; + +@Entity(tableName = "task_room") +public class Task implements Serializable { + @PrimaryKey(autoGenerate = false) + @SerializedName("id") + private long ID; + + @SerializedName("taskName") + private String TaskName; + + + @SerializedName("taskDescription") + private String TaskDescription; + + @SerializedName("taskDate") + private String TaskDate; + + public Task() { + + } + + @Ignore + public Task(long ID, String TaskName, String TaskDescription, String TaskData) { + this.TaskName = TaskName; + this.TaskDescription = TaskDescription; + this.TaskDate = TaskData; + this.ID = ID; + } + + public String getTaskName() { + return TaskName; + } + + public String getTaskDescription() { + return TaskDescription; + } + + public String getTaskDate() { + return TaskDate; + } + + public long getID() { + return ID; + } + + public void setTaskName(String taskName) { + TaskName = taskName; + } + + public void setTaskDescription(String taskDescription) { + TaskDescription = taskDescription; + } + + public void setTaskDate(String taskDate) { + TaskDate = taskDate; + } + + public void setID(long id) { + ID = id; + } + + + @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); + } + + @Override + public int hashCode() { + return Objects.hash(ID, TaskName, TaskDescription, TaskDate); + } +} diff --git a/app/src/main/java/com/example/tasktracker/Api/ApiFactory.java b/app/src/main/java/com/example/tasktracker/Api/ApiFactory.java new file mode 100644 index 0000000..024cb14 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Api/ApiFactory.java @@ -0,0 +1,24 @@ +package com.example.tasktracker.Api; + +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +public class ApiFactory { + private static final String BASE_URL = "http://192.168.0.3:8080/"; + + private static ApiService apiService = null; + + public static ApiService getApiService() + { + if(apiService == null) + { + Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) + .build(); + apiService = retrofit.create(ApiService.class); + } + return apiService; + } +} diff --git a/app/src/main/java/com/example/tasktracker/Api/ApiService.java b/app/src/main/java/com/example/tasktracker/Api/ApiService.java new file mode 100644 index 0000000..21fcc55 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Api/ApiService.java @@ -0,0 +1,30 @@ +package com.example.tasktracker.Api; + +import com.example.tasktracker.Answers.LoginAnswer; +import com.example.tasktracker.Answers.Task; + +import java.util.ArrayList; + +import io.reactivex.rxjava3.core.Single; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public interface ApiService { + @GET("singin") + Single singin(@Query("login") String login, @Query("password") String password); + + @POST("singup") + Single singup(@Query("login") String login, @Query("password") String password); + + @GET("user/task") + Single> getTaskList(@Query("token") String token); + + @POST("user/task/add") + Call addTask(@Query("token") String token, @Body Task task); + + @POST("user/task/remove") + Call removeTask(@Query("token") String token, @Query("id") long ID); +} diff --git a/app/src/main/java/com/example/tasktracker/Api/TaskDao.java b/app/src/main/java/com/example/tasktracker/Api/TaskDao.java new file mode 100644 index 0000000..80401e4 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Api/TaskDao.java @@ -0,0 +1,29 @@ +package com.example.tasktracker.Api; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import com.example.tasktracker.Answers.Task; + +import java.util.List; + +import retrofit2.Call; + +@Dao +public interface TaskDao { + @Query("SELECT * FROM task_room") + LiveData> getTaskList(); + + @Query("DELETE FROM task_room") + void DropTable(); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void addTask(Task... task); + + @Delete + void delete(Task task); +} diff --git a/app/src/main/java/com/example/tasktracker/Api/TaskRepository.java b/app/src/main/java/com/example/tasktracker/Api/TaskRepository.java new file mode 100644 index 0000000..c865e34 --- /dev/null +++ b/app/src/main/java/com/example/tasktracker/Api/TaskRepository.java @@ -0,0 +1,26 @@ +package com.example.tasktracker.Api; + +import android.app.Application; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import com.example.tasktracker.Answers.Task; + +@Database(entities = {Task.class}, version = 1) +public abstract class TaskRepository extends RoomDatabase { + private static final String DATABASE_NAME = "task.db"; + private static TaskRepository instance = null; + + public static TaskRepository newInstance(Application app) { + if(instance == null) { + instance = Room.databaseBuilder(app, + TaskRepository.class, + DATABASE_NAME).build(); + } + return instance; + } + + public abstract TaskDao taskDao(); +} diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon.png b/app/src/main/res/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9f796c78dbe13d48e2aca6c256c806ddc865a501 GIT binary patch literal 7287 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 + + + + + + + + + + + +