Add change password

This commit is contained in:
Данил
2025-05-27 20:11:29 +07:00
parent 64613428b8
commit 7217515b38
12 changed files with 246 additions and 24 deletions
+6
View File
@@ -17,6 +17,12 @@
android:theme="@style/Theme.TaskTracker" android:theme="@style/Theme.TaskTracker"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".Activities.SettingsActivity"
android:exported="false" />
<activity
android:name=".Settings"
android:exported="false" />
<activity <activity
android:name=".Activities.EditTask" android:name=".Activities.EditTask"
android:exported="false" /> android:exported="false" />
@@ -2,14 +2,13 @@ package com.example.tasktracker.Activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.example.tasktracker.Answers.LoginAnswer; import com.example.tasktracker.Answers.StatusAnswer;
import com.example.tasktracker.Api.ApiFactory; import com.example.tasktracker.Api.ApiFactory;
import com.example.tasktracker.PublicKeyNames; import com.example.tasktracker.PublicKeyNames;
import com.example.tasktracker.R; import com.example.tasktracker.R;
@@ -84,9 +83,9 @@ public class LoginActivity extends AppCompatActivity {
private void SingIn() { private void SingIn() {
Disposable disposable = ApiFactory.getApiService().singin(login, password) Disposable disposable = ApiFactory.getApiService().singin(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<LoginAnswer>() { .subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override @Override
public void accept(LoginAnswer loginAnswer) throws Throwable { public void accept(StatusAnswer loginAnswer) throws Throwable {
if(loginAnswer.getStatus().equals("big")) { if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidLogin, Snackbar.LENGTH_SHORT).show();
return; return;
@@ -116,9 +115,9 @@ public class LoginActivity extends AppCompatActivity {
} }
private void SingUp() { private void SingUp() {
Disposable disposable = ApiFactory.getApiService().singup(login, password) Disposable disposable = ApiFactory.getApiService().singup(login, password)
.subscribeOn(Schedulers.io()).subscribe(new Consumer<LoginAnswer>() { .subscribeOn(Schedulers.io()).subscribe(new Consumer<StatusAnswer>() {
@Override @Override
public void accept(LoginAnswer loginAnswer) throws Throwable { public void accept(StatusAnswer loginAnswer) throws Throwable {
if(loginAnswer.getStatus().equals("big")) { if(loginAnswer.getStatus().equals("big")) {
Snackbar.make(binding.getRoot(), R.string.snackbar_BigLoginPassword, Snackbar.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.snackbar_BigLoginPassword, Snackbar.LENGTH_SHORT).show();
return; return;
@@ -1,5 +1,8 @@
package com.example.tasktracker.Activities; package com.example.tasktracker.Activities;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -115,19 +118,6 @@ public class MainMenu extends AppCompatActivity {
} }
}); });
binding.buttonSingOut.setOnClickListener(v -> {
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).
edit().
remove(PublicKeyNames.LOGIN_KEY).
remove(PublicKeyNames.PASSWORD_KEY).
apply();
@SuppressLint("UnsafeIntentLaunch")
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
});
viewModel.getOnLoad().observe(this, new Observer<List<Task>>() { viewModel.getOnLoad().observe(this, new Observer<List<Task>>() {
@Override @Override
public void onChanged(List<Task> tasks) { public void onChanged(List<Task> tasks) {
@@ -148,6 +138,22 @@ public class MainMenu extends AppCompatActivity {
} }
public void Offline() { public void Offline() {
binding.buttonSettings.setVisibility(INVISIBLE);
binding.buttonLogOut.setVisibility(VISIBLE);
binding.buttonLogOut.setOnClickListener(v -> {
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE).
edit().
remove(PublicKeyNames.LOGIN_KEY).
remove(PublicKeyNames.PASSWORD_KEY).
apply();
@SuppressLint("UnsafeIntentLaunch")
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
});
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override @Override
@@ -181,6 +187,11 @@ public class MainMenu extends AppCompatActivity {
} }
private void Online() { private void Online() {
binding.buttonSettings.setOnClickListener(v->{
Intent intent = SettingsActivity.getIntent(this, login);
startActivity(intent);
});
viewModel.onFail().observe(this, new Observer<String>() { viewModel.onFail().observe(this, new Observer<String>() {
@Override @Override
public void onChanged(String s) { public void onChanged(String s) {
@@ -0,0 +1,103 @@
package com.example.tasktracker.Activities;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
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.ActivitySettingsBinding;
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 SettingsActivity extends AppCompatActivity {
private ActivitySettingsBinding binding;
private CompositeDisposable compositeDisposable;
private String login;
public static Intent getIntent(Context context, String login) {
Intent intent = new Intent(context, SettingsActivity.class);
intent.putExtra(PublicKeyNames.LOGIN_KEY, login);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
binding = ActivitySettingsBinding.inflate(getLayoutInflater());
super.onCreate(savedInstanceState);
setContentView(binding.getRoot());
login = getIntent().getStringExtra(PublicKeyNames.LOGIN_KEY);
binding.login.setText(login);
binding.buttonBack.setOnClickListener(v->{
finish();
});
binding.buttonLogOut.setOnClickListener(v->{
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE)
.edit()
.remove(PublicKeyNames.LOGIN_KEY)
.remove(PublicKeyNames.PASSWORD_KEY)
.apply();
Intent intent = new Intent(SettingsActivity.this, LoginActivity.class);
startActivity(intent);
finish();
});
compositeDisposable = new CompositeDisposable();
binding.buttonChangePassword.setOnClickListener(v->{
String oldPassword = binding.fieldOldPassword.getText().toString();
String newPassword = binding.fieldNewPassword.getText().toString();
String retryPassword = binding.fieldRetreyPassword.getText().toString();
if(!retryPassword.equals(newPassword)) {
Snackbar.make(binding.getRoot(), R.string.snackbar_PasswordsNotEquals, Snackbar.LENGTH_LONG).show();
return;
}
Disposable disposable = ApiFactory.getApiService().changePassword(oldPassword, login, newPassword)
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<StatusAnswer>() {
@Override
public void accept(StatusAnswer statusAnswer) throws Throwable {
if (statusAnswer.getStatus().equals("ok")) {
getSharedPreferences(PublicKeyNames.TOKEN_LIST, MODE_PRIVATE)
.edit()
.remove(PublicKeyNames.LOGIN_KEY)
.remove(PublicKeyNames.PASSWORD_KEY)
.apply();
Intent intent = new Intent(SettingsActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
else {
Snackbar.make(binding.getRoot(), R.string.snackbar_InvalidPassword, Snackbar.LENGTH_SHORT).show();
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Throwable {
Snackbar.make(binding.getRoot(), R.string.snackbar_InternetError, Snackbar.LENGTH_SHORT).show();
}
});
compositeDisposable.add(disposable);
});
}
@Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.dispose();
}
}
@@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName;
import java.io.Serializable; import java.io.Serializable;
public class LoginAnswer implements Serializable { public class StatusAnswer implements Serializable {
@SerializedName("status") @SerializedName("status")
private String status; private String status;
@@ -1,6 +1,6 @@
package com.example.tasktracker.Api; package com.example.tasktracker.Api;
import com.example.tasktracker.Answers.LoginAnswer; import com.example.tasktracker.Answers.StatusAnswer;
import com.example.tasktracker.Answers.Task; import com.example.tasktracker.Answers.Task;
import java.util.ArrayList; import java.util.ArrayList;
@@ -14,10 +14,10 @@ import retrofit2.http.Query;
public interface ApiService { public interface ApiService {
@GET("singin") @GET("singin")
Single<LoginAnswer> singin(@Query("login") String login, @Query("password") String password); Single<StatusAnswer> singin(@Query("login") String login, @Query("password") String password);
@POST("singup") @POST("singup")
Single<LoginAnswer> singup(@Query("login") String login, @Query("password") String password); Single<StatusAnswer> singup(@Query("login") String login, @Query("password") String password);
@GET("user/task") @GET("user/task")
Single<Task> getTask(@Query("login") String login, @Query("password") String password, @Query("id") long id); Single<Task> getTask(@Query("login") String login, @Query("password") String password, @Query("id") long id);
@@ -33,4 +33,7 @@ public interface ApiService {
@POST("user/task/remove") @POST("user/task/remove")
Call<Void> removeTask(@Query("login") String login, @Query("password") String password, @Query("id") long ID); Call<Void> removeTask(@Query("login") String login, @Query("password") String password, @Query("id") long ID);
@POST("user/ChangePassword")
Single<StatusAnswer> changePassword(@Query("oldPassword") String oldPassword, @Query("login") String login, @Query("newPassword") String newPassword);
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+11 -1
View File
@@ -29,12 +29,22 @@
app:layout_constraintTop_toBottomOf="@id/findLine"/> app:layout_constraintTop_toBottomOf="@id/findLine"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/button_SingOut" android:id="@+id/button_LogOut"
android:src="@drawable/exit" android:src="@drawable/exit"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/button_addNewTask" app:layout_constraintBottom_toTopOf="@+id/button_addNewTask"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="20sp"
android:visibility="invisible"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/button_Settings"
android:src="@drawable/setting"
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"/> android:layout_margin="20sp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Activities.SettingsActivity">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/button_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10sp"
android:src="@android:drawable/ic_media_rew"/>
<TextView
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
tools:hint="login"/>
<EditText
android:id="@+id/field_oldPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
android:hint="@string/hint_OldPassword"
android:inputType="textPassword"/>
<EditText
android:id="@+id/field_newPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
android:hint="@string/hint_NewPassword"
android:inputType="textPassword"/>
<EditText
android:id="@+id/field_retreyPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
android:hint="@string/hint_RetreyPassword"
android:inputType="textPassword"/>
<Button
android:id="@+id/button_changePassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
android:text="@string/button_ChangePassword"/>
<Button
android:id="@+id/button_LogOut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_margin="10sp"
android:text="@string/button_LogOut"/>
</LinearLayout>
+7
View File
@@ -13,6 +13,8 @@
<string name="hint_TaskName">Task name</string> <string name="hint_TaskName">Task name</string>
<string name="hint_TaskDescription">Description</string> <string name="hint_TaskDescription">Description</string>
<string name="hint_Minute">Minute</string> <string name="hint_Minute">Minute</string>
<string name="snackbar_PasswordsNotEquals">Passwords not equals</string>
<string name="hint_RetreyPassword">Retry password</string>
<string name="snackbar_EnterLogin">Enter login</string> <string name="snackbar_EnterLogin">Enter login</string>
<string name="snackbar_EnterPassword">Enter password</string> <string name="snackbar_EnterPassword">Enter password</string>
<string name="snackbar_InvalidLogin">Incorrect login or password</string> <string name="snackbar_InvalidLogin">Incorrect login or password</string>
@@ -29,4 +31,9 @@
<string name="hint_Hour">Hour</string> <string name="hint_Hour">Hour</string>
<string name="snackbar_BigLoginPassword">Login or password is too long.</string> <string name="snackbar_BigLoginPassword">Login or password is too long.</string>
<string name="snackbar_SmallLoginPassword">Login or password is too small.</string> <string name="snackbar_SmallLoginPassword">Login or password is too small.</string>
<string name="hint_OldPassword">Old password</string>
<string name="hint_NewPassword">New password</string>
<string name="button_ChangePassword">Change password</string>
<string name="button_LogOut">Log out</string>
<string name="snackbar_InvalidPassword">Invalid password</string>
</resources> </resources>
+7
View File
@@ -13,6 +13,8 @@
<string name="hint_TaskName">Название задачи</string> <string name="hint_TaskName">Название задачи</string>
<string name="hint_TaskDescription">Описание</string> <string name="hint_TaskDescription">Описание</string>
<string name="hint_Minute">Минута</string> <string name="hint_Minute">Минута</string>
<string name="snackbar_PasswordsNotEquals">Пароли не софпадают</string>
<string name="hint_RetreyPassword">Повтори пароль</string>
<string name="snackbar_EnterLogin">Введите логин</string> <string name="snackbar_EnterLogin">Введите логин</string>
<string name="snackbar_EnterPassword">Введите пароль</string> <string name="snackbar_EnterPassword">Введите пароль</string>
<string name="snackbar_InvalidLogin">Неправильный логин или пароль</string> <string name="snackbar_InvalidLogin">Неправильный логин или пароль</string>
@@ -29,4 +31,9 @@
<string name="hint_Hour">Час</string> <string name="hint_Hour">Час</string>
<string name="snackbar_BigLoginPassword">Логин или пороль слишком длинный.</string> <string name="snackbar_BigLoginPassword">Логин или пороль слишком длинный.</string>
<string name="snackbar_SmallLoginPassword">Логин или пороль слишком короткий.</string> <string name="snackbar_SmallLoginPassword">Логин или пороль слишком короткий.</string>
<string name="hint_OldPassword">Старый пароль</string>
<string name="hint_NewPassword">Новый пароль</string>
<string name="button_ChangePassword">Сменить пароль</string>
<string name="button_LogOut">Выйти</string>
<string name="snackbar_InvalidPassword">Не верный пароль</string>
</resources> </resources>
+7
View File
@@ -12,6 +12,8 @@
<string name="button_NO">No</string> <string name="button_NO">No</string>
<string name="button_DefaultData" translatable="false">DD/MM/YEAR</string> <string name="button_DefaultData" translatable="false">DD/MM/YEAR</string>
<string name="button_DefaultTime" translatable="false">HH/MM</string> <string name="button_DefaultTime" translatable="false">HH/MM</string>
<string name="button_ChangePassword">Change password</string>
<string name="button_LogOut">Log out</string>
<!-- Hints --> <!-- Hints -->
<string name="hint_Login">Login</string> <string name="hint_Login">Login</string>
@@ -24,6 +26,9 @@
<string name="hint_Yar">Year</string> <string name="hint_Yar">Year</string>
<string name="hint_Hour">Hour</string> <string name="hint_Hour">Hour</string>
<string name="hint_Minute">Minute</string> <string name="hint_Minute">Minute</string>
<string name="hint_OldPassword">Old password</string>
<string name="hint_NewPassword">New password</string>
<string name="hint_RetreyPassword">Retry password</string>
<!-- Snackbar --> <!-- Snackbar -->
<string name="snackbar_EnterLogin">Enter login</string> <string name="snackbar_EnterLogin">Enter login</string>
@@ -36,5 +41,7 @@
<string name="snackbar_DataBaseError">Something went wrong.</string> <string name="snackbar_DataBaseError">Something went wrong.</string>
<string name="snackbar_BigLoginPassword">Login or password is too long.</string> <string name="snackbar_BigLoginPassword">Login or password is too long.</string>
<string name="snackbar_SmallLoginPassword">Login or password is too small.</string> <string name="snackbar_SmallLoginPassword">Login or password is too small.</string>
<string name="snackbar_PasswordsNotEquals">Passwords not equals</string>
<string name="snackbar_InvalidPassword">Invalid password</string>
</resources> </resources>