From 6da65b41bdf2d75afb6b3eb9bd0c2b8ff8c87e6a Mon Sep 17 00:00:00 2001 From: Aneeqa-Rajput Date: Sat, 31 Oct 2020 16:36:09 +0500 Subject: [PATCH] added myself --- MyFirstApplication/.gitignore | 14 ++ MyFirstApplication/.idea/.name | 1 + .../.idea/codeStyles/Project.xml | 116 ++++++++++++ MyFirstApplication/.idea/gradle.xml | 21 +++ MyFirstApplication/.idea/jarRepositories.xml | 25 +++ MyFirstApplication/.idea/misc.xml | 9 + .../.idea/runConfigurations.xml | 12 ++ MyFirstApplication/app/.gitignore | 1 + MyFirstApplication/app/build.gradle | 36 ++++ MyFirstApplication/app/proguard-rules.pro | 21 +++ .../ExampleInstrumentedTest.java | 26 +++ .../app/src/main/AndroidManifest.xml | 26 +++ .../myfirstapplication/InfoActivity.java | 26 +++ .../myfirstapplication/MainActivity.java | 20 ++ .../myfirstapplication/SignupActivity.java | 35 ++++ .../data/LoginDataSource.java | 29 +++ .../data/LoginRepository.java | 54 ++++++ .../myfirstapplication/data/Result.java | 48 +++++ .../data/model/LoggedInUser.java | 23 +++ .../ui/login/LoggedInUserView.java | 17 ++ .../ui/login/LoginActivity.java | 58 ++++++ .../ui/login/LoginFormState.java | 40 ++++ .../ui/login/LoginResult.java | 31 ++++ .../ui/login/LoginViewModel.java | 70 +++++++ .../ui/login/LoginViewModelFactory.java | 26 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++++ .../app/src/main/res/layout/activity_info.xml | 31 ++++ .../src/main/res/layout/activity_login.xml | 78 ++++++++ .../app/src/main/res/layout/activity_main.xml | 7 + .../src/main/res/layout/activity_signup.xml | 45 +++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 12 ++ .../app/src/main/res/values/styles.xml | 10 + .../myfirstapplication/ExampleUnitTest.java | 17 ++ MyFirstApplication/build.gradle | 24 +++ MyFirstApplication/gradle.properties | 19 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + MyFirstApplication/gradlew | 172 ++++++++++++++++++ MyFirstApplication/gradlew.bat | 84 +++++++++ MyFirstApplication/settings.gradle | 2 + 55 files changed, 1513 insertions(+) create mode 100644 MyFirstApplication/.gitignore create mode 100644 MyFirstApplication/.idea/.name create mode 100644 MyFirstApplication/.idea/codeStyles/Project.xml create mode 100644 MyFirstApplication/.idea/gradle.xml create mode 100644 MyFirstApplication/.idea/jarRepositories.xml create mode 100644 MyFirstApplication/.idea/misc.xml create mode 100644 MyFirstApplication/.idea/runConfigurations.xml create mode 100644 MyFirstApplication/app/.gitignore create mode 100644 MyFirstApplication/app/build.gradle create mode 100644 MyFirstApplication/app/proguard-rules.pro create mode 100644 MyFirstApplication/app/src/androidTest/java/com/example/myfirstapplication/ExampleInstrumentedTest.java create mode 100644 MyFirstApplication/app/src/main/AndroidManifest.xml create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/InfoActivity.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/MainActivity.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/SignupActivity.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginDataSource.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginRepository.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/Result.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/model/LoggedInUser.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoggedInUserView.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginActivity.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginFormState.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginResult.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModel.java create mode 100644 MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModelFactory.java create mode 100644 MyFirstApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 MyFirstApplication/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 MyFirstApplication/app/src/main/res/layout/activity_info.xml create mode 100644 MyFirstApplication/app/src/main/res/layout/activity_login.xml create mode 100644 MyFirstApplication/app/src/main/res/layout/activity_main.xml create mode 100644 MyFirstApplication/app/src/main/res/layout/activity_signup.xml create mode 100644 MyFirstApplication/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 MyFirstApplication/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 MyFirstApplication/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 MyFirstApplication/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 MyFirstApplication/app/src/main/res/values/colors.xml create mode 100644 MyFirstApplication/app/src/main/res/values/dimens.xml create mode 100644 MyFirstApplication/app/src/main/res/values/strings.xml create mode 100644 MyFirstApplication/app/src/main/res/values/styles.xml create mode 100644 MyFirstApplication/app/src/test/java/com/example/myfirstapplication/ExampleUnitTest.java create mode 100644 MyFirstApplication/build.gradle create mode 100644 MyFirstApplication/gradle.properties create mode 100644 MyFirstApplication/gradle/wrapper/gradle-wrapper.jar create mode 100644 MyFirstApplication/gradle/wrapper/gradle-wrapper.properties create mode 100644 MyFirstApplication/gradlew create mode 100644 MyFirstApplication/gradlew.bat create mode 100644 MyFirstApplication/settings.gradle diff --git a/MyFirstApplication/.gitignore b/MyFirstApplication/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/MyFirstApplication/.gitignore @@ -0,0 +1,14 @@ +*.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 diff --git a/MyFirstApplication/.idea/.name b/MyFirstApplication/.idea/.name new file mode 100644 index 0000000..f0a094b --- /dev/null +++ b/MyFirstApplication/.idea/.name @@ -0,0 +1 @@ +My First Application \ No newline at end of file diff --git a/MyFirstApplication/.idea/codeStyles/Project.xml b/MyFirstApplication/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/MyFirstApplication/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/MyFirstApplication/.idea/gradle.xml b/MyFirstApplication/.idea/gradle.xml new file mode 100644 index 0000000..ac6b0ae --- /dev/null +++ b/MyFirstApplication/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/.idea/jarRepositories.xml b/MyFirstApplication/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/MyFirstApplication/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/.idea/misc.xml b/MyFirstApplication/.idea/misc.xml new file mode 100644 index 0000000..37a7509 --- /dev/null +++ b/MyFirstApplication/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/.idea/runConfigurations.xml b/MyFirstApplication/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/MyFirstApplication/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/app/.gitignore b/MyFirstApplication/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/MyFirstApplication/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/MyFirstApplication/app/build.gradle b/MyFirstApplication/app/build.gradle new file mode 100644 index 0000000..b8e8f78 --- /dev/null +++ b/MyFirstApplication/app/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "com.example.myfirstapplication" + minSdkVersion 22 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.annotation:annotation:1.1.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + +} \ No newline at end of file diff --git a/MyFirstApplication/app/proguard-rules.pro b/MyFirstApplication/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/MyFirstApplication/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/MyFirstApplication/app/src/androidTest/java/com/example/myfirstapplication/ExampleInstrumentedTest.java b/MyFirstApplication/app/src/androidTest/java/com/example/myfirstapplication/ExampleInstrumentedTest.java new file mode 100644 index 0000000..bb04c24 --- /dev/null +++ b/MyFirstApplication/app/src/androidTest/java/com/example/myfirstapplication/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.myfirstapplication; + +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.myfirstapplication", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/AndroidManifest.xml b/MyFirstApplication/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b6da014 --- /dev/null +++ b/MyFirstApplication/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/InfoActivity.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/InfoActivity.java new file mode 100644 index 0000000..57f0dc4 --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/InfoActivity.java @@ -0,0 +1,26 @@ +package com.example.myfirstapplication; + +import androidx.appcompat.app.AppCompatActivity; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.widget.EditText; +import android.widget.TextView; + +public class InfoActivity extends AppCompatActivity { + + TextView email; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_info); + email=(TextView)findViewById(R.id.textView2); + //getting data from login activity + Intent loginCall=getIntent(); + String displayEmail=loginCall.getStringExtra("Email"); + //displaying it on this activity + email.setText(displayEmail); + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/MainActivity.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/MainActivity.java new file mode 100644 index 0000000..17137ec --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/MainActivity.java @@ -0,0 +1,20 @@ +package com.example.myfirstapplication; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; + +import com.example.myfirstapplication.ui.login.LoginActivity; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Intent callSignup=new Intent(getApplicationContext(), SignupActivity.class); + startActivity(callSignup); + System.out.println("I am here!"); + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/SignupActivity.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/SignupActivity.java new file mode 100644 index 0000000..6541466 --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/SignupActivity.java @@ -0,0 +1,35 @@ +package com.example.myfirstapplication; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.view.View; +import android.widget.EditText; + +import com.example.myfirstapplication.ui.login.LoginActivity; + +public class SignupActivity extends AppCompatActivity { + + EditText email; + EditText password; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_signup); + email=(EditText)findViewById(R.id.editTextTextEmailAddress); + password=(EditText)findViewById(R.id.editTextTextPassword); + Intent mainCall=getIntent(); + } + + public void signUp(View view) { + if(email.getText().toString().trim().equals("abc")&&(password.getText().toString().trim().equals("abc"))){ + Intent callLogin=new Intent(getApplicationContext(), LoginActivity.class); + callLogin.putExtra("originalEmail",email.getText().toString().trim()); + callLogin.putExtra("originalPassword",password.getText().toString().trim()); + startActivity(callLogin); + } + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginDataSource.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginDataSource.java new file mode 100644 index 0000000..986174e --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginDataSource.java @@ -0,0 +1,29 @@ +package com.example.myfirstapplication.data; + +import com.example.myfirstapplication.data.model.LoggedInUser; + +import java.io.IOException; + +/** + * Class that handles authentication w/ login credentials and retrieves user information. + */ +public class LoginDataSource { + + public Result login(String username, String password) { + + try { + // TODO: handle loggedInUser authentication + LoggedInUser fakeUser = + new LoggedInUser( + java.util.UUID.randomUUID().toString(), + "Jane Doe"); + return new Result.Success<>(fakeUser); + } catch (Exception e) { + return new Result.Error(new IOException("Error logging in", e)); + } + } + + public void logout() { + // TODO: revoke authentication + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginRepository.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginRepository.java new file mode 100644 index 0000000..b1435cb --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/LoginRepository.java @@ -0,0 +1,54 @@ +package com.example.myfirstapplication.data; + +import com.example.myfirstapplication.data.model.LoggedInUser; + +/** + * Class that requests authentication and user information from the remote data source and + * maintains an in-memory cache of login status and user credentials information. + */ +public class LoginRepository { + + private static volatile LoginRepository instance; + + private LoginDataSource dataSource; + + // If user credentials will be cached in local storage, it is recommended it be encrypted + // @see https://developer.android.com/training/articles/keystore + private LoggedInUser user = null; + + // private constructor : singleton access + private LoginRepository(LoginDataSource dataSource) { + this.dataSource = dataSource; + } + + public static LoginRepository getInstance(LoginDataSource dataSource) { + if (instance == null) { + instance = new LoginRepository(dataSource); + } + return instance; + } + + public boolean isLoggedIn() { + return user != null; + } + + public void logout() { + user = null; + dataSource.logout(); + } + + private void setLoggedInUser(LoggedInUser user) { + this.user = user; + // If user credentials will be cached in local storage, it is recommended it be encrypted + // @see https://developer.android.com/training/articles/keystore + } + + public Result login(String username, String password) { + // handle login + Result result = dataSource.login(username, password); + if (result instanceof Result.Success) { + setLoggedInUser(((Result.Success) result).getData()); + } + return result; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/Result.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/Result.java new file mode 100644 index 0000000..93d462d --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/Result.java @@ -0,0 +1,48 @@ +package com.example.myfirstapplication.data; + +/** + * A generic class that holds a result success w/ data or an error exception. + */ +public class Result { + // hide the private constructor to limit subclass types (Success, Error) + private Result() { + } + + @Override + public String toString() { + if (this instanceof Result.Success) { + Result.Success success = (Result.Success) this; + return "Success[data=" + success.getData().toString() + "]"; + } else if (this instanceof Result.Error) { + Result.Error error = (Result.Error) this; + return "Error[exception=" + error.getError().toString() + "]"; + } + return ""; + } + + // Success sub-class + public final static class Success extends Result { + private T data; + + public Success(T data) { + this.data = data; + } + + public T getData() { + return this.data; + } + } + + // Error sub-class + public final static class Error extends Result { + private Exception error; + + public Error(Exception error) { + this.error = error; + } + + public Exception getError() { + return this.error; + } + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/model/LoggedInUser.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/model/LoggedInUser.java new file mode 100644 index 0000000..ba00891 --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/data/model/LoggedInUser.java @@ -0,0 +1,23 @@ +package com.example.myfirstapplication.data.model; + +/** + * Data class that captures user information for logged in users retrieved from LoginRepository + */ +public class LoggedInUser { + + private String userId; + private String displayName; + + public LoggedInUser(String userId, String displayName) { + this.userId = userId; + this.displayName = displayName; + } + + public String getUserId() { + return userId; + } + + public String getDisplayName() { + return displayName; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoggedInUserView.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoggedInUserView.java new file mode 100644 index 0000000..ee4a790 --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoggedInUserView.java @@ -0,0 +1,17 @@ +package com.example.myfirstapplication.ui.login; + +/** + * Class exposing authenticated user details to the UI. + */ +class LoggedInUserView { + private String displayName; + //... other data fields that may be accessible to the UI + + LoggedInUserView(String displayName) { + this.displayName = displayName; + } + + String getDisplayName() { + return displayName; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginActivity.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginActivity.java new file mode 100644 index 0000000..c72a65e --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginActivity.java @@ -0,0 +1,58 @@ +package com.example.myfirstapplication.ui.login; + +import android.app.Activity; + +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AppCompatActivity; + +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.myfirstapplication.InfoActivity; +import com.example.myfirstapplication.R; +import com.example.myfirstapplication.ui.login.LoginViewModel; +import com.example.myfirstapplication.ui.login.LoginViewModelFactory; + +public class LoginActivity extends AppCompatActivity { + + private LoginViewModel loginViewModel; + EditText email; + EditText password; + String originalEmail; + String originalPassword; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + email=(EditText)findViewById(R.id.username); + password=(EditText)findViewById(R.id.password); + Intent signupCall=getIntent(); + originalEmail=signupCall.getStringExtra("originalEmail"); + originalPassword=signupCall.getStringExtra("originalPassword"); + + } + + public void info(View view) { + if(email.getText().toString().trim().equals(originalEmail)&&(password.getText().toString().trim().equals(originalPassword))){ + Intent callInfo=new Intent(getApplicationContext(), InfoActivity.class); + callInfo.putExtra("Email",email.getText().toString().trim()); + startActivity(callInfo); + } + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginFormState.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginFormState.java new file mode 100644 index 0000000..0b69bfe --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginFormState.java @@ -0,0 +1,40 @@ +package com.example.myfirstapplication.ui.login; + +import androidx.annotation.Nullable; + +/** + * Data validation state of the login form. + */ +class LoginFormState { + @Nullable + private Integer usernameError; + @Nullable + private Integer passwordError; + private boolean isDataValid; + + LoginFormState(@Nullable Integer usernameError, @Nullable Integer passwordError) { + this.usernameError = usernameError; + this.passwordError = passwordError; + this.isDataValid = false; + } + + LoginFormState(boolean isDataValid) { + this.usernameError = null; + this.passwordError = null; + this.isDataValid = isDataValid; + } + + @Nullable + Integer getUsernameError() { + return usernameError; + } + + @Nullable + Integer getPasswordError() { + return passwordError; + } + + boolean isDataValid() { + return isDataValid; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginResult.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginResult.java new file mode 100644 index 0000000..a960b3b --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginResult.java @@ -0,0 +1,31 @@ +package com.example.myfirstapplication.ui.login; + +import androidx.annotation.Nullable; + +/** + * Authentication result : success (user details) or error message. + */ +class LoginResult { + @Nullable + private LoggedInUserView success; + @Nullable + private Integer error; + + LoginResult(@Nullable Integer error) { + this.error = error; + } + + LoginResult(@Nullable LoggedInUserView success) { + this.success = success; + } + + @Nullable + LoggedInUserView getSuccess() { + return success; + } + + @Nullable + Integer getError() { + return error; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModel.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModel.java new file mode 100644 index 0000000..bacdd8d --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModel.java @@ -0,0 +1,70 @@ +package com.example.myfirstapplication.ui.login; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import android.util.Patterns; + +import com.example.myfirstapplication.data.LoginRepository; +import com.example.myfirstapplication.data.Result; +import com.example.myfirstapplication.data.model.LoggedInUser; +import com.example.myfirstapplication.R; + +public class LoginViewModel extends ViewModel { + + private MutableLiveData loginFormState = new MutableLiveData<>(); + private MutableLiveData loginResult = new MutableLiveData<>(); + private LoginRepository loginRepository; + + LoginViewModel(LoginRepository loginRepository) { + this.loginRepository = loginRepository; + } + + LiveData getLoginFormState() { + return loginFormState; + } + + LiveData getLoginResult() { + return loginResult; + } + + public void login(String username, String password) { + // can be launched in a separate asynchronous job + Result result = loginRepository.login(username, password); + + if (result instanceof Result.Success) { + LoggedInUser data = ((Result.Success) result).getData(); + loginResult.setValue(new LoginResult(new LoggedInUserView(data.getDisplayName()))); + } else { + loginResult.setValue(new LoginResult(R.string.login_failed)); + } + } + + public void loginDataChanged(String username, String password) { + if (!isUserNameValid(username)) { + loginFormState.setValue(new LoginFormState(R.string.invalid_username, null)); + } else if (!isPasswordValid(password)) { + loginFormState.setValue(new LoginFormState(null, R.string.invalid_password)); + } else { + loginFormState.setValue(new LoginFormState(true)); + } + } + + // A placeholder username validation check + private boolean isUserNameValid(String username) { + if (username == null) { + return false; + } + if (username.contains("@")) { + return Patterns.EMAIL_ADDRESS.matcher(username).matches(); + } else { + return !username.trim().isEmpty(); + } + } + + // A placeholder password validation check + private boolean isPasswordValid(String password) { + return password != null && password.trim().length() > 5; + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModelFactory.java b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModelFactory.java new file mode 100644 index 0000000..02fc12d --- /dev/null +++ b/MyFirstApplication/app/src/main/java/com/example/myfirstapplication/ui/login/LoginViewModelFactory.java @@ -0,0 +1,26 @@ +package com.example.myfirstapplication.ui.login; + +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; +import androidx.annotation.NonNull; + +import com.example.myfirstapplication.data.LoginDataSource; +import com.example.myfirstapplication.data.LoginRepository; + +/** + * ViewModel provider factory to instantiate LoginViewModel. + * Required given LoginViewModel has a non-empty constructor + */ +public class LoginViewModelFactory implements ViewModelProvider.Factory { + + @NonNull + @Override + @SuppressWarnings("unchecked") + public T create(@NonNull Class modelClass) { + if (modelClass.isAssignableFrom(LoginViewModel.class)) { + return (T) new LoginViewModel(LoginRepository.getInstance(new LoginDataSource())); + } else { + throw new IllegalArgumentException("Unknown ViewModel class"); + } + } +} \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/MyFirstApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/MyFirstApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/res/drawable/ic_launcher_background.xml b/MyFirstApplication/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/MyFirstApplication/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyFirstApplication/app/src/main/res/layout/activity_info.xml b/MyFirstApplication/app/src/main/res/layout/activity_info.xml new file mode 100644 index 0000000..4718110 --- /dev/null +++ b/MyFirstApplication/app/src/main/res/layout/activity_info.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/MyFirstApplication/app/src/main/res/layout/activity_login.xml b/MyFirstApplication/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..ea5e10b --- /dev/null +++ b/MyFirstApplication/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,78 @@ + + + + + + + +