From 9483c6b8347b27b6c0b512fbf186250c043b4577 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 7 Oct 2019 21:44:20 -0400 Subject: [PATCH] User credentials are saved and retrieved from the SQLite database. Next I want to retrieve all songs from icarus and return it to java/kotlin. Some code cleanup --- .../executionHistory/executionHistory.bin | Bin 4099994 -> 4099994 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/5.4.1/fileHashes/fileHashes.bin | Bin 234119 -> 235319 bytes .gradle/5.4.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../5.4.1/fileHashes/resourceHashesCache.bin | Bin 27813 -> 28901 bytes .gradle/5.4.1/javaCompile/classAnalysis.bin | Bin 329319 -> 358052 bytes .gradle/5.4.1/javaCompile/jarAnalysis.bin | Bin 707851 -> 911075 bytes .gradle/5.4.1/javaCompile/javaCompile.lock | Bin 17 -> 17 bytes .gradle/5.4.1/javaCompile/taskHistory.bin | Bin 30094 -> 30094 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .idea/caches/build_file_checksums.ser | Bin 1123 -> 1123 bytes .idea/workspace.xml | 940 ++++++++---------- app/src/main/AndroidManifest.xml | 2 +- app/src/main/cpp/BaseRepository.cpp | 6 +- app/src/main/cpp/Demo.cpp | 174 +++- app/src/main/cpp/UserRepository.cpp | 4 - app/src/main/cpp/UserRepository.h | 1 + app/src/main/cpp/model/Song.h | 16 +- app/src/main/cpp/model/Token.h | 7 +- app/src/main/cpp/model/User.h | 7 +- ...DemoStreamActivity.kt => LoginActivity.kt} | 51 +- .../com/example/mear/constants/AppDataPath.kt | 13 + .../java/com/example/mear/models/Token.kt | 3 + .../main/java/com/example/mear/models/User.kt | 3 + ...ity_demo_stream.xml => activity_login.xml} | 4 +- ...tent_demo_stream.xml => content_login.xml} | 7 +- 26 files changed, 601 insertions(+), 637 deletions(-) rename app/src/main/java/com/example/mear/activities/{DemoStreamActivity.kt => LoginActivity.kt} (60%) create mode 100644 app/src/main/java/com/example/mear/constants/AppDataPath.kt create mode 100644 app/src/main/java/com/example/mear/models/Token.kt create mode 100644 app/src/main/java/com/example/mear/models/User.kt rename app/src/main/res/layout/{activity_demo_stream.xml => activity_login.xml} (92%) rename app/src/main/res/layout/{content_demo_stream.xml => content_login.xml} (94%) diff --git a/.gradle/5.4.1/executionHistory/executionHistory.bin b/.gradle/5.4.1/executionHistory/executionHistory.bin index 70a01e4d60c8a948e29a7e8e2f83d10d51ccae79..3ea66c52326301b9639cfd75fa2690f4e4fb5b63 100644 GIT binary patch delta 11146 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 AWdHyG delta 9178 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 OeRtpE8XSje$Nmp5+bOpI delta 28841 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 diff --git a/.gradle/5.4.1/fileHashes/fileHashes.lock b/.gradle/5.4.1/fileHashes/fileHashes.lock index 11615dcb26eb5dcbdede93cf2d228f7e8d532b67..d28ee0c12d30aa7a1d4602eb8c58a96259f46949 100644 GIT binary patch literal 17 WcmZRcuuAq$@`=F93?RVtxe@?6G6nPi literal 17 WcmZRcuuAq$@`=F93?RUC@D%_$KL#@Z diff --git a/.gradle/5.4.1/fileHashes/resourceHashesCache.bin b/.gradle/5.4.1/fileHashes/resourceHashesCache.bin index c6038035223f0609451327cbbeac832fe65347cb..a7431fbb0e2bda8819f8edbbdd330cd392192447 100644 GIT binary patch delta 1143 zcmZ2_lkw?8#tkMCj7F19B@6^wCgy}y|70#@0E3*Rn`0#^nfPxk&3~e{BLgCs`*ZVI zsYphCA*;y$8Qrs?DvwW=m1*R6_?&v;+l*5XvAo5Tr^;9eY+XOMmgo8%KB!>hfl=e=wx=I?KBioQh!({Dhk_G=GlJ5xPZ&eQbGL5ZE4P!8 zKd7l<)y~j0P(lC6xeAK>o|_$RKRyX{X`b!mR)vTBj=y-4-dqD{Bt?=>wc)x`pI*Z8~INsKQr&It$~Q;b50gj`N_|ESj(v7 z#Z#!*_sy)T4vYfgSN<=}Um0o(6}>vyR_%v?+|=6ne{*wgL5-B$tgEic$gdc1<(KL_ z38>2a&Au81i~=Ut)#h#aSOfKC{^rSBHBSgw{(IPRVW$5Jh|*l{$)#E|`J*4!ypox9 z7b-S+GOKojfc@Q+XzgpSA41KXxVcu_5opn#EuW0mAA$(x#ZTU<)5yQxt^32abDB`y zx|?-%1sDZF3$D+T;5P_>h!!lIY^wJ|Ao|3_yMJ0(u0qZ9ovfgtD-){YPa}O_s6Gox1E!ltQxQlXo4Ila3z6Q5QGKJX6!Vu zG(A`7aZPE-wc6*Pct=yAD=ognPV;M=`0~#Ie;;2l!BlbXkw~wRQJ{d|>TQzT!jHDY zRUoXv<~k#F?ld{q*~J^)U8=HrGp|Sut`Eq7xDH*#gO1TZ8(zFoJ~`&Y0{ z^XyH>jui_p5)i>O&s)q;ROQj3KX0del$XA>-WgMc&7-!AfX{9#Zt*Tkyz(p}3R6W; z0{=%$lOPwID43y+3w4 delta 154 zcmV;L0A>H>;Q^)D0kAX}0TPon7%;Pa7;yr#1{+WTlWrV%ll~kplSLiCvmG8d0kef4 zu>q4#AsCZ>A=tBSBHsa%Wh7ve-6VOFZYA)ub|yCglf@_Sv&|?W0kZ}wX91IiE5MUo zERmB2EqAk(Eja;`<}P@%b}t73la(;=lbtcClU_29vjsB<0h1*(Fq54$QUV#lu^~_v Ivq4B?B*&#XN&o-= diff --git a/.gradle/5.4.1/javaCompile/classAnalysis.bin b/.gradle/5.4.1/javaCompile/classAnalysis.bin index 50472476cff53ed61775ec47d23d739c9a2949fa..95cef8a64e3d9fc9394fdb8a181077b111e80c79 100644 GIT binary patch delta 5754 zcmeH~c~n$K7Kg3(9w@Z(nwmB$ueex;(l(p4a>$uLWy5zT!o?+krXrd|9HJlIcRM+7FJ%ep^Id&-PA#~y_nSfNsd`er{HCMNpLN9!dtf~~Nvvu1Biogr z>$GBoI)>8K}-jlA;EgmO6|8*c= z7Q3F&w{WEGXXMigaWiGw6mftBAZQ!inCLV8Syl?Pfz>$Y8%_kOqdlPQiQ z&GA#}FOMC-o@&O-G3z4kmD7`(=GPWp$Kn_v<1+0yw{K(+2D{yzfkn;b%!_ID-0S;S z8}u~vn90IdFx57W^sGA5M(=bE)?9Be=WIl@L3Ue4sfvLtSVL^f-wwFHTq)~c(w3xw z)u8drN!vc|{obE`%yL}Xh((89rrNHE`yiH+mv?V-0Tva7jJ|z6_u-RCTdQ{W&&8sj zyZD&>3X)b_6xly z0$vOzKc#clG_TM1sKH{QFH8v`MRb^LXQ|4m6Ij&uhTS2gA=mJ(OX-k9_6@A+J(S!C zA$uvhqWZhX$6Hom)ka@ZJD2W5(y66+lN5+&9$B%G`yXTwN0z;*3v5j;o~ z$~Oru;Y1+WyZnnM&rX@k8nJMR#B)BG3Albk1ARjQ=Ds-dXfCtd#gHrLw$z%N%`jMW zE0?rIk`nVzkye=$~hpp5k<1Fr$7C6-W~NvSmkerHZi1w`5ejS_yB6xSgfk` z$x9AR`|{=UtT7X?uA0o8obDjm8beMb=X%Vd=^)`Au?Y3?C3JRRY^-d0xh^bzKey8}1wYF%SH_1jeJ=)7ApdjTrL zI`1b-_Xyd3Pf2B}J$P_SJoy7{;PmX^O+Li#Gc@3W1ePEBlJ|W+>G%MPUYnT9o;-X_$$f0Q5p+9Qt3U>O8>siF(CmbTOkHr1${sYhi?yxD zm^kKrDkCK!9gWd7XzXX!`j8!Bcs+Uw{ux41I^?BN>d-KhQebve8^OROlqR#HMxBYh zrA)F8%+xcJAvcIJrSGE*7g;-t?DY&GtJw?#3vq@&1na>gJE`e(9}3>bS{1T}*QOsB zB(>p@T*^`&h?m7=UeIBRdK9^%4x-QoS@^y;=1pPe-ME9D*QnP>9xhw7jmp<-9Le%P zsvwgO%d#*3%>Z8gl3EE~&xbm}WC;!45JT8W-W1qsfwTf`X#?FC4@VY*@o-=&pyA=2 zKnp#Mf%Udvv~+kjbc+Qsg=2$ylwM>juGXyb?8^ z_qttgKQRB%M>f>3>@zSLHtYlzvK(vMKrwV%PH>?~J8&B#uN0=W13gVt z8~Ywc5LvOTg&~6=h0=ia-9QCiI{|E^c@oeH$3w$2Koxp@52i}R7)V}vHMi|ekg8t9 z#;2iV=(d}VtP)z^0opLLA5d`FUBHtD3ZU;JkSu*nfzCAHOQD58z2yWSHq*r9zpe5i zP3S@E&&eoB%?awcuJRSOap#d$z-wGe6Hap{3<{G*EX#v@eMhPfx>TCT5kY7$QGr4? zPc1`)2*N}7!~I7HkyAb6HcoG~vqyL!6c82&4}?tT#9nN*6ED-C;Lmftl z_u*+(2N3H&xzHTMIpX?dA&mARoGZG%+4@o)!HvL1(4$R&0N?HE_1fd0hHSU~}2GE?WyO z|EPB;p}Y!;j+1=2<2dQe^?F3@TXd68_FX?RK6SEA0ldSiO7B3WT+-oBK;b|7|IItl zV1jgzSl5y3$4FKkCZoswQ$#s&!2hqpKi^eo`}baj2-kN2SsI@Sh3rAR1ex>*Rzlxd t=xip@ml#+L4+|+%>Bkqm7e#GQ{tw?{|HUWBzu<^gL0_-$0($Ie`Bz9A|JMKj delta 543 zcmXv|T}YE*6yE!tT@-2Fxcr71j?FZ-_!gVXEL>?y8iY}@fi!SraRFFe04$#8Y2pJzL( z3a0ETPT2$a%U;9J4k!0)_|CXb3o%}DIsw1A&S2JE#%Na&TRj``h$q1pJj5{HUBmO6 z(^%hADD_BMp0&rXrjv!oQ^mG^0Xl^%@MQ#rWg$DP+ zH8S=?qT$ZT6PlI{FMAoz_KHG3RE;9HA1*N35{3*t3rou%vI)ll*u=!>AapY^AAw;; z!5EmuxfrxDF&BprqZS=BA@hY5oZ1#3_aP`_Z2N?GcUazFX@^SgA(_NBEcfsGRMD7} y>BP)Y7-CrO(`kAH0%SZUS)X5{RVh&Mv_C+TDR`q;llLvfy7AdGh}pF9QT`7Cm(F?s diff --git a/.gradle/5.4.1/javaCompile/jarAnalysis.bin b/.gradle/5.4.1/javaCompile/jarAnalysis.bin index 8c68a6963471232d7536e5757bc4e6f63cac0412..6def626b8feb053eee6b9a699e21680d213b5c68 100644 GIT binary patch delta 34849 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 delta 99 zcmaES*1UU`_68FPM)}FU5(bl}N+e9?mGqe0Dp@gER4QR|uhfdkzS0ttYo(i*n0{_l s{2{*4KtZ(G(WBkbgAs_CfS4JGS%8=oh}nRc9f&!Am~*?M2iK_<0Kh&V-v9sr diff --git a/.gradle/5.4.1/javaCompile/javaCompile.lock b/.gradle/5.4.1/javaCompile/javaCompile.lock index 3f654d5b29710abbffb52930b6050755f5bdef68..b6651360842c8ce7ce46d861790a5d873b282005 100644 GIT binary patch literal 17 VcmZSPle_sf=(15O0~oNh0{|~h1Z4mK literal 17 VcmZSPle_sf=(15O0~oMy0RS%11Lyz% diff --git a/.gradle/5.4.1/javaCompile/taskHistory.bin b/.gradle/5.4.1/javaCompile/taskHistory.bin index b508ebc19e747a398282a16b5d2c37fdb8df8d14..ea8eb2e1dfc364ce5a6b71cc70cb1a65d355cce4 100644 GIT binary patch delta 30 mcmeBs&Di&vaYJIMz`K4e` + + @@ -108,27 +112,35 @@ - - - - - - - - - + + + + + + + + + + + + + - - + - + - - - + + + + + + + + @@ -207,176 +219,117 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -410,13 +363,21 @@ @@ -431,195 +392,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - @@ -753,7 +553,7 @@ - + @@ -762,20 +562,21 @@ - + - - + + - + + - + @@ -793,41 +594,60 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -962,20 +755,6 @@ - - - - - - - - - - - - - - @@ -1098,9 +877,6 @@ - - - @@ -1124,16 +900,36 @@ - + - + + + + + + + + + + + + + + + + + + + + + - + @@ -1160,9 +956,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1170,113 +1081,46 @@ - + + + + + + + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - + - - - - - - - - - - - - - - - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9f1cde4..328d5d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:supportsRtl="true" android:theme="@style/AppTheme"> diff --git a/app/src/main/cpp/BaseRepository.cpp b/app/src/main/cpp/BaseRepository.cpp index f1de0d0..14f2ebe 100644 --- a/app/src/main/cpp/BaseRepository.cpp +++ b/app/src/main/cpp/BaseRepository.cpp @@ -15,7 +15,6 @@ namespace repository { namespace local { const auto dbPath = pathOfDatabase(appPath); SQLite::Database db(dbPath, SQLite::OPEN_READONLY); - //SQLite::Database db(m_tableName, SQLite::OPEN_READONLY); return true; } catch (std::exception& ex) { auto msg = ex.what(); @@ -39,7 +38,7 @@ namespace repository { namespace local { auto msg = ex.what(); } - return false; + return true; } @@ -47,11 +46,8 @@ namespace repository { namespace local { { try { const auto dbPath = pathOfDatabase(appPath); - //std::fstream cret(dbPath, std::ios::out); - //cret.close(); SQLite::Database db(dbPath, SQLite::OPEN_CREATE | SQLite::OPEN_READWRITE); - //SQLite::Database db(m_tableName, SQLite::OPEN_CREATE); } catch (std::exception& ex) { auto msg = ex.what(); } diff --git a/app/src/main/cpp/Demo.cpp b/app/src/main/cpp/Demo.cpp index 605f9cb..5a749f5 100644 --- a/app/src/main/cpp/Demo.cpp +++ b/app/src/main/cpp/Demo.cpp @@ -30,24 +30,23 @@ #include "UserRepository.h" -model::Song retrieveSong(const std::string&, const std::string&); +model::Song retrieveSong(const std::string&, const std::string&, const int); + +model::User retrieveCredentials(const std::string&); std::string fetchToken(const std::string&, const std::string&, const std::string&); +bool doesDatabaseExist(const std::string&); +bool userCredentialExist(const std::string&); + void saveCredentials(const model::User&, const std::string&); -model::Song retrieveSong(const std::string& token, const std::string& baseUri) +model::Song retrieveSong(const std::string& token, const std::string& baseUri, const int songId) { repository::SongRepository songRepo; - model::Song song; - song.id = 1; - song.title = "Smooth"; - song.album = "Amaze"; - song.artist = "The Herb"; - song.genre = "Blazing"; - song.duration = 420; - song.year = 420; + model::Song song(songId, "Smooth", "Amaze", "The Herb", "Blazing", + 420, 420); song = songRepo.retrieveSong(token, baseUri, song); @@ -55,6 +54,15 @@ model::Song retrieveSong(const std::string& token, const std::string& baseUri) } +model::User retrieveCredentials(const std::string& dataPath) +{ + repository::local::UserRepository userRepo; + auto user = userRepo.retrieveUserCredentials(dataPath); + + return user; +} + + std::string fetchToken(const std::string& username, const std::string& password, const std::string& apiUri) { @@ -68,6 +76,22 @@ std::string fetchToken(const std::string& username, const std::string& password, } +bool doesDatabaseExist(const std::string& dataPath) +{ + repository::local::UserRepository userRepo; + const auto result = userRepo.databaseExist(dataPath); + + return result; +} + +bool userCredentialExist(const std::string& dataPath) +{ + repository::local::UserRepository userRepo; + + return userRepo.isTableEmpty(dataPath); +} + + void iterateDirectory(const std::string& path) { /** @@ -85,58 +109,37 @@ void iterateDirectory(const std::string& path) void saveCredentials(const model::User& user, const std::string& appDirectory) { - std::string filePath(appDirectory); - filePath.append("/"); repository::local::UserRepository userRepo; - if (!userRepo.databaseExist(filePath)) { - userRepo.initializedDatabase(filePath); + if (!userRepo.databaseExist(appDirectory)) { + userRepo.initializedDatabase(appDirectory); } - if (!userRepo.doesUserTableExist(filePath)) { - userRepo.createUserTable(filePath); + if (!userRepo.doesUserTableExist(appDirectory)) { + userRepo.createUserTable(appDirectory); } - if (userRepo.isTableEmpty(filePath)) { - userRepo.deleteUserTable(filePath); + if (userRepo.isTableEmpty(appDirectory)) { + userRepo.deleteUserTable(appDirectory); } - userRepo.saveUserCred(user, filePath); -} - - -extern "C" -JNIEXPORT jstring -JNICALL -Java_com_example_mear_activities_DemoStreamActivity_logUser( - JNIEnv *env, - jobject thisObj, - jstring username, - jstring password, - jstring apiUri ) { - - const std::string usr = env->GetStringUTFChars(username, NULL); - const std::string pass = env->GetStringUTFChars(password, NULL); - const std::string api = env->GetStringUTFChars(apiUri, NULL); - - auto token = fetchToken(usr, pass, api); - - return env->NewStringUTF(token.c_str()); + userRepo.saveUserCred(user, appDirectory); } extern "C" JNIEXPORT jobject JNICALL -Java_com_example_mear_activities_DemoStreamActivity_retrieveSong( +Java_com_example_mear_activities_LoginActivity_retrieveSong( JNIEnv *env, jobject thisObj, jstring token, - jstring apiUri - ) + jstring apiUri, + jint idOfSong +) { const std::string tok = env->GetStringUTFChars(token, NULL); const std::string baseUri = env->GetStringUTFChars(apiUri, NULL); - auto song = retrieveSong(tok, baseUri); + auto song = retrieveSong(tok, baseUri, idOfSong); jclass songClass = env->FindClass( "com/example/mear/models/Song"); jmethodID jconstructor = env->GetMethodID( songClass, "", "()V" ); @@ -169,11 +172,87 @@ Java_com_example_mear_activities_DemoStreamActivity_retrieveSong( return songObj; } +extern "C" +JNIEXPORT jobject +JNICALL +Java_com_example_mear_activities_LoginActivity_retrieveUserCredentials( + JNIEnv *env, + jobject thisObj, + jstring dataPath +) { + jclass userClass = env->FindClass("com/example/mear/models/User"); + jmethodID userContructor = env->GetMethodID(userClass, "", "()V"); + jobject userObj = env->NewObject(userClass, userContructor); + + const std::string dataPathStr = env->GetStringUTFChars(dataPath, nullptr); + auto user = retrieveCredentials(dataPathStr); + + jmethodID usernameId = env->GetMethodID(userClass, "setUsername", "(Ljava/lang/String;)V"); + jmethodID passwordId = env->GetMethodID(userClass, "setPassword", "(Ljava/lang/String;)V"); + + jstring username = env->NewStringUTF(user.username.c_str()); + jstring password = env->NewStringUTF(user.password.c_str()); + + env->CallVoidMethod(userObj, usernameId, username); + env->CallVoidMethod(userObj, passwordId, password); + + return userObj; +} + + +extern "C" +JNIEXPORT jstring +JNICALL +Java_com_example_mear_activities_LoginActivity_logUser( + JNIEnv *env, + jobject thisObj, + jstring username, + jstring password, + jstring apiUri ) { + + const std::string usr = env->GetStringUTFChars(username, NULL); + const std::string pass = env->GetStringUTFChars(password, NULL); + const std::string api = env->GetStringUTFChars(apiUri, NULL); + + auto token = fetchToken(usr, pass, api); + + return env->NewStringUTF(token.c_str()); +} + + +extern "C" +JNIEXPORT jboolean +JNICALL +Java_com_example_mear_activities_LoginActivity_isUserTableEmpty( + JNIEnv *env, + jobject thisObj, + jstring dataPath + ) { + const std::string dataPathStr = env->GetStringUTFChars(dataPath, NULL); + jboolean result = userCredentialExist(dataPathStr); + + return result; +} + +extern "C" +JNIEXPORT jboolean +JNICALL +Java_com_example_mear_activities_LoginActivity_doesDatabaseExist( + JNIEnv *env, + jobject thidObj, + jstring dataPath + ) { + const std::string dataPathStr = env->GetStringUTFChars(dataPath, NULL); + jboolean result = doesDatabaseExist(dataPathStr); + + return result; +} + extern "C" JNIEXPORT void JNICALL -Java_com_example_mear_activities_DemoStreamActivity_pathIteratorDemo( +Java_com_example_mear_activities_LoginActivity_pathIteratorDemo( JNIEnv *env, jobject thisObj, jstring path @@ -187,21 +266,18 @@ Java_com_example_mear_activities_DemoStreamActivity_pathIteratorDemo( extern "C" JNIEXPORT void JNICALL -Java_com_example_mear_activities_DemoStreamActivity_saveUserCredentials( +Java_com_example_mear_activities_LoginActivity_saveUserCredentials( JNIEnv *env, jobject thisObj, jstring username, jstring password, jstring appDirectory ) { - const std::string usernameStr = env->GetStringUTFChars(username, NULL); const std::string passwordStr = env->GetStringUTFChars(password, NULL); const std::string appDirectoryStr = env->GetStringUTFChars(appDirectory, NULL); - model::User user; - user.username = usernameStr; - user.password = passwordStr; + model::User user(usernameStr, passwordStr); saveCredentials(user, appDirectoryStr); } diff --git a/app/src/main/cpp/UserRepository.cpp b/app/src/main/cpp/UserRepository.cpp index f800dea..6fa4aeb 100644 --- a/app/src/main/cpp/UserRepository.cpp +++ b/app/src/main/cpp/UserRepository.cpp @@ -19,7 +19,6 @@ namespace repository { namespace local { try { const auto dbPath = pathOfDatabase(appPath); SQLite::Database db(dbPath, SQLite::OPEN_READONLY); - //SQLite::Database db(m_tableName, SQLite::OPEN_READONLY); std::string queryString("SELECT * FROM "); queryString.append(m_tableName); @@ -50,7 +49,6 @@ namespace repository { namespace local { try { const auto dbPath = pathOfDatabase(appPath); SQLite::Database db(dbPath, SQLite::OPEN_READONLY); - //SQLite::Database db(m_tableName, SQLite::OPEN_READONLY); return db.tableExists(m_tableName); } catch (std::exception& ex) { @@ -66,7 +64,6 @@ namespace repository { namespace local { try { const auto dbPath = pathOfDatabase(appPath); SQLite::Database db(dbPath, SQLite::OPEN_READWRITE); - //SQLite::Database db(m_tableName, SQLite::OPEN_READWRITE); std::string queryString("CREATE TABLE "); queryString.append(m_tableName); @@ -97,7 +94,6 @@ namespace repository { namespace local { try { const auto dbPath = pathOfDatabase(appPath); SQLite::Database db(dbPath, SQLite::OPEN_READWRITE); - //SQLite::Database db(m_tableName, SQLite::OPEN_READWRITE); std::string queryString("INSERT INTO "); queryString.append(m_tableName); queryString.append(" (Username, Password) VALUES (?, ?)"); diff --git a/app/src/main/cpp/UserRepository.h b/app/src/main/cpp/UserRepository.h index 666ed16..df33540 100644 --- a/app/src/main/cpp/UserRepository.h +++ b/app/src/main/cpp/UserRepository.h @@ -19,6 +19,7 @@ namespace repository { namespace local { model::User retrieveUserCredentials(const std::string&); + bool isEmpty(const std::string&); bool doesUserTableExist(const std::string&); void createUserTable(const std::string&); diff --git a/app/src/main/cpp/model/Song.h b/app/src/main/cpp/model/Song.h index f7a848d..de4f710 100644 --- a/app/src/main/cpp/model/Song.h +++ b/app/src/main/cpp/model/Song.h @@ -10,8 +10,22 @@ namespace model { -struct Song +class Song { +public: + Song() = default; + Song(const int id, const std::string& title, const std::string& artist, + const std::string& album, const std::string& genre, + const int duration, const int year) : + id(id), title(title), artist(artist), album(album), + genre(genre), duration(duration), year(year) { } + Song(const int id, const std::string&& title, const std::string&& artist, + const std::string&& album, const std::string&& genre, + const int duration, const int year) : + id(id), title(std::move(title)), artist(std::move(artist)), + album(std::move(album)), genre(std::move(genre)), duration(duration), + year(year) { } + int id; std::string title; std::string artist; diff --git a/app/src/main/cpp/model/Token.h b/app/src/main/cpp/model/Token.h index a702cf0..02665a6 100644 --- a/app/src/main/cpp/model/Token.h +++ b/app/src/main/cpp/model/Token.h @@ -6,14 +6,17 @@ #define MEAR_TOKEN_H #include +#include namespace model { class Token { public: - Token(const std::string& token) : token(token) { } + Token(const std::string& accessToken) : accessToken(accessToken) { } + Token(const std::string&& accessToken) : + accessToken(std::move(accessToken)) { } - std::string token; + std::string accessToken; }; } diff --git a/app/src/main/cpp/model/User.h b/app/src/main/cpp/model/User.h index a04fe79..8ed1a30 100644 --- a/app/src/main/cpp/model/User.h +++ b/app/src/main/cpp/model/User.h @@ -5,13 +5,18 @@ #ifndef MEAR_USER_H #define MEAR_USER_H +#include +#include namespace model { -struct User +class User { +public: User() = default; User(const std::string& user, const std::string& pass) : username(user), password(pass) { } + User(const std::string&& user, const std::string&& pass) : + username(std::move(user)), password(std::move(pass)) {} std::string username; std::string password; diff --git a/app/src/main/java/com/example/mear/activities/DemoStreamActivity.kt b/app/src/main/java/com/example/mear/activities/LoginActivity.kt similarity index 60% rename from app/src/main/java/com/example/mear/activities/DemoStreamActivity.kt rename to app/src/main/java/com/example/mear/activities/LoginActivity.kt index bd9efc6..641782f 100644 --- a/app/src/main/java/com/example/mear/activities/DemoStreamActivity.kt +++ b/app/src/main/java/com/example/mear/activities/LoginActivity.kt @@ -3,16 +3,16 @@ package com.example.mear.activities import android.os.Bundle import android.os.Environment import android.support.design.widget.Snackbar -import android.support.v7.app.AppCompatActivity import com.example.mear.R -import kotlinx.android.synthetic.main.activity_demo_stream.* -import kotlinx.android.synthetic.main.content_demo_stream.* +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.content_login.* import org.jetbrains.anko.toast import com.example.mear.models.Song +import com.example.mear.models.User -class DemoStreamActivity : BaseServiceActivity() { +class LoginActivity : BaseServiceActivity() { companion object { init { @@ -21,22 +21,31 @@ class DemoStreamActivity : BaseServiceActivity() { } - private var token: String? = null + private external fun retrieveSong(tok: String, api: String, songId: Int): Song + private external fun retrieveUserCredentials(path: String): User - // TODO: add external call to retrieve User credentials private external fun logUser(usr: String, pass: String, api: String): String - private external fun retrieveSong(tok: String, api: String): Song - //private external fun testSongStream(tok: String, id: Int) + + private external fun doesDatabaseExist(path: String): Boolean + private external fun isUserTableEmpty(path: String): Boolean + private external fun pathIteratorDemo(path: String) private external fun saveUserCredentials(username: String, password: String, appDir: String) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_demo_stream) + setContentView(R.layout.activity_login) setSupportActionBar(toolbar) + val pa = appDirectory() + if (doesDatabaseExist(pa) && !isUserTableEmpty(pa)) { + val usr = retrieveUserCredentials(pa) + username.setText(usr.username) + password.setText(usr.password) + } + doBindService() demoStream.setOnClickListener { @@ -69,19 +78,14 @@ class DemoStreamActivity : BaseServiceActivity() { apiUriStr = "" } - token = logUser(usernameStr, passwordStr, apiUriStr) + val token = logUser(usernameStr, passwordStr, apiUriStr) try { - - val s = retrieveSong(token!!, apiUriStr) - musicService!!.icarusPlaySong(this.applicationContext, token!!, apiUriStr, s) - val dir = Environment.getExternalStorageDirectory().absolutePath + "/music" - val appRelPath: String = resources.getString(R.string.app_relative_path) - var inStoragePath = Environment.getDataDirectory().toString() - inStoragePath += "/data/$appRelPath" - - if (saveCred) { - saveUserCredentials(usernameStr, passwordStr, inStoragePath) + val songId = 4 + val song = retrieveSong(token, apiUriStr, songId) + val pa = appDirectory() + if (saveCred && isUserTableEmpty(pa)) { + saveUserCredentials(usernameStr, passwordStr, pa) } } catch (ex: Exception) { @@ -89,6 +93,13 @@ class DemoStreamActivity : BaseServiceActivity() { } } + + private fun appDirectory(): String { + return Environment.getDataDirectory().toString() + "/data/" + + resources.getString(R.string.app_relative_path) + } + + private fun validFields(): Boolean { if (username.text.isEmpty()) { return false diff --git a/app/src/main/java/com/example/mear/constants/AppDataPath.kt b/app/src/main/java/com/example/mear/constants/AppDataPath.kt new file mode 100644 index 0000000..b76cb7d --- /dev/null +++ b/app/src/main/java/com/example/mear/constants/AppDataPath.kt @@ -0,0 +1,13 @@ +package com.example.mear.constants + +import android.os.Bundle +import android.content.res.Resources +import android.os.Environment +import com.example.mear.R + +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.content_login.* + +object AppDataPath { + val APP_DATA_PATH: String = Environment.getDataDirectory().toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/models/Token.kt b/app/src/main/java/com/example/mear/models/Token.kt new file mode 100644 index 0000000..09c0c31 --- /dev/null +++ b/app/src/main/java/com/example/mear/models/Token.kt @@ -0,0 +1,3 @@ +package com.example.mear.models + +class Token (var accessToken: String = "") diff --git a/app/src/main/java/com/example/mear/models/User.kt b/app/src/main/java/com/example/mear/models/User.kt new file mode 100644 index 0000000..ddcb41e --- /dev/null +++ b/app/src/main/java/com/example/mear/models/User.kt @@ -0,0 +1,3 @@ +package com.example.mear.models + +class User (var username: String = "", var password: String = "") diff --git a/app/src/main/res/layout/activity_demo_stream.xml b/app/src/main/res/layout/activity_login.xml similarity index 92% rename from app/src/main/res/layout/activity_demo_stream.xml rename to app/src/main/res/layout/activity_login.xml index ac123fb..f7d6e4c 100644 --- a/app/src/main/res/layout/activity_demo_stream.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".activities.DemoStreamActivity"> + tools:context=".activities.LoginActivity"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/content_demo_stream.xml b/app/src/main/res/layout/content_login.xml similarity index 94% rename from app/src/main/res/layout/content_demo_stream.xml rename to app/src/main/res/layout/content_login.xml index 166097b..cf822be 100644 --- a/app/src/main/res/layout/content_demo_stream.xml +++ b/app/src/main/res/layout/content_login.xml @@ -5,8 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:context=".activities.DemoStreamActivity" - tools:showIn="@layout/activity_demo_stream"> + tools:context=".activities.LoginActivity" + tools:showIn="@layout/activity_login">