From 6f02602024c787bb3f2486bf83f669fedf9c4d98 Mon Sep 17 00:00:00 2001 From: timothy Date: Thu, 12 Oct 2023 05:30:34 +1100 Subject: [PATCH] basic login feature implemented, currently have 2 built in accounts called Account1&2, with corresponding paswword test1&2. --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 46 ++--- .../settings/AccountSettingsFragment.java | 50 ++++++ .../settings/SettingsResourceRegistry.java | 1 + .../settings/profile/ManageAccounts.java | 49 ++++++ .../settings/profile/SignInActivity.java | 160 ++++++++++++++++++ .../res/layout-w1240dp/activity_login.xml | 69 ++++++++ .../main/res/layout-w936dp/activity_login.xml | 76 +++++++++ app/src/main/res/layout/activity_login.xml | 69 ++++++++ app/src/main/res/layout/activity_sign_in.xml | 74 ++++++++ app/src/main/res/raw/credentials | 2 + app/src/main/res/raw/data | 2 + app/src/main/res/values-land/dimens.xml | 1 + app/src/main/res/values-w1240dp/dimens.xml | 3 + app/src/main/res/values-w600dp/dimens.xml | 3 + app/src/main/res/values/strings.xml | 15 ++ app/src/main/res/xml/account_settings.xml | 18 ++ .../main/res/xml/activity_manage_accounts.xml | 22 +++ app/src/main/res/xml/main_settings.xml | 7 + gradle.properties | 15 +- 20 files changed, 660 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/AccountSettingsFragment.java create mode 100644 app/src/main/java/org/schabi/newpipe/settings/profile/ManageAccounts.java create mode 100644 app/src/main/java/org/schabi/newpipe/settings/profile/SignInActivity.java create mode 100644 app/src/main/res/layout-w1240dp/activity_login.xml create mode 100644 app/src/main/res/layout-w936dp/activity_login.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_sign_in.xml create mode 100644 app/src/main/res/raw/credentials create mode 100644 app/src/main/res/raw/data create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/xml/account_settings.xml create mode 100644 app/src/main/res/xml/activity_manage_accounts.xml diff --git a/app/build.gradle b/app/build.gradle index 7b69b5b72..86742443f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,6 +188,8 @@ sonar { } dependencies { + implementation 'androidx.annotation:annotation:1.6.0' + /** Desugaring **/ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1127c55a4..09eb5d5f7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,12 +9,11 @@ - - - + + @@ -36,6 +35,16 @@ android:resizeableActivity="true" android:theme="@style/OpeningTheme" tools:ignore="AllowBackup"> + + + - - - - - - + android:exported="false" /> + - + + @@ -337,7 +342,7 @@ - + @@ -353,7 +358,6 @@ - @@ -367,7 +371,6 @@ - @@ -404,24 +407,21 @@ - + - - + android:exported="false" /> - + android:value="true" /> - + android:value="true" /> - + + \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/settings/AccountSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/AccountSettingsFragment.java new file mode 100644 index 000000000..a7196fca9 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/AccountSettingsFragment.java @@ -0,0 +1,50 @@ +package org.schabi.newpipe.settings; + +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.preference.Preference; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.settings.profile.ManageAccounts; +import org.schabi.newpipe.settings.profile.SignInActivity; + +public class AccountSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResourceRegistry(); + + } + + @Override + public boolean onPreferenceTreeClick(final Preference preference) { + if (getString(R.string.sign_in).equals(preference.getKey())) { + try { + final Intent intent = new Intent(requireContext(), SignInActivity.class); + startActivity(intent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); + } + } +// if (getString(R.string.sign_out).equals(preference.getKey())) { +// try { +// startActivity(new Intent(Settings.ACTION_CAPTIONING_SETTINGS)); +// } catch (final ActivityNotFoundException e) { +// Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); +// } +// } + if (getString(R.string.manage_accounts).equals(preference.getKey())) { + try { + final Intent intent = new Intent(requireContext(), ManageAccounts.class); + startActivity(intent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); + } + } + + return super.onPreferenceTreeClick(preference); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java index b3d0741bb..bf9d4afc0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -41,6 +41,7 @@ public final class SettingsResourceRegistry { add(UpdateSettingsFragment.class, R.xml.update_settings); add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings); add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings); + add(AccountSettingsFragment.class, R.xml.account_settings); } private SettingRegistryEntry add( diff --git a/app/src/main/java/org/schabi/newpipe/settings/profile/ManageAccounts.java b/app/src/main/java/org/schabi/newpipe/settings/profile/ManageAccounts.java new file mode 100644 index 000000000..e694e1b1e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/profile/ManageAccounts.java @@ -0,0 +1,49 @@ +package org.schabi.newpipe.settings.profile; + +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.preference.Preference; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.settings.BasePreferenceFragment; + +public class ManageAccounts extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResourceRegistry(); + + } + + @Override + public boolean onPreferenceTreeClick(final Preference preference) { + if (getString(R.string.sign_in).equals(preference.getKey())) { + try { + final Intent intent = new Intent(requireContext(), SignInActivity.class); + startActivity(intent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); + } + } +// if (getString(R.string.sign_out).equals(preference.getKey())) { +// try { +// startActivity(new Intent(Settings.ACTION_CAPTIONING_SETTINGS)); +// } catch (final ActivityNotFoundException e) { +// Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); +// } +// } + if (getString(R.string.manage_accounts).equals(preference.getKey())) { + try { + final Intent intent = new Intent(requireContext(), ManageAccounts.class); + startActivity(intent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show(); + } + } + + return super.onPreferenceTreeClick(preference); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/profile/SignInActivity.java b/app/src/main/java/org/schabi/newpipe/settings/profile/SignInActivity.java new file mode 100644 index 000000000..852b1bf79 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/profile/SignInActivity.java @@ -0,0 +1,160 @@ +package org.schabi.newpipe.settings.profile; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import org.schabi.newpipe.MainActivity; +import org.schabi.newpipe.R; + +import java.io.BufferedReader; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + + +public class SignInActivity extends AppCompatActivity { + + private EditText etUsername; + private EditText etPassword; + private Button btLogin; + private Button btRegister; + + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_in); + btLogin = findViewById(R.id.buttonLogin); + btRegister = findViewById(R.id.buttonRegister); + etUsername = findViewById(R.id.usernameEditText); + etPassword = findViewById(R.id.passwordEditText); + + btLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + + final String enteredUsername = etUsername.getText().toString(); + final String enteredPassword = etPassword.getText().toString(); + + if (authenticateUser(SignInActivity.this, + enteredUsername, enteredPassword)) { + // Successful + Toast.makeText(SignInActivity.this, "Login successful", + Toast.LENGTH_SHORT) + .show(); + final Intent intent = new Intent(SignInActivity.this, + MainActivity.class); + intent.putExtra("username", enteredUsername); + startActivity(intent); + } else { + // Incorrect credentials + Toast.makeText(SignInActivity.this, + "Invalid username or password", Toast.LENGTH_SHORT).show(); + } + } + + }); + + btRegister.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + + final String username = etUsername.getText().toString().trim(); + final String password = etPassword.getText().toString().trim(); + + // Check if username and password are not empty + if (!username.isEmpty() && !password.isEmpty()) { + + final boolean registrationSuccessful = registerUser(username, password); + + if (registrationSuccessful) { + + Toast.makeText(getApplicationContext(), "Registration successful", + Toast.LENGTH_SHORT).show(); + } else { + + Toast.makeText(getApplicationContext(), "Registration failed", + Toast.LENGTH_SHORT).show(); + } + } else { + + Toast.makeText(getApplicationContext(), + "Please enter both username and password", + Toast.LENGTH_SHORT).show(); + } + } + }); + } + + private boolean authenticateUser(final Context context, + final String username, final String password) { + try { + final InputStream inputStream = context.getResources() + .openRawResource(R.raw.credentials); + final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + System.out.println(inputStream); + while ((line = reader.readLine()) != null) { + line = line.replace("*", "").trim(); + final String[] fields = line.split("\\|\\|"); + + boolean usernameCorrect = false; + boolean passwordCorrect = false; + + for (final String field : fields) { + final String[] keyValue = field.split("="); + if (keyValue.length == 2) { + final String key = keyValue[0].trim(); + final String value = keyValue[1].trim(); + + if (key.equals("username") && value.equals(username)) { + usernameCorrect = true; + } else if (key.equals("password") && value.equals(password)) { + passwordCorrect = true; + } + } + } + + if (usernameCorrect && passwordCorrect) { + return true; + } + } + + reader.close(); + } catch (final IOException e) { + e.printStackTrace(); + } + + return false; + } + + private boolean registerUser(final String username, final String password) { + try { + + final FileOutputStream fos = openFileOutput("credentials.txt", + Context.MODE_APPEND); + + + final String newCredentials = "*username=" + username + + "||password=" + password + "*\n"; + + fos.write(newCredentials.getBytes()); + + fos.close(); + + return true; + } catch (final IOException e) { + e.printStackTrace(); + + return false; + } + } +} diff --git a/app/src/main/res/layout-w1240dp/activity_login.xml b/app/src/main/res/layout-w1240dp/activity_login.xml new file mode 100644 index 000000000..368db092f --- /dev/null +++ b/app/src/main/res/layout-w1240dp/activity_login.xml @@ -0,0 +1,69 @@ + + + + + + + +