From 5499e3a9f6ea4d44bea234bbc8d78daf0033e7f2 Mon Sep 17 00:00:00 2001 From: Samuelford24 Date: Thu, 28 Jan 2021 16:43:57 -0500 Subject: [PATCH] Initial commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/gradle.xml | 23 +++ .idea/jarRepositories.xml | 25 +++ .idea/misc.xml | 14 ++ app/.gitignore | 1 + app/build.gradle | 46 +++++ app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.java | 26 +++ app/src/main/AndroidManifest.xml | 27 +++ .../sf/stormwaterutilityandroid/Login.java | 148 ++++++++++++++ .../MainActivity.java | 180 ++++++++++++++++++ .../Reset_password.java | 72 +++++++ .../stormwaterutilityandroid/SampleFordm.java | 87 +++++++++ .../sf/stormwaterutilityandroid/SignUp.java | 159 ++++++++++++++++ .../com/sf/stormwaterutilityandroid/User.java | 35 ++++ .../dashboard/DashboardFragment.java | 36 ++++ .../dashboard/DashboardViewModel.java | 19 ++ .../home/HomeFragment.java | 49 +++++ .../home/HomeViewModel.java | 19 ++ .../notifications/NotificationsFragment.java | 28 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_dashboard_black_24dp.xml | 9 + .../main/res/drawable/ic_home_black_24dp.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++++ .../drawable/ic_notifications_black_24dp.xml | 9 + app/src/main/res/layout/activity_login.xml | 103 ++++++++++ app/src/main/res/layout/activity_main.xml | 48 +++++ .../res/layout/activity_reset_password.xml | 97 ++++++++++ .../main/res/layout/activity_sample_fordm.xml | 13 ++ app/src/main/res/layout/activity_sign_up.xml | 125 ++++++++++++ app/src/main/res/layout/content_main.xml | 13 ++ .../main/res/layout/fragment_dashboard.xml | 22 +++ app/src/main/res/layout/fragment_home.xml | 56 ++++++ .../res/layout/fragment_notifications.xml | 22 +++ app/src/main/res/menu/bottom_nav_menu.xml | 19 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes app/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 .../main/res/navigation/mobile_navigation.xml | 25 +++ app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values/colors.xml | 13 ++ app/src/main/res/values/dimens.xml | 5 + app/src/main/res/values/strings.xml | 49 +++++ app/src/main/res/values/themes.xml | 28 +++ .../ExampleUnitTest.java | 17 ++ build.gradle | 24 +++ gradle.properties | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++++++ gradlew.bat | 84 ++++++++ settings.gradle | 2 + 63 files changed, 2254 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/sf/stormwaterutilityandroid/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/Login.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/MainActivity.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/Reset_password.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/SampleFordm.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/SignUp.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/User.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardFragment.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardViewModel.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeFragment.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeViewModel.java create mode 100644 app/src/main/java/com/sf/stormwaterutilityandroid/notifications/NotificationsFragment.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_reset_password.xml create mode 100644 app/src/main/res/layout/activity_sample_fordm.xml create mode 100644 app/src/main/res/layout/activity_sign_up.xml create mode 100644 app/src/main/res/layout/content_main.xml create mode 100644 app/src/main/res/layout/fragment_dashboard.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_notifications.xml create mode 100644 app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/navigation/mobile_navigation.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/com/sf/stormwaterutilityandroid/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.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 +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..aafa78e --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3378229 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..19093dd --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "com.sf.stormwaterutilityandroid" + minSdkVersion 26 + 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' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'androidx.navigation:navigation-fragment:2.3.0' + implementation 'androidx.navigation:navigation-ui:2.3.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'me.riddhimanadib.form-master:form-master:1.1.0' + implementation 'androidx.annotation:annotation:1.1.0' + implementation 'com.google.firebase:firebase-auth:19.4.0' + implementation 'com.google.firebase:firebase-firestore:21.6.0' + testImplementation 'junit:junit:4.+' + 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/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/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/app/src/androidTest/java/com/sf/stormwaterutilityandroid/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/sf/stormwaterutilityandroid/ExampleInstrumentedTest.java new file mode 100644 index 0000000..d8eec91 --- /dev/null +++ b/app/src/androidTest/java/com/sf/stormwaterutilityandroid/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.sf.stormwaterutilityandroid; + +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.sf.stormwaterutilityandroid", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5d437cc --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/Login.java b/app/src/main/java/com/sf/stormwaterutilityandroid/Login.java new file mode 100644 index 0000000..c276c5a --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/Login.java @@ -0,0 +1,148 @@ +package com.sf.stormwaterutilityandroid; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; + +public class Login extends AppCompatActivity { + + private EditText inputEmail, inputPassword; + private FirebaseAuth auth; + FirebaseAuth.AuthStateListener mAuthListener; + + private ProgressBar progressBar; + private Button btnSignup, btnLogin, btnReset; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + //Get Firebase auth instance + + auth = FirebaseAuth.getInstance(); + mAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + if (firebaseAuth.getCurrentUser() != null && auth.getCurrentUser().isEmailVerified()) { + startActivity(new Intent(Login.this, MainActivity.class)); + finish(); + } + if (firebaseAuth.getCurrentUser() == null) { + + } + + + } + }; + + + setContentView(R.layout.activity_login); + inputEmail = findViewById(R.id.email); + inputPassword = findViewById(R.id.password); + progressBar = findViewById(R.id.progressBar); + btnSignup = findViewById(R.id.btn_signup); + btnLogin = findViewById(R.id.btn_login); + btnReset = findViewById(R.id.btn_reset_password); + + //Get Firebase auth instance + auth = FirebaseAuth.getInstance(); + + btnSignup.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(Login.this, SignUp.class)); + } + }); + + btnReset.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(Login.this, Reset_password.class)); + } + }); + + btnLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String email = inputEmail.getText().toString(); + final String password = inputPassword.getText().toString(); + + if (TextUtils.isEmpty(email)) { + Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); + return; + } + + if (TextUtils.isEmpty(password)) { + Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); + return; + } + + progressBar.setVisibility(View.VISIBLE); + + //authenticate user + auth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(Login.this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + progressBar.setVisibility(View.GONE); + if (!task.isSuccessful()) { + // there was an error + if (password.length() < 6) { + inputPassword.setError("Your password must be at least 6 characters"); + } else { + Toast.makeText(Login.this, "Error, couldn't login. Please try again", Toast.LENGTH_LONG).show(); + } + } else { + if (auth.getCurrentUser().isEmailVerified()) { + Intent intent = new Intent(Login.this, MainActivity.class); + startActivity(intent); + progressBar.setVisibility(View.INVISIBLE); + finish(); + } else { + AlertDialog.Builder builder; + builder = new AlertDialog.Builder(Login.this); + //builder.setIcon(R.drawable.open_browser); + builder.setTitle("Verify Email"); + builder.setMessage("You need to verify your email before logging in! Would you like to resend the verification email?"); + builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + auth.getCurrentUser().sendEmailVerification(); + } + }); + builder.setNegativeButton("No", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }); + builder.setCancelable(true); + builder.show(); + + + } + } + } + }); + } + }); + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/MainActivity.java b/app/src/main/java/com/sf/stormwaterutilityandroid/MainActivity.java new file mode 100644 index 0000000..28caf6b --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/MainActivity.java @@ -0,0 +1,180 @@ +package com.sf.stormwaterutilityandroid; + +import android.os.Bundle; +import android.view.MenuItem; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.firebase.auth.FirebaseAuth; +import com.sf.stormwaterutilityandroid.dashboard.DashboardFragment; +import com.sf.stormwaterutilityandroid.home.HomeFragment; +import com.sf.stormwaterutilityandroid.notifications.NotificationsFragment; + +public class MainActivity extends AppCompatActivity { + private Button signout2; + private TextView mTextMessage; + private FirebaseAuth auth; + final Fragment fragment1 = new HomeFragment(); + final Fragment fragment2 = new DashboardFragment(); + final Fragment fragment3 = new NotificationsFragment(); + // final Fragment fragment4 = new Admin_fragment(); + // final Fragment fragment5 = new HR_fragment(); + final FragmentManager fm = getSupportFragmentManager(); + Fragment active = fragment1; + private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener + = new BottomNavigationView.OnNavigationItemSelectedListener() { + + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + // mTextMessage.setText(R.string.title_home); + fm.beginTransaction().hide(active).show(fragment1).commit(); + + active = fragment1; + fm.popBackStack(); + return true; + case R.id.navigation_dashboard: + // mTextMessage.setText(R.string.title_dashboard); + fm.beginTransaction().hide(active).show(fragment2).commit(); + active = fragment2; + fm.popBackStack(); + return true; + case R.id.navigation_notifications: + //mTextMessage.setText(R.string.title_notifications); + fm.beginTransaction().hide(active).show(fragment3).commit(); + active = fragment3; + fm.popBackStack(); + return true; + /* case R.id.admin: + fm.beginTransaction().hide(active).show(fragment4).commit(); + active = fragment4; + fm.popBackStack(); + return true; + case R.id.Homeroom: + fm.beginTransaction().hide(active).show(fragment5).commit(); + active = fragment5; + fm.popBackStack(); + return true;*/ + } + return false; + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + //setSupportActionBar(toolbar); + + + BottomNavigationView navigation = findViewById(R.id.navigation); + navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); + // fm.beginTransaction().add(R.id.main_container, fragment5, "5").hide(fragment5).commit(); + // fm.beginTransaction().add(R.id.main_container, fragment4, "4").hide(fragment4).commit(); + fm.beginTransaction().add(R.id.main_container, fragment3, "3").hide(fragment3).commit(); + fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit(); + fm.beginTransaction().add(R.id.main_container, fragment1, "1").commit(); + + } + + /* @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + signout2 = (Button) findViewById(R.id.sign_out); + + signout2.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + FirebaseAuth.getInstance().signOut(); + startActivity(new Intent(com.samuelford48gmail.thsconnect.teacher.MainActivity.this, LoginActivity.class)); + finish(); + } + }); + + + mTextMessage = (TextView) findViewById(R.id.message); + BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); + navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); + + } + + FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() { + @SuppressLint("SetTextI18n") + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user == null) { + // user auth state is changed - user is null + // launch login activity + startActivity(new Intent(com.samuelford48gmail.thsconnect.teacher.MainActivity.this, LoginActivity.class)); + finish(); + } + } + + + }; + // public void signout (View v){ + // signOut(); + //} +/* + public void signOut() { + auth.signOut(); + + +// this listener will be called when there is change in firebase user session + FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user == null) { + // user auth state is changed - user is null + // launch login activity + startActivity(new Intent(com.samuelford48gmail.thsconnect.teacher.MainActivity.this, LoginActivity.class)); + finish(); + } + } + }; + + } + + + @Override + public void onStart() { + super.onStart(); + auth.addAuthStateListener(authListener); + } + + @Override + public void onStop() { + super.onStop(); + if (authListener != null) { + auth.removeAuthStateListener(authListener); + } + */ + /*@Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu., menu); + return super.onCreateOptionsMenu(menu); + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + if (id == R.id.action_settings) { + startActivity(new Intent(com.samuelford48gmail.thsconnect.teacher.MainActivity.this, SettingsActivity.class)); + return true; + } + + return super.onOptionsItemSelected(item); + } +*/ +} diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/Reset_password.java b/app/src/main/java/com/sf/stormwaterutilityandroid/Reset_password.java new file mode 100644 index 0000000..0472164 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/Reset_password.java @@ -0,0 +1,72 @@ +package com.sf.stormwaterutilityandroid; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.FirebaseAuth; + +public class Reset_password extends AppCompatActivity { + private Button btnReset, btnBack; + private FirebaseAuth auth; + private ProgressBar progressBar; + private EditText inputEmail; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_reset_password); + inputEmail = findViewById(R.id.email); + btnReset = findViewById(R.id.btn_reset_password); + btnBack = findViewById(R.id.btn_back); + progressBar = findViewById(R.id.progressBar); + + auth = FirebaseAuth.getInstance(); + + btnBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnReset.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + String email = inputEmail.getText().toString().trim(); + + if (TextUtils.isEmpty(email)) { + Toast.makeText(getApplication(), "Enter your registered email id", Toast.LENGTH_SHORT).show(); + return; + } + + progressBar.setVisibility(View.VISIBLE); + auth.sendPasswordResetEmail(email) + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + Toast.makeText(Reset_password.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(Reset_password.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show(); + } + + progressBar.setVisibility(View.GONE); + } + }); + } + }); + } + +} diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/SampleFordm.java b/app/src/main/java/com/sf/stormwaterutilityandroid/SampleFordm.java new file mode 100644 index 0000000..2dfcc46 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/SampleFordm.java @@ -0,0 +1,87 @@ +package com.sf.stormwaterutilityandroid; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import me.riddhimanadib.formmaster.FormBuilder; +import me.riddhimanadib.formmaster.model.BaseFormElement; +import me.riddhimanadib.formmaster.model.FormElementPickerDate; +import me.riddhimanadib.formmaster.model.FormElementPickerMulti; +import me.riddhimanadib.formmaster.model.FormElementPickerSingle; +import me.riddhimanadib.formmaster.model.FormElementPickerTime; +import me.riddhimanadib.formmaster.model.FormElementSwitch; +import me.riddhimanadib.formmaster.model.FormElementTextEmail; +import me.riddhimanadib.formmaster.model.FormElementTextMultiLine; +import me.riddhimanadib.formmaster.model.FormElementTextNumber; +import me.riddhimanadib.formmaster.model.FormElementTextPassword; +import me.riddhimanadib.formmaster.model.FormElementTextPhone; +import me.riddhimanadib.formmaster.model.FormElementTextSingleLine; +import me.riddhimanadib.formmaster.model.FormHeader; + +public class SampleFordm extends AppCompatActivity { + private FormBuilder formBuilder; + private RecyclerView recyclerView; + FormElementTextEmail element11; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sample_fordm); + recyclerView = findViewById(R.id.recyclerView2); + setupForm(); + // element11.setValue("testdsfs"); + } + private void setupForm() { + + + formBuilder = new FormBuilder(this, recyclerView); + + FormHeader header1 = FormHeader.createInstance("Personal Info"); + element11 = FormElementTextEmail.createInstance().setTitle("Email").setHint("Enter Email"); + FormElementTextPhone element12 = FormElementTextPhone.createInstance().setTitle("Phone").setValue("+8801712345678"); + + FormHeader header2 = FormHeader.createInstance("Family Info"); + FormElementTextSingleLine element21 = FormElementTextSingleLine.createInstance().setTitle("Location").setValue("Dhaka"); + FormElementTextMultiLine element22 = FormElementTextMultiLine.createInstance().setTitle("Address"); + FormElementTextNumber element23 = FormElementTextNumber.createInstance().setTitle("Zip Code").setValue("1000"); + + FormHeader header3 = FormHeader.createInstance("Schedule"); + FormElementPickerDate element31 = FormElementPickerDate.createInstance().setTitle("Date").setDateFormat("MMM dd, yyyy"); + FormElementPickerTime element32 = FormElementPickerTime.createInstance().setTitle("Time").setTimeFormat("KK hh"); + FormElementTextPassword element33 = FormElementTextPassword.createInstance().setTitle("Password").setValue("abcd1234"); + + FormHeader header4 = FormHeader.createInstance("Preferred Items"); + List fruits = new ArrayList<>(); + fruits.add("Banana"); + fruits.add("Orange"); + fruits.add("Mango"); + fruits.add("Guava"); + FormElementPickerSingle element41 = FormElementPickerSingle.createInstance().setTitle("Single Item").setOptions(fruits).setPickerTitle("Pick any item"); + FormElementPickerMulti element42 = FormElementPickerMulti.createInstance().setTitle("Multi Items").setOptions(fruits).setPickerTitle("Pick one or more").setNegativeText("reset"); + FormElementSwitch element43 = FormElementSwitch.createInstance().setTitle("Frozen?").setSwitchTexts("Yes", "No"); + + List formItems = new ArrayList<>(); + formItems.add(header1); + formItems.add(element11); + formItems.add(element12); + formItems.add(header2); + formItems.add(element21); + formItems.add(element22); + formItems.add(element23); + formItems.add(header3); + formItems.add(element31); + formItems.add(element32); + formItems.add(element33); + formItems.add(header4); + formItems.add(element41); + formItems.add(element42); + formItems.add(element43); + formBuilder.addFormElements(formItems); + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/SignUp.java b/app/src/main/java/com/sf/stormwaterutilityandroid/SignUp.java new file mode 100644 index 0000000..e0eaa03 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/SignUp.java @@ -0,0 +1,159 @@ +package com.sf.stormwaterutilityandroid; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.firestore.FirebaseFirestore; + +public class SignUp extends AppCompatActivity { + private EditText inputEmail, inputPassword, inputGrade, inputName, inputID, inputHR; //hit option + enter if you on mac , for windows hit ctrl + enter + private Button btnSignIn, btnSignUp, btnResetPassword; + private ProgressBar progressBar; + private FirebaseAuth auth; + private String hr; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_up); + //Get Firebase auth instance + auth = FirebaseAuth.getInstance(); + + btnSignIn = findViewById(R.id.sign_in_button); + btnSignUp = findViewById(R.id.sign_up_button); + inputEmail = findViewById(R.id.email); + inputPassword = findViewById(R.id.password); + progressBar = findViewById(R.id.progressBar); + btnResetPassword = findViewById(R.id.btn_reset_password); + inputGrade = findViewById(R.id.grade); + inputName = findViewById(R.id.name); + inputID = findViewById(R.id.studentID); + inputHR = findViewById(R.id.homeroom); + + /* btnResetPassword.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(SignupActivity.this, ResetPasswordActivity.class)); + } + }); +*/ + btnSignIn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnSignUp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + final String email = inputEmail.getText().toString().trim(); + final String password = inputPassword.getText().toString().trim(); + final String name = inputName.getText().toString().trim(); + final String grade = inputGrade.getText().toString().trim(); + final String studentID = inputID.getText().toString().trim(); + final String homeroom = inputHR.getText().toString().trim(); + if (TextUtils.isEmpty(email)) { + Toast.makeText(getApplicationContext(), "Enter a email address!", Toast.LENGTH_SHORT).show(); + return; + } + + if (TextUtils.isEmpty(password)) { + Toast.makeText(getApplicationContext(), "Enter a password!", Toast.LENGTH_SHORT).show(); + return; + } + + if (password.length() < 6) { + Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show(); + return; + } + if (TextUtils.isEmpty(homeroom)) { + Toast.makeText(getApplicationContext(), "Enter a homeroom!", Toast.LENGTH_SHORT).show(); + return; + } + if (TextUtils.isEmpty(studentID)) { + Toast.makeText(getApplicationContext(), "Enter a StudentID!", Toast.LENGTH_SHORT).show(); + return; + } + + progressBar.setVisibility(View.VISIBLE); + //create user + auth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(SignUp.this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + // Toast.makeText(SignupActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Toast.makeText(SignUp.this, "Authentication failed." + task.getException(), + Toast.LENGTH_SHORT).show(); + } else { + final String create_uid = FirebaseAuth.getInstance().getUid(); + final FirebaseUser user2 = auth.getCurrentUser(); + user2.sendEmailVerification(); + User user = new User(name,email,create_uid); + + FirebaseFirestore.getInstance().collection("Users") + .document(create_uid) + .set(user).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Void aVoid) { + + + user2.sendEmailVerification(); + + + + // progressBar.setVisibility(View.GONE); + // Toast.makeText(SignupActivity.this, getString(R.string.registration_success), Toast.LENGTH_LONG).show(); + // startActivity(new Intent(SignupActivity.this, LoginActivity.class)); + // finish(); + + } + }) + .addOnFailureListener(new OnFailureListener() { + + @Override + public void onFailure(@NonNull Exception e) { + auth.getCurrentUser().delete(); + Toast.makeText(SignUp.this, "Error, please try again later", Toast.LENGTH_LONG).show(); + } + }); + + + } + + } + }); + } + }); + } + + + + @Override + protected void onResume() { + super.onResume(); + progressBar.setVisibility(View.GONE); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/User.java b/app/src/main/java/com/sf/stormwaterutilityandroid/User.java new file mode 100644 index 0000000..5671a58 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/User.java @@ -0,0 +1,35 @@ +package com.sf.stormwaterutilityandroid; + +class User { + String name, email, uid; + + public User(String name, String email, String uid) { + this.name = name; + this.email = email; + this.uid = uid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } +} diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardFragment.java b/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardFragment.java new file mode 100644 index 0000000..b69c9a5 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardFragment.java @@ -0,0 +1,36 @@ +package com.sf.stormwaterutilityandroid.dashboard; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.sf.stormwaterutilityandroid.R; + + +public class DashboardFragment extends Fragment { + + private DashboardViewModel dashboardViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + dashboardViewModel = + ViewModelProviders.of(this).get(DashboardViewModel.class); + View root = inflater.inflate(R.layout.fragment_dashboard, container, false); + final TextView textView = root.findViewById(R.id.text_dashboard); + dashboardViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardViewModel.java b/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardViewModel.java new file mode 100644 index 0000000..1fa1663 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/dashboard/DashboardViewModel.java @@ -0,0 +1,19 @@ +package com.sf.stormwaterutilityandroid.dashboard; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class DashboardViewModel extends ViewModel { + + private MutableLiveData mText; + + public DashboardViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is dashboard fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeFragment.java b/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeFragment.java new file mode 100644 index 0000000..7809a22 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeFragment.java @@ -0,0 +1,49 @@ +package com.sf.stormwaterutilityandroid.home; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.sf.stormwaterutilityandroid.R; +import com.sf.stormwaterutilityandroid.SampleFordm; + + +public class HomeFragment extends Fragment { + + + + Button b1,b2,b3,b4,b5; + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + + View root = inflater.inflate(R.layout.fragment_home, container, false); + b1 = root.findViewById(R.id.button); + b1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(getContext(), SampleFordm.class)); + } + }); + + //CHeck To5a.03 project for dealing saved instance state + /* + if (savedInstanceState != null) { + String allPreviousLifecycleCallbacks = savedInstanceState + .getString("Email"); + System.out.println("SavedInstanceState: "+allPreviousLifecycleCallbacks); + element11.setValue(allPreviousLifecycleCallbacks); + } +*/ + return root; + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeViewModel.java b/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeViewModel.java new file mode 100644 index 0000000..5db7db0 --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.sf.stormwaterutilityandroid.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private MutableLiveData mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sf/stormwaterutilityandroid/notifications/NotificationsFragment.java b/app/src/main/java/com/sf/stormwaterutilityandroid/notifications/NotificationsFragment.java new file mode 100644 index 0000000..2795ade --- /dev/null +++ b/app/src/main/java/com/sf/stormwaterutilityandroid/notifications/NotificationsFragment.java @@ -0,0 +1,28 @@ +package com.sf.stormwaterutilityandroid.notifications; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.sf.stormwaterutilityandroid.R; + + +public class NotificationsFragment extends Fragment { + + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + + View root = inflater.inflate(R.layout.fragment_notifications, container, false); + final TextView textView = root.findViewById(R.id.text_notifications); + + + + return root; + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..61b3328 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + +