diff options
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/main/AndroidManifest.xml | 13 | ||||
-rw-r--r-- | app/src/main/java/com/no_name/no_name/InitialActivity.kt | 39 | ||||
-rw-r--r-- | app/src/main/java/com/no_name/no_name/LoginActivity.kt | 32 | ||||
-rw-r--r-- | app/src/main/java/com/no_name/no_name/MainActivity.kt | 25 | ||||
-rw-r--r-- | app/src/main/java/com/no_name/no_name/SecureStorage.kt | 22 |
5 files changed, 102 insertions, 29 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31cb83c..29c7f56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,17 +10,14 @@ <uses-permission android:name="android.permission.INTERNET" /> <application - tools:replace="android:allowBackup" 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=".MainActivity" - android:label="@string/app_name" - android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppTheme" + tools:replace="android:allowBackup"> + <activity android:name=".InitialActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -28,6 +25,10 @@ </intent-filter> </activity> <activity + android:name=".MainActivity" + android:label="@string/app_name" + android:theme="@style/AppTheme.NoActionBar"></activity> + <activity android:name=".LoginActivity" android:label="@string/title_activity_login"></activity> </application> diff --git a/app/src/main/java/com/no_name/no_name/InitialActivity.kt b/app/src/main/java/com/no_name/no_name/InitialActivity.kt new file mode 100644 index 0000000..9e7f27c --- /dev/null +++ b/app/src/main/java/com/no_name/no_name/InitialActivity.kt @@ -0,0 +1,39 @@ +package com.no_name.no_name + +import android.content.Intent +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import com.github.kittinunf.fuel.android.extension.responseJson +import com.github.kittinunf.fuel.core.FuelManager +import com.github.kittinunf.fuel.httpGet +import com.madapps.prefrences.EasyPrefrences + +/** + * Activity which will be run before any other to verify user and choose which activity + * should be started next + */ +class InitialActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + FuelManager.instance.basePath = "http://192.168.0.59" + verifyLogin() + } + + private fun verifyLogin() { + val accessToken: String? = SecureStorage(this@InitialActivity).get("access_token") + var intent = Intent(this@InitialActivity, LoginActivity::class.java) + + if (accessToken != null) { // TODO: Check if user has internet connection, if not -> show MA without verification + val userID = EasyPrefrences(this@InitialActivity).getString("user_id") + "/users/$userID".httpGet() // synced function of fuel doesn't work here (#331) -> ugly workaround + .header("Authorization" to "Bearer $accessToken") + .responseJson { _, _, result -> + val (_, error) = result + if (error == null) intent = Intent(this@InitialActivity, MainActivity::class.java) + startActivity(intent) + } + } else { + startActivity(intent) + } + } +}
\ No newline at end of file diff --git a/app/src/main/java/com/no_name/no_name/LoginActivity.kt b/app/src/main/java/com/no_name/no_name/LoginActivity.kt index 154eb63..78289b4 100644 --- a/app/src/main/java/com/no_name/no_name/LoginActivity.kt +++ b/app/src/main/java/com/no_name/no_name/LoginActivity.kt @@ -26,6 +26,7 @@ import android.widget.TextView import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel.httpPost +import com.madapps.prefrences.EasyPrefrences import kotlinx.android.synthetic.main.activity_login.* import org.json.JSONObject import java.util.* @@ -39,10 +40,12 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { */ private var mAuthTask: UserLoginTask? = null + /** + * Set up the login form and initial configuration + */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) - // Set up the login form. populateAutoComplete() password.setOnEditorActionListener(TextView.OnEditorActionListener { _, id, _ -> if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { @@ -191,6 +194,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { } } + /** + * Things executed while creation of the loader + */ override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor> { return CursorLoader(this, // Retrieve data rows for the device user's 'profile' contact. @@ -206,6 +212,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { ContactsContract.Contacts.Data.IS_PRIMARY + " DESC") } + /** + * Things executed when loading is finished -> shown if login wasn't successful + */ override fun onLoadFinished(cursorLoader: Loader<Cursor>, cursor: Cursor) { val emails = ArrayList<String>() cursor.moveToFirst() @@ -242,21 +251,29 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { * the user. */ inner class UserLoginTask internal constructor(private val mEmail: String, private val mPassword: String) : AsyncTask<Void, Void, Boolean>() { - + /** + * Login processing and verifying + */ override fun doInBackground(vararg params: Void): Boolean? { val credentialJson = JSONObject() credentialJson.put("email", mEmail) credentialJson.put("password", mPassword) - val (request, response, result) = "/login".httpPost() + val (_, _, result) = "/login".httpPost() .header("Content-Type" to "application/json") .body(credentialJson.toString()) .responseJson() result.fold(success = { - val secureStorage = SecureStorage(this@LoginActivity) val accessToken = result.get().obj().getString("access_token") + val userID = result.get().obj().getString("user_id") + + val sharedPrefs = EasyPrefrences(this@LoginActivity) + sharedPrefs.putString("user_id", userID) + + val secureStorage = SecureStorage(this@LoginActivity) secureStorage.set("access_token", accessToken) + val verifyToken = secureStorage.get("access_token") return verifyToken == accessToken }, failure = { @@ -264,6 +281,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { }) } + /** + * Runs after [doInBackground], starts actions depending on [success] + */ override fun onPostExecute(success: Boolean?) { mAuthTask = null showProgress(false) @@ -282,6 +302,9 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { } } + /** + * Executed if login process was cancelled + */ override fun onCancelled() { mAuthTask = null showProgress(false) @@ -289,7 +312,6 @@ class LoginActivity : AppCompatActivity(), LoaderCallbacks<Cursor> { } companion object { - /** * Id to identity READ_CONTACTS permission request. */ diff --git a/app/src/main/java/com/no_name/no_name/MainActivity.kt b/app/src/main/java/com/no_name/no_name/MainActivity.kt index 10ae784..f44e873 100644 --- a/app/src/main/java/com/no_name/no_name/MainActivity.kt +++ b/app/src/main/java/com/no_name/no_name/MainActivity.kt @@ -1,39 +1,40 @@ package com.no_name.no_name -import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.Menu import android.view.MenuItem -import com.github.kittinunf.fuel.core.FuelManager import kotlinx.android.synthetic.main.activity_main.* +/** + * Main activity aka home screen of app + */ class MainActivity : AppCompatActivity() { - + /** + * Set initial configuration + */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) - FuelManager.instance.basePath = "http://192.168.0.59" fab.setOnClickListener { view -> - //Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - //.setAction("Action", null).show() - val intent = Intent(this@MainActivity, LoginActivity::class.java) - startActivity(intent) + // TODO: Set FAB onclick event } } + /** + * Inflate the [menu]; this adds items to the action bar if it is present + */ override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.menu_main, menu) return true } + /** + * Handling action bar [item] clicks + */ override fun onOptionsItemSelected(item: MenuItem): Boolean { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. return when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) diff --git a/app/src/main/java/com/no_name/no_name/SecureStorage.kt b/app/src/main/java/com/no_name/no_name/SecureStorage.kt index 5072f0d..ff14167 100644 --- a/app/src/main/java/com/no_name/no_name/SecureStorage.kt +++ b/app/src/main/java/com/no_name/no_name/SecureStorage.kt @@ -7,14 +7,26 @@ import com.kazakago.cryptore.CipherAlgorithm import com.kazakago.cryptore.Cryptore import com.madapps.prefrences.EasyPrefrences - +/** + * Class for saving data securely in SharedPreferences + */ class SecureStorage(private val context: Context) { - public fun set(key: String, value: String) { + /** + * Encrypts and saves the [value] with [key] as index + */ + fun set(key: String, value: String) { sharedPrefs.putString(key, encryptAES(value)) } - public fun get(key: String): String { - return decryptAES(sharedPrefs.getString(key)) + /** + * Finds the encrypted value by [key], decrypts it and returns the value as string + */ + fun get(key: String): String? { + return try { + decryptAES(sharedPrefs.getString(key)) + } catch (e: Exception) { + null + } } private val sharedPrefs = EasyPrefrences(context) @@ -26,8 +38,6 @@ class SecureStorage(private val context: Context) { private val cryptoreAES: Cryptore by lazy { val builder = Cryptore.Builder(alias = Alias.AES.value, type = CipherAlgorithm.AES) - // builder.blockMode = BlockMode.CBC //If Needed. - // builder.encryptionPadding = EncryptionPadding.PKCS7 //If Needed. builder.build() } |