Added android project
							
								
								
									
										1
									
								
								OlympusServices/app/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
/build
 | 
			
		||||
							
								
								
									
										28
									
								
								OlympusServices/app/build.gradle
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
apply plugin: 'com.android.application'
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdkVersion 28
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        applicationId "com.uottawa.olympus.olympusservices"
 | 
			
		||||
        minSdkVersion 15
 | 
			
		||||
        targetSdkVersion 28
 | 
			
		||||
        versionCode 1
 | 
			
		||||
        versionName "1.0"
 | 
			
		||||
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 | 
			
		||||
    }
 | 
			
		||||
    buildTypes {
 | 
			
		||||
        release {
 | 
			
		||||
            minifyEnabled false
 | 
			
		||||
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    implementation fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    implementation 'com.android.support:appcompat-v7:28.0.0'
 | 
			
		||||
    implementation 'com.android.support:design:28.0.0'
 | 
			
		||||
    testImplementation 'junit:junit:4.12'
 | 
			
		||||
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
 | 
			
		||||
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								OlympusServices/app/proguard-rules.pro
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
package com.uottawa.olympus.olympusservices;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.support.test.InstrumentationRegistry;
 | 
			
		||||
import android.support.test.runner.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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
 | 
			
		||||
 */
 | 
			
		||||
@RunWith(AndroidJUnit4.class)
 | 
			
		||||
public class ExampleInstrumentedTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    public void useAppContext() {
 | 
			
		||||
        // Context of the app under test.
 | 
			
		||||
        Context appContext = InstrumentationRegistry.getTargetContext();
 | 
			
		||||
 | 
			
		||||
        assertEquals("com.uottawa.olympus.olympusservices", appContext.getPackageName());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								OlympusServices/app/src/main/AndroidManifest.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    package="com.uottawa.olympus.olympusservices">
 | 
			
		||||
    <!-- To auto-complete the email text field in the login form with the user's emails -->
 | 
			
		||||
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
 | 
			
		||||
    <uses-permission android:name="android.permission.READ_PROFILE" />
 | 
			
		||||
    <uses-permission android:name="android.permission.READ_CONTACTS" />
 | 
			
		||||
 | 
			
		||||
    <application
 | 
			
		||||
        android:allowBackup="true"
 | 
			
		||||
        android:icon="@mipmap/ic_launcher"
 | 
			
		||||
        android:label="@string/app_name"
 | 
			
		||||
        android:roundIcon="@mipmap/ic_launcher_round"
 | 
			
		||||
        android:supportsRtl="true"
 | 
			
		||||
        android:theme="@style/AppTheme">
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".LoginActivity"
 | 
			
		||||
            android:label="@string/app_name">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
 | 
			
		||||
                <category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity>
 | 
			
		||||
        <meta-data
 | 
			
		||||
            android:name="preloaded_fonts"
 | 
			
		||||
            android:resource="@array/preloaded_fonts" />
 | 
			
		||||
    </application>
 | 
			
		||||
 | 
			
		||||
</manifest>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,350 @@
 | 
			
		|||
package com.uottawa.olympus.olympusservices;
 | 
			
		||||
 | 
			
		||||
import android.animation.Animator;
 | 
			
		||||
import android.animation.AnimatorListenerAdapter;
 | 
			
		||||
import android.annotation.TargetApi;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.design.widget.Snackbar;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.app.LoaderManager.LoaderCallbacks;
 | 
			
		||||
 | 
			
		||||
import android.content.CursorLoader;
 | 
			
		||||
import android.content.Loader;
 | 
			
		||||
import android.database.Cursor;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.provider.ContactsContract;
 | 
			
		||||
import android.text.TextUtils;
 | 
			
		||||
import android.view.KeyEvent;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.View.OnClickListener;
 | 
			
		||||
import android.view.inputmethod.EditorInfo;
 | 
			
		||||
import android.widget.ArrayAdapter;
 | 
			
		||||
import android.widget.AutoCompleteTextView;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
import android.widget.EditText;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import static android.Manifest.permission.READ_CONTACTS;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A login screen that offers login via email/password.
 | 
			
		||||
 */
 | 
			
		||||
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Id to identity READ_CONTACTS permission request.
 | 
			
		||||
     */
 | 
			
		||||
    private static final int REQUEST_READ_CONTACTS = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A dummy authentication store containing known user names and passwords.
 | 
			
		||||
     * TODO: remove after connecting to a real authentication system.
 | 
			
		||||
     */
 | 
			
		||||
    private static final String[] DUMMY_CREDENTIALS = new String[]{
 | 
			
		||||
            "foo@example.com:hello", "bar@example.com:world"
 | 
			
		||||
    };
 | 
			
		||||
    /**
 | 
			
		||||
     * Keep track of the login task to ensure we can cancel it if requested.
 | 
			
		||||
     */
 | 
			
		||||
    private UserLoginTask mAuthTask = null;
 | 
			
		||||
 | 
			
		||||
    // UI references.
 | 
			
		||||
    private AutoCompleteTextView mEmailView;
 | 
			
		||||
    private EditText mPasswordView;
 | 
			
		||||
    private View mProgressView;
 | 
			
		||||
    private View mLoginFormView;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_login);
 | 
			
		||||
        // Set up the login form.
 | 
			
		||||
        mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
 | 
			
		||||
        populateAutoComplete();
 | 
			
		||||
 | 
			
		||||
        mPasswordView = (EditText) findViewById(R.id.password);
 | 
			
		||||
        mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
 | 
			
		||||
                if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
 | 
			
		||||
                    attemptLogin();
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
 | 
			
		||||
        mEmailSignInButton.setOnClickListener(new OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View view) {
 | 
			
		||||
                attemptLogin();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        mLoginFormView = findViewById(R.id.login_form);
 | 
			
		||||
        mProgressView = findViewById(R.id.login_progress);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void populateAutoComplete() {
 | 
			
		||||
        if (!mayRequestContacts()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        getLoaderManager().initLoader(0, null, this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean mayRequestContacts() {
 | 
			
		||||
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
 | 
			
		||||
            Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
 | 
			
		||||
                    .setAction(android.R.string.ok, new View.OnClickListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        @TargetApi(Build.VERSION_CODES.M)
 | 
			
		||||
                        public void onClick(View v) {
 | 
			
		||||
                            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
        } else {
 | 
			
		||||
            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Callback received when a permissions request has been completed.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
 | 
			
		||||
                                           @NonNull int[] grantResults) {
 | 
			
		||||
        if (requestCode == REQUEST_READ_CONTACTS) {
 | 
			
		||||
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 | 
			
		||||
                populateAutoComplete();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to sign in or register the account specified by the login form.
 | 
			
		||||
     * If there are form errors (invalid email, missing fields, etc.), the
 | 
			
		||||
     * errors are presented and no actual login attempt is made.
 | 
			
		||||
     */
 | 
			
		||||
    private void attemptLogin() {
 | 
			
		||||
        if (mAuthTask != null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Reset errors.
 | 
			
		||||
        mEmailView.setError(null);
 | 
			
		||||
        mPasswordView.setError(null);
 | 
			
		||||
 | 
			
		||||
        // Store values at the time of the login attempt.
 | 
			
		||||
        String email = mEmailView.getText().toString();
 | 
			
		||||
        String password = mPasswordView.getText().toString();
 | 
			
		||||
 | 
			
		||||
        boolean cancel = false;
 | 
			
		||||
        View focusView = null;
 | 
			
		||||
 | 
			
		||||
        // Check for a valid password, if the user entered one.
 | 
			
		||||
        if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
 | 
			
		||||
            mPasswordView.setError(getString(R.string.error_invalid_password));
 | 
			
		||||
            focusView = mPasswordView;
 | 
			
		||||
            cancel = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check for a valid email address.
 | 
			
		||||
        if (TextUtils.isEmpty(email)) {
 | 
			
		||||
            mEmailView.setError(getString(R.string.error_field_required));
 | 
			
		||||
            focusView = mEmailView;
 | 
			
		||||
            cancel = true;
 | 
			
		||||
        } else if (!isEmailValid(email)) {
 | 
			
		||||
            mEmailView.setError(getString(R.string.error_invalid_email));
 | 
			
		||||
            focusView = mEmailView;
 | 
			
		||||
            cancel = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (cancel) {
 | 
			
		||||
            // There was an error; don't attempt login and focus the first
 | 
			
		||||
            // form field with an error.
 | 
			
		||||
            focusView.requestFocus();
 | 
			
		||||
        } else {
 | 
			
		||||
            // Show a progress spinner, and kick off a background task to
 | 
			
		||||
            // perform the user login attempt.
 | 
			
		||||
            showProgress(true);
 | 
			
		||||
            mAuthTask = new UserLoginTask(email, password);
 | 
			
		||||
            mAuthTask.execute((Void) null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isEmailValid(String email) {
 | 
			
		||||
        //TODO: Replace this with your own logic
 | 
			
		||||
        return email.contains("@");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isPasswordValid(String password) {
 | 
			
		||||
        //TODO: Replace this with your own logic
 | 
			
		||||
        return password.length() > 4;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Shows the progress UI and hides the login form.
 | 
			
		||||
     */
 | 
			
		||||
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
 | 
			
		||||
    private void showProgress(final boolean show) {
 | 
			
		||||
        // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
 | 
			
		||||
        // for very easy animations. If available, use these APIs to fade-in
 | 
			
		||||
        // the progress spinner.
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
 | 
			
		||||
            int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
 | 
			
		||||
 | 
			
		||||
            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
 | 
			
		||||
            mLoginFormView.animate().setDuration(shortAnimTime).alpha(
 | 
			
		||||
                    show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onAnimationEnd(Animator animation) {
 | 
			
		||||
                    mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
 | 
			
		||||
            mProgressView.animate().setDuration(shortAnimTime).alpha(
 | 
			
		||||
                    show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onAnimationEnd(Animator animation) {
 | 
			
		||||
                    mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            // The ViewPropertyAnimator APIs are not available, so simply show
 | 
			
		||||
            // and hide the relevant UI components.
 | 
			
		||||
            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
 | 
			
		||||
            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
 | 
			
		||||
        return new CursorLoader(this,
 | 
			
		||||
                // Retrieve data rows for the device user's 'profile' contact.
 | 
			
		||||
                Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
 | 
			
		||||
                        ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,
 | 
			
		||||
 | 
			
		||||
                // Select only email addresses.
 | 
			
		||||
                ContactsContract.Contacts.Data.MIMETYPE +
 | 
			
		||||
                        " = ?", new String[]{ContactsContract.CommonDataKinds.Email
 | 
			
		||||
                .CONTENT_ITEM_TYPE},
 | 
			
		||||
 | 
			
		||||
                // Show primary email addresses first. Note that there won't be
 | 
			
		||||
                // a primary email address if the user hasn't specified one.
 | 
			
		||||
                ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
 | 
			
		||||
        List<String> emails = new ArrayList<>();
 | 
			
		||||
        cursor.moveToFirst();
 | 
			
		||||
        while (!cursor.isAfterLast()) {
 | 
			
		||||
            emails.add(cursor.getString(ProfileQuery.ADDRESS));
 | 
			
		||||
            cursor.moveToNext();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        addEmailsToAutoComplete(emails);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoaderReset(Loader<Cursor> cursorLoader) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addEmailsToAutoComplete(List<String> emailAddressCollection) {
 | 
			
		||||
        //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
 | 
			
		||||
        ArrayAdapter<String> adapter =
 | 
			
		||||
                new ArrayAdapter<>(LoginActivity.this,
 | 
			
		||||
                        android.R.layout.simple_dropdown_item_1line, emailAddressCollection);
 | 
			
		||||
 | 
			
		||||
        mEmailView.setAdapter(adapter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private interface ProfileQuery {
 | 
			
		||||
        String[] PROJECTION = {
 | 
			
		||||
                ContactsContract.CommonDataKinds.Email.ADDRESS,
 | 
			
		||||
                ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        int ADDRESS = 0;
 | 
			
		||||
        int IS_PRIMARY = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Represents an asynchronous login/registration task used to authenticate
 | 
			
		||||
     * the user.
 | 
			
		||||
     */
 | 
			
		||||
    public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
 | 
			
		||||
 | 
			
		||||
        private final String mEmail;
 | 
			
		||||
        private final String mPassword;
 | 
			
		||||
 | 
			
		||||
        UserLoginTask(String email, String password) {
 | 
			
		||||
            mEmail = email;
 | 
			
		||||
            mPassword = password;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected Boolean doInBackground(Void... params) {
 | 
			
		||||
            // TODO: attempt authentication against a network service.
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                // Simulate network access.
 | 
			
		||||
                Thread.sleep(2000);
 | 
			
		||||
            } catch (InterruptedException e) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (String credential : DUMMY_CREDENTIALS) {
 | 
			
		||||
                String[] pieces = credential.split(":");
 | 
			
		||||
                if (pieces[0].equals(mEmail)) {
 | 
			
		||||
                    // Account exists, return true if the password matches.
 | 
			
		||||
                    return pieces[1].equals(mPassword);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // TODO: register the new account here.
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void onPostExecute(final Boolean success) {
 | 
			
		||||
            mAuthTask = null;
 | 
			
		||||
            showProgress(false);
 | 
			
		||||
 | 
			
		||||
            if (success) {
 | 
			
		||||
                finish();
 | 
			
		||||
            } else {
 | 
			
		||||
                mPasswordView.setError(getString(R.string.error_incorrect_password));
 | 
			
		||||
                mPasswordView.requestFocus();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void onCancelled() {
 | 
			
		||||
            mAuthTask = null;
 | 
			
		||||
            showProgress(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:aapt="http://schemas.android.com/aapt"
 | 
			
		||||
    android:width="108dp"
 | 
			
		||||
    android:height="108dp"
 | 
			
		||||
    android:viewportHeight="108"
 | 
			
		||||
    android:viewportWidth="108">
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillType="evenOdd"
 | 
			
		||||
        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
 | 
			
		||||
        android:strokeColor="#00000000"
 | 
			
		||||
        android:strokeWidth="1">
 | 
			
		||||
        <aapt:attr name="android:fillColor">
 | 
			
		||||
            <gradient
 | 
			
		||||
                android:endX="78.5885"
 | 
			
		||||
                android:endY="90.9159"
 | 
			
		||||
                android:startX="48.7653"
 | 
			
		||||
                android:startY="61.0927"
 | 
			
		||||
                android:type="linear">
 | 
			
		||||
                <item
 | 
			
		||||
                    android:color="#44000000"
 | 
			
		||||
                    android:offset="0.0" />
 | 
			
		||||
                <item
 | 
			
		||||
                    android:color="#00000000"
 | 
			
		||||
                    android:offset="1.0" />
 | 
			
		||||
            </gradient>
 | 
			
		||||
        </aapt:attr>
 | 
			
		||||
    </path>
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#FFFFFF"
 | 
			
		||||
        android:fillType="nonZero"
 | 
			
		||||
        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
 | 
			
		||||
        android:strokeColor="#00000000"
 | 
			
		||||
        android:strokeWidth="1" />
 | 
			
		||||
</vector>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/drawable/background.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.1 MiB  | 
| 
						 | 
				
			
			@ -0,0 +1,170 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="108dp"
 | 
			
		||||
    android:height="108dp"
 | 
			
		||||
    android:viewportHeight="108"
 | 
			
		||||
    android:viewportWidth="108">
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#26A69A"
 | 
			
		||||
        android:pathData="M0,0h108v108h-108z" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M9,0L9,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,0L19,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M29,0L29,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M39,0L39,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M49,0L49,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M59,0L59,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M69,0L69,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M79,0L79,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M89,0L89,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M99,0L99,108"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,9L108,9"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,19L108,19"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,29L108,29"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,39L108,39"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,49L108,49"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,59L108,59"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,69L108,69"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,79L108,79"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,89L108,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M0,99L108,99"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,29L89,29"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,39L89,39"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,49L89,49"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,59L89,59"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,69L89,69"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M19,79L89,79"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M29,19L29,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M39,19L39,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M49,19L49,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M59,19L59,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M69,19L69,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#00000000"
 | 
			
		||||
        android:pathData="M79,19L79,89"
 | 
			
		||||
        android:strokeColor="#33FFFFFF"
 | 
			
		||||
        android:strokeWidth="0.8" />
 | 
			
		||||
</vector>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/font/aclonica.ttf
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
        app:fontProviderAuthority="com.google.android.gms.fonts"
 | 
			
		||||
        app:fontProviderPackage="com.google.android.gms"
 | 
			
		||||
        app:fontProviderQuery="Julius Sans One"
 | 
			
		||||
        app:fontProviderCerts="@array/com_google_android_gms_fonts_certs">
 | 
			
		||||
</font-family>
 | 
			
		||||
							
								
								
									
										49
									
								
								OlympusServices/app/src/main/res/layout/activity_login.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:gravity="center_horizontal"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
    android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
    android:background="@drawable/background"
 | 
			
		||||
    tools:context=".LoginActivity">
 | 
			
		||||
    <!-- Login progress -->
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/textView"
 | 
			
		||||
        android:layout_width="300dp"
 | 
			
		||||
        android:layout_height="50dp"
 | 
			
		||||
        android:text="@string/CompanyName"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
 | 
			
		||||
        android:textColor="@android:color/white"
 | 
			
		||||
        android:textSize="36sp"
 | 
			
		||||
        app:fontFamily="@font/julius_sans_one" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/textView2"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="50dp" />
 | 
			
		||||
 | 
			
		||||
    <Button
 | 
			
		||||
        android:id="@+id/SignUp"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="@string/signup" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/textView3"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="30dp" />
 | 
			
		||||
 | 
			
		||||
    <Button
 | 
			
		||||
        android:id="@+id/LogIn"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="@string/login" />
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <background android:drawable="@drawable/ic_launcher_background" />
 | 
			
		||||
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
 | 
			
		||||
</adaptive-icon>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <background android:drawable="@drawable/ic_launcher_background" />
 | 
			
		||||
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
 | 
			
		||||
</adaptive-icon>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/mipmap-hdpi/ic_launcher.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3 KiB  | 
| 
		 After Width: | Height: | Size: 4.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/mipmap-mdpi/ic_launcher.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2 KiB  | 
| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/mipmap-xhdpi/ic_launcher.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.5 KiB  | 
| 
		 After Width: | Height: | Size: 6.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.3 KiB  | 
| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								OlympusServices/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 9 KiB  | 
| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										6
									
								
								OlympusServices/app/src/main/res/values/colors.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <color name="colorPrimary">#3F51B5</color>
 | 
			
		||||
    <color name="colorPrimaryDark">#303F9F</color>
 | 
			
		||||
    <color name="colorAccent">#FF4081</color>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										5
									
								
								OlympusServices/app/src/main/res/values/dimens.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
<resources>
 | 
			
		||||
    <!-- Default screen margins, per the Android Design guidelines. -->
 | 
			
		||||
    <dimen name="activity_horizontal_margin">16dp</dimen>
 | 
			
		||||
    <dimen name="activity_vertical_margin">16dp</dimen>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										17
									
								
								OlympusServices/app/src/main/res/values/font_certs.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <array name="com_google_android_gms_fonts_certs">
 | 
			
		||||
        <item>@array/com_google_android_gms_fonts_certs_dev</item>
 | 
			
		||||
        <item>@array/com_google_android_gms_fonts_certs_prod</item>
 | 
			
		||||
    </array>
 | 
			
		||||
    <string-array name="com_google_android_gms_fonts_certs_dev">
 | 
			
		||||
        <item>
 | 
			
		||||
            MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
 | 
			
		||||
        </item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
    <string-array name="com_google_android_gms_fonts_certs_prod">
 | 
			
		||||
        <item>
 | 
			
		||||
            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
 | 
			
		||||
        </item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
</resources>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <array name="preloaded_fonts" translatable="false">
 | 
			
		||||
        <item>@font/julius_sans_one</item>
 | 
			
		||||
    </array>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										20
									
								
								OlympusServices/app/src/main/res/values/strings.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
<resources>
 | 
			
		||||
    <string name="app_name">OlympusServices</string>
 | 
			
		||||
 | 
			
		||||
    <!-- Strings related to login -->
 | 
			
		||||
    <string name="prompt_email">Email</string>
 | 
			
		||||
    <string name="prompt_password">Password (optional)</string>
 | 
			
		||||
    <string name="action_sign_in">Sign in or register</string>
 | 
			
		||||
    <string name="action_sign_in_short">Sign in</string>
 | 
			
		||||
    <string name="error_invalid_email">This email address is invalid</string>
 | 
			
		||||
    <string name="error_invalid_password">This password is too short</string>
 | 
			
		||||
    <string name="error_incorrect_password">This password is incorrect</string>
 | 
			
		||||
    <string name="error_field_required">This field is required</string>
 | 
			
		||||
    <string name="permission_rationale">"Contacts permissions are needed for providing email
 | 
			
		||||
        completions."
 | 
			
		||||
    </string>
 | 
			
		||||
    <string name="background">background</string>
 | 
			
		||||
    <string name="CompanyName">Olympus Services</string>
 | 
			
		||||
    <string name="signup">Sign Up</string>
 | 
			
		||||
    <string name="login">Log In</string>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										11
									
								
								OlympusServices/app/src/main/res/values/styles.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!-- Base application theme. -->
 | 
			
		||||
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
 | 
			
		||||
        <!-- Customize your theme here. -->
 | 
			
		||||
        <item name="colorPrimary">@color/colorPrimary</item>
 | 
			
		||||
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
 | 
			
		||||
        <item name="colorAccent">@color/colorAccent</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
package com.uottawa.olympus.olympusservices;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Example local unit test, which will execute on the development machine (host).
 | 
			
		||||
 *
 | 
			
		||||
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 | 
			
		||||
 */
 | 
			
		||||
public class ExampleUnitTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    public void addition_isCorrect() {
 | 
			
		||||
        assertEquals(4, 2 + 2);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||