Registration + Login
This commit is contained in:
parent
0d9002776c
commit
71568a200f
@ -31,7 +31,9 @@ import core.notevault.ui.gallery.GalleryFragment;
|
|||||||
import core.notevault.ui.gallery.detail.ConcertSongSelector;
|
import core.notevault.ui.gallery.detail.ConcertSongSelector;
|
||||||
import core.notevault.ui.gallery.editor.ConcertEditorDialog;
|
import core.notevault.ui.gallery.editor.ConcertEditorDialog;
|
||||||
import core.notevault.ui.home.HomeFragment;
|
import core.notevault.ui.home.HomeFragment;
|
||||||
|
import core.notevault.ui.login.LoginCallBackImpl;
|
||||||
import core.notevault.ui.login.LoginDialogFragment;
|
import core.notevault.ui.login.LoginDialogFragment;
|
||||||
|
import core.notevault.ui.login.RegisterCallback;
|
||||||
import core.notevault.ui.metadatadialog.MetaDataDialog;
|
import core.notevault.ui.metadatadialog.MetaDataDialog;
|
||||||
import core.notevault.util.NoteSheetsUtil;
|
import core.notevault.util.NoteSheetsUtil;
|
||||||
|
|
||||||
@ -129,7 +131,7 @@ public class MainActivity extends AppCompatActivity implements MetaDataDialog.On
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showLoginDialog() {
|
private void showLoginDialog() {
|
||||||
LoginDialogFragment loginDialogFragment = new LoginDialogFragment();
|
LoginDialogFragment loginDialogFragment = LoginDialogFragment.newInstance(new LoginCallBackImpl(this), new RegisterCallback(this));
|
||||||
loginDialogFragment.show(getSupportFragmentManager(), "login");
|
loginDialogFragment.show(getSupportFragmentManager(), "login");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
app/src/main/java/core/notevault/sync/APICallback.java
Normal file
7
app/src/main/java/core/notevault/sync/APICallback.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package core.notevault.sync;
|
||||||
|
|
||||||
|
public interface APICallback {
|
||||||
|
|
||||||
|
void onSuccess();
|
||||||
|
void onError(String error);
|
||||||
|
}
|
@ -24,7 +24,7 @@ public class ApiClient {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
retrofit = new Retrofit.Builder()
|
retrofit = new Retrofit.Builder()
|
||||||
.baseUrl("http://192.168.178.30:8080/")
|
.baseUrl("http://192.168.178.30:8000/")
|
||||||
.client(client)
|
.client(client)
|
||||||
.addConverterFactory(GsonConverterFactory.create())
|
.addConverterFactory(GsonConverterFactory.create())
|
||||||
.build();
|
.build();
|
||||||
|
14
app/src/main/java/core/notevault/sync/StatusResponse.java
Normal file
14
app/src/main/java/core/notevault/sync/StatusResponse.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package core.notevault.sync;
|
||||||
|
|
||||||
|
public class StatusResponse {
|
||||||
|
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,13 @@
|
|||||||
package core.notevault.sync.auth;
|
package core.notevault.sync.auth;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import core.notevault.sync.APICallback;
|
||||||
import core.notevault.sync.ApiClient;
|
import core.notevault.sync.ApiClient;
|
||||||
|
import core.notevault.sync.StatusResponse;
|
||||||
|
import core.notevault.sync.auth.apimodel.LoginRequest;
|
||||||
|
import core.notevault.sync.auth.apimodel.LoginResponse;
|
||||||
|
import core.notevault.sync.auth.apimodel.RegisterRequest;
|
||||||
|
import core.notevault.sync.auth.apimodel.RegisterResponse;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
@ -16,8 +21,8 @@ public class AuthRepository {
|
|||||||
this.tokenManager = new TokenManager(context);
|
this.tokenManager = new TokenManager(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void performLogin(String username, String password, LoginCallback callback) {
|
public void performLogin(String email, String password, APICallback callback) {
|
||||||
LoginRequest loginRequest = new LoginRequest(username, password);
|
LoginRequest loginRequest = new LoginRequest(email, password);
|
||||||
|
|
||||||
authService.login(loginRequest).enqueue(new Callback<LoginResponse>() {
|
authService.login(loginRequest).enqueue(new Callback<LoginResponse>() {
|
||||||
@Override
|
@Override
|
||||||
@ -41,6 +46,26 @@ public class AuthRepository {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void performRegistration(String email, String username, String password, APICallback callback) {
|
||||||
|
RegisterRequest registerRequest = new RegisterRequest(username, password, email);
|
||||||
|
authService.registration(registerRequest).enqueue(new Callback<StatusResponse>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(Call<StatusResponse> call, Response<StatusResponse> response) {
|
||||||
|
if(response.isSuccessful() && response.body() != null) {
|
||||||
|
callback.onSuccess();
|
||||||
|
} else {
|
||||||
|
callback.onError("Registration fehlgeschlagen. Überprüfe Benutzername und Passwort.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call<StatusResponse> call, Throwable throwable) {
|
||||||
|
callback.onError("Netzwerkfehler: " + throwable.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void saveToken(String token) {
|
private void saveToken(String token) {
|
||||||
tokenManager.saveToken(token);
|
tokenManager.saveToken(token);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
package core.notevault.sync.auth;
|
package core.notevault.sync.auth;
|
||||||
|
|
||||||
|
import core.notevault.sync.StatusResponse;
|
||||||
|
import core.notevault.sync.auth.apimodel.LoginRequest;
|
||||||
|
import core.notevault.sync.auth.apimodel.LoginResponse;
|
||||||
|
import core.notevault.sync.auth.apimodel.RegisterRequest;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.http.Body;
|
import retrofit2.http.Body;
|
||||||
|
import retrofit2.http.Headers;
|
||||||
import retrofit2.http.POST;
|
import retrofit2.http.POST;
|
||||||
|
|
||||||
public interface AuthService {
|
public interface AuthService {
|
||||||
|
|
||||||
@POST("api/v1/auth/login")
|
@POST("/login/")
|
||||||
Call<LoginResponse> login(@Body LoginRequest loginRequest);
|
Call<LoginResponse> login(@Body LoginRequest loginRequest);
|
||||||
|
|
||||||
|
@POST("/register/")
|
||||||
|
@Headers("Content-Type: application/json")
|
||||||
|
Call<StatusResponse> registration(@Body RegisterRequest registerRequest);
|
||||||
}
|
}
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
package core.notevault.sync.auth;
|
|
||||||
|
|
||||||
public class LoginRequest {
|
|
||||||
private String username;
|
|
||||||
private String password;
|
|
||||||
|
|
||||||
public LoginRequest(String username, String password) {
|
|
||||||
this.username = username;
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,13 @@
|
|||||||
|
package core.notevault.sync.auth.apimodel;
|
||||||
|
|
||||||
|
public class LoginRequest {
|
||||||
|
private String email;
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
public LoginRequest(String email, String password) {
|
||||||
|
this.email = email;
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package core.notevault.sync.auth;
|
package core.notevault.sync.auth.apimodel;
|
||||||
|
|
||||||
public class LoginResponse {
|
public class LoginResponse {
|
||||||
private String token;
|
private String token;
|
@ -0,0 +1,14 @@
|
|||||||
|
package core.notevault.sync.auth.apimodel;
|
||||||
|
|
||||||
|
public class RegisterRequest {
|
||||||
|
private String username;
|
||||||
|
private String email;
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
public RegisterRequest(String username, String password, String email) {
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package core.notevault.sync.auth.apimodel;
|
||||||
|
|
||||||
|
public class RegisterResponse {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public RegisterResponse(String username, String email) {
|
||||||
|
this.username = username;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegisterResponse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
}
|
@ -3,9 +3,10 @@ package core.notevault.ui.login;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import core.notevault.sync.APICallback;
|
||||||
import core.notevault.sync.auth.LoginCallback;
|
import core.notevault.sync.auth.LoginCallback;
|
||||||
|
|
||||||
public class LoginCallBackImpl implements LoginCallback {
|
public class LoginCallBackImpl implements APICallback {
|
||||||
private Context context;
|
private Context context;
|
||||||
|
|
||||||
public LoginCallBackImpl(Context context) {
|
public LoginCallBackImpl(Context context) {
|
||||||
|
@ -6,41 +6,44 @@ import android.content.Context;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import core.notevault.R;
|
import core.notevault.R;
|
||||||
|
import core.notevault.sync.APICallback;
|
||||||
import core.notevault.sync.auth.AuthRepository;
|
import core.notevault.sync.auth.AuthRepository;
|
||||||
import core.notevault.sync.auth.LoginCallback;
|
import core.notevault.sync.auth.LoginCallback;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
|
|
||||||
public class LoginDialogFragment extends DialogFragment {
|
public class LoginDialogFragment extends DialogFragment {
|
||||||
private LoginCallback loginCallback;
|
private APICallback loginCallback;
|
||||||
|
private APICallback registerCallback;
|
||||||
|
|
||||||
|
private boolean isLoginMode = true; // Default mode
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(Context context) {
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
if (context instanceof LoginCallback) {
|
if (loginCallback == null || registerCallback == null) {
|
||||||
loginCallback = (LoginCallback) context;
|
throw new IllegalStateException("LoginDialogFragment must be created using newInstance()");
|
||||||
} else {
|
|
||||||
throw new RuntimeException(context.toString() + " must implement LoginDialogListener");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static LoginDialogFragment newInstance(APICallback loginCallback, APICallback registerCallback) {
|
||||||
|
LoginDialogFragment fragment = new LoginDialogFragment();
|
||||||
|
fragment.loginCallback = loginCallback;
|
||||||
|
fragment.registerCallback = registerCallback;
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||||
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
/*return new AlertDialog.Builder(requireContext())
|
||||||
View loginView = inflater.inflate(R.layout.fragment_login_dialog, null); // Ersetze 'your_dialog_layout' durch deinen Dateinamen
|
|
||||||
|
|
||||||
EditText usernameInput = loginView.findViewById(R.id.editTextUsername);
|
|
||||||
EditText passwordInput = loginView.findViewById(R.id.editTextPassword);
|
|
||||||
|
|
||||||
AuthRepository authRepository = new AuthRepository(this.getContext());
|
|
||||||
|
|
||||||
return new AlertDialog.Builder(requireContext())
|
|
||||||
.setView(loginView)
|
.setView(loginView)
|
||||||
.setPositiveButton("Speichern", (dialog, which) -> {
|
.setPositiveButton("Speichern", (dialog, which) -> {
|
||||||
String username = usernameInput.getText().toString();
|
String username = usernameInput.getText().toString();
|
||||||
@ -49,7 +52,48 @@ public class LoginDialogFragment extends DialogFragment {
|
|||||||
authRepository.performLogin(username, password, loginCallback);
|
authRepository.performLogin(username, password, loginCallback);
|
||||||
} )
|
} )
|
||||||
.setNegativeButton("Abbrechen", (dialog, which) -> {} )
|
.setNegativeButton("Abbrechen", (dialog, which) -> {} )
|
||||||
.create();
|
.create();*/
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
|
||||||
|
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
||||||
|
View view = inflater.inflate(R.layout.fragment_login_dialog, null);
|
||||||
|
|
||||||
|
TextView textViewTitle = view.findViewById(R.id.textViewTitle);
|
||||||
|
EditText editTextUsername = view.findViewById(R.id.editTextUsername);
|
||||||
|
EditText editTextEmail = view.findViewById(R.id.editTextEmail);
|
||||||
|
EditText editTextPassword = view.findViewById(R.id.editTextPassword);
|
||||||
|
Button buttonAction = view.findViewById(R.id.buttonAction);
|
||||||
|
TextView textViewSwitch = view.findViewById(R.id.textViewSwitch);
|
||||||
|
|
||||||
|
// Handle action button click
|
||||||
|
buttonAction.setOnClickListener(v -> {
|
||||||
|
if (isLoginMode) {
|
||||||
|
// Handle login logic
|
||||||
|
String email = editTextEmail.getText().toString();
|
||||||
|
String password = editTextPassword.getText().toString();
|
||||||
|
AuthRepository authRepository = new AuthRepository(this.getContext());
|
||||||
|
authRepository.performLogin(email, password, loginCallback);
|
||||||
|
} else {
|
||||||
|
// Handle registration logic
|
||||||
|
String email = editTextEmail.getText().toString();
|
||||||
|
String password = editTextPassword.getText().toString();
|
||||||
|
String username = editTextUsername.getText().toString();
|
||||||
|
AuthRepository authRepository = new AuthRepository(this.getContext());
|
||||||
|
authRepository.performRegistration(email, username, password, registerCallback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Toggle between Login and Registration
|
||||||
|
textViewSwitch.setOnClickListener(v -> {
|
||||||
|
isLoginMode = !isLoginMode;
|
||||||
|
textViewTitle.setText(isLoginMode ? "Login" : "Register");
|
||||||
|
editTextUsername.setVisibility(isLoginMode ? View.GONE : View.VISIBLE);
|
||||||
|
buttonAction.setText(isLoginMode ? "Login" : "Register");
|
||||||
|
textViewSwitch.setText(isLoginMode ? "Don't have an account? Register" : "Already have an account? Login");
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.setView(view);
|
||||||
|
return builder.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package core.notevault.ui.login;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import core.notevault.sync.APICallback;
|
||||||
|
|
||||||
|
public class RegisterCallback implements APICallback {
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
public RegisterCallback(Context context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess() {
|
||||||
|
Toast.makeText(context, "Registration successfull", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(String error) {
|
||||||
|
Log.d("Login", error);
|
||||||
|
Toast.makeText(context, "Login not successfull: " + error, Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
6
app/src/main/res/drawable/dialog_background.xml
Normal file
6
app/src/main/res/drawable/dialog_background.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<solid android:color="@android:color/white" />
|
||||||
|
<corners android:radius="16dp" />
|
||||||
|
<padding android:left="16dp" android:top="16dp" android:right="16dp" android:bottom="16dp" />
|
||||||
|
<elevation android:height="4dp" />
|
||||||
|
</shape>
|
@ -1,21 +1,68 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- res/layout/dialog_login.xml -->
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:padding="16dp">
|
android:padding="16dp"
|
||||||
|
android:background="@drawable/dialog_background"
|
||||||
|
android:layout_gravity="center_horizontal">
|
||||||
|
|
||||||
|
<!-- Title -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewTitle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Login"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:gravity="center"
|
||||||
|
android:paddingBottom="16dp" />
|
||||||
|
|
||||||
|
<!-- Username Field (Visible only in Registration mode) -->
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/editTextUsername"
|
android:id="@+id/editTextUsername"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="Username" />
|
android:hint="Username"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<!-- Email Field -->
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/editTextEmail"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="Email"
|
||||||
|
android:inputType="textEmailAddress" />
|
||||||
|
|
||||||
|
<!-- Password Field -->
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/editTextPassword"
|
android:id="@+id/editTextPassword"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="Password"
|
android:hint="Password"
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
|
|
||||||
|
<!-- Action Button -->
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonAction"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Login"
|
||||||
|
android:backgroundTint="?attr/colorPrimary"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:layout_marginTop="16dp" />
|
||||||
|
|
||||||
|
<!-- Toggle Login/Registration -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewSwitch"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Don't have an account? Register"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textColor="?attr/colorPrimary"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
Loading…
Reference in New Issue
Block a user