Registration + Login

This commit is contained in:
Fawkes100 2025-01-06 18:17:45 +01:00
parent 0d9002776c
commit 71568a200f
16 changed files with 264 additions and 39 deletions

View File

@ -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");
} }

View File

@ -0,0 +1,7 @@
package core.notevault.sync;
public interface APICallback {
void onSuccess();
void onError(String error);
}

View File

@ -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();

View 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;
}
}

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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();
} }

View File

@ -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();
}
}

View 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>

View File

@ -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>