diff --git a/app/app.iml b/app/app.iml index 2a25075..42fa1fa 100644 --- a/app/app.iml +++ b/app/app.iml @@ -64,6 +64,7 @@ + @@ -125,7 +126,6 @@ - diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 5db8cc2..49d0830 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -15,13 +15,16 @@ cmake_minimum_required(VERSION 3.4.1) set (SOURCES Demo.cpp + SongRepository.cpp Tok.cpp - ) +) + set (HEADERS model/Song.h model/User.h + SongRepository.h Tok.h - ) +) set(JSON_BuildTests OFF CACHE INTERNAL "") @@ -29,13 +32,12 @@ set(JSON_BuildTests OFF CACHE INTERNAL "") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/json) -add_library(native-lib - SHARED +add_library(native-lib SHARED - # Provides a relative path to your source file(s). - ${SOURCES} - ${HEADERS} - ) + # Provides a relative path to your source file(s). + ${SOURCES} + ${HEADERS} +) # Searches for a specified prebuilt library and stores the path as a @@ -44,27 +46,26 @@ add_library(native-lib # you want to add. CMake verifies that the library exists before # completing its build. -find_library( # Sets the name of the path variable. - log-lib +find_library(log-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + log +) - # Specifies the name of the NDK library that - # you want CMake to locate. - log ) - -# message(${CMAKE_ANDROID_ARCH_ABI}) set (CURL_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI} - ) +) set (CURL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/include/curl ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/include - ) +) add_library(boo STATIC IMPORTED) -set_target_properties(boo PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI}/libcurl.a") -#find_package(CURL REQUIRED) +set_target_properties(boo PROPERTIES IMPORTED_LOCATION + "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI}/libcurl.a" +) include_directories(${CURL_INCLUDE_DIR}) @@ -72,15 +73,10 @@ include_directories(${CURL_INCLUDE_DIR}) # can link multiple libraries, such as libraries you define in this # build script, prebuilt third-party libraries, or system libraries. -#target_include_directories(native-lib PUBLIC ${CURL_INCLUDE_DIR}) -target_link_libraries( # Specifies the target library. - native-lib - PRIVATE nlohmann_json::nlohmann_json - boo - #${CURL_LIBRARIES} +target_link_libraries(native-lib PRIVATE - # Links the target library to the log library - # included in the NDK. - ${log-lib} + nlohmann_json::nlohmann_json + boo + ${log-lib} z - ) \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/cpp/Demo.cpp b/app/src/main/cpp/Demo.cpp index 552cca5..6b58057 100644 --- a/app/src/main/cpp/Demo.cpp +++ b/app/src/main/cpp/Demo.cpp @@ -20,134 +20,40 @@ #include "model/Song.h" #include "model/User.h" +#include "Tok.h" -std::string fetchToken(); - -model::Song initSong(); -model::User initUser(); - -size_t funcTest(void*, size_t, size_t, char*); -//size_t funcTest(void*, size_t, size_t, std::string&); - -int demoCall(); - -void printSong(const model::Song&); +std::string fetchToken(const std::string&, const std::string&, const std::string&); -std::string fetchToken() +std::string fetchToken(const std::string& username, const std::string& password, + const std::string& apiUri) { - auto user = initUser(); - nlohmann::json usr; - usr["username"] = user.username; - usr["password"] = user.password; + model::User user(username, password); + manager::Tok tokMgr; - CURL *curl; - CURLcode res; + auto token = tokMgr.fetchToken(user, apiUri); - curl = curl_easy_init(); + return token; - std::string tok; - if (curl) { - const auto url = ""; - - char resp[2048]; - curl_easy_setopt(curl, CURLOPT_URL, url); - const std::string a = usr.dump(); - //std::string r; - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, a.c_str()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, funcTest); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); - //curl_easy_setopt(curl, CURLOPT_WRITEDATA, r); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); - - res = curl_easy_perform(curl); - curl_easy_cleanup(curl); - - const std::string i = resp; - auto s = nlohmann::json::parse(i); - tok = s["token"].get(); - return tok; - } - - return ""; -} - - -model::Song initSong() -{ - model::Song song; - song.title = "hello"; - song.artist = "some artist"; - - return song; -} - - -model::User initUser() -{ - model::User user; - user.username = ""; - user.password = ""; - - return user; -} - - -size_t funcTest(void* ptr, size_t size, size_t nmemb, char *e) -{ - std::memcpy(e, ptr, nmemb); - e[nmemb] = '\0'; - - return nmemb; -} - -size_t funcTest(void* ptr, size_t size, size_t nmemb, std::string& e) -{ - e = (char*) ptr; - - return nmemb; -} - - -int demoCall() -{ - model::Song song = initSong(); - - std::cout << "testing" << std::endl; - printSong(song); - - return 0; -} - - -void printSong(const model::Song& song) -{ - std::cout << "\nsong information" << std::endl; - std::cout << "title: " << song.title << std::endl; - std::cout << "artist: " << song.artist << std::endl; - std::cout << "album: " << song.album << std::endl; - std::cout << "genre: " << song.genre << std::endl; - std::cout << "year: " << song.year << std::endl; } extern "C" -JNIEXPORT void - JNICALL -Java_com_example_mear_activities_MainActivity_test( - JNIEnv *env, - jobject /* this */) { - - demoCall(); -} - -extern "C" -JNIEXPORT void +JNIEXPORT jstring JNICALL -Java_com_example_mear_activities_DemoStreamActivity_test( +Java_com_example_mear_activities_DemoStreamActivity_logUser( JNIEnv *env, - jobject /* this */) { + jobject thisObj, + jstring username, + jstring password, + jstring apiUri ) { - auto tok = fetchToken(); + 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()); } diff --git a/app/src/main/cpp/SongRepository.cpp b/app/src/main/cpp/SongRepository.cpp new file mode 100644 index 0000000..6180b27 --- /dev/null +++ b/app/src/main/cpp/SongRepository.cpp @@ -0,0 +1,16 @@ +// +// Created by brahmix on 10/3/19. +// + +#include "SongRepository.h" + +namespace repository { + // TODO: implement this + std::vector SongRepository::fetchSongs(const std::string& token, + const std::string& uri) + { + std::vector songs; + + return songs; + } +} diff --git a/app/src/main/cpp/SongRepository.h b/app/src/main/cpp/SongRepository.h new file mode 100644 index 0000000..5c8db05 --- /dev/null +++ b/app/src/main/cpp/SongRepository.h @@ -0,0 +1,23 @@ +// +// Created by brahmix on 10/3/19. +// + +#ifndef MEAR_SONGREPOSITORY_H +#define MEAR_SONGREPOSITORY_H + +#include +#include + +#include "model/Song.h" + +namespace repository { + + class SongRepository { + public: + std::vector fetchSongs(const std::string&, const std::string&); + private: + }; +} + + +#endif //MEAR_SONGREPOSITORY_H diff --git a/app/src/main/cpp/Tok.cpp b/app/src/main/cpp/Tok.cpp index e9fc3bb..125acfd 100644 --- a/app/src/main/cpp/Tok.cpp +++ b/app/src/main/cpp/Tok.cpp @@ -3,3 +3,69 @@ // #include "Tok.h" + +#include + +#include +#include + +namespace manager { + std::string Tok::fetchToken(const model::User &user, const std::string& uri) { + CURL *curl; + CURLcode res; + + curl = curl_easy_init(); + + if (!curl) { + return "none"; + } + + char resp[2048]; + + const auto loginUri = fetchLoginUri(uri); + const auto obj = userJsonString(user); + + curl_easy_setopt(curl, CURLOPT_URL, loginUri.c_str()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, obj.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, respBodyRetriever); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (res == CURLE_OK) { + auto s = nlohmann::json::parse(resp); + return s["token"].get(); + } + + return "failure"; + } + + + std::string Tok::fetchLoginUri(const std::string& baseUri) + { + std::string uri(baseUri); + uri.append("/api/v1/login"); + + return uri; + } + + std::string Tok::userJsonString(const model::User& user) + { + nlohmann::json usr; + usr["username"] = user.username; + usr["password"] = user.password; + + return usr.dump(); + } + + + size_t Tok::respBodyRetriever(void* ptr, size_t size, size_t nmemb, char *e) + { + std::memcpy(e, ptr, nmemb); + e[nmemb] = '\0'; + + return nmemb; + } +} diff --git a/app/src/main/cpp/Tok.h b/app/src/main/cpp/Tok.h index feb6bbc..87ab2cd 100644 --- a/app/src/main/cpp/Tok.h +++ b/app/src/main/cpp/Tok.h @@ -7,9 +7,20 @@ #include -class Tok { +#include "model/User.h" -}; +namespace manager { + + class Tok { + public: + std::string fetchToken(const model::User&, const std::string&); + private: + std::string fetchLoginUri(const std::string&); + std::string userJsonString(const model::User&); + + static size_t respBodyRetriever(void*, size_t, size_t, char*); + }; +} #endif //MEAR_TOK_H diff --git a/app/src/main/cpp/model/User.h b/app/src/main/cpp/model/User.h index cdb940e..a04fe79 100644 --- a/app/src/main/cpp/model/User.h +++ b/app/src/main/cpp/model/User.h @@ -5,11 +5,14 @@ #ifndef MEAR_USER_H #define MEAR_USER_H -//#include "../../../../../../../../Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/string" namespace model { struct User { + User() = default; + User(const std::string& user, const std::string& pass) : + username(user), password(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/DemoStreamActivity.kt index 0492b16..eacce78 100644 --- a/app/src/main/java/com/example/mear/activities/DemoStreamActivity.kt +++ b/app/src/main/java/com/example/mear/activities/DemoStreamActivity.kt @@ -7,6 +7,7 @@ import com.example.mear.R import kotlinx.android.synthetic.main.activity_demo_stream.* import kotlinx.android.synthetic.main.content_demo_stream.* +import org.jetbrains.anko.toast class DemoStreamActivity : AppCompatActivity() { @@ -17,7 +18,8 @@ class DemoStreamActivity : AppCompatActivity() { } - external fun test(); + private external fun logUser(usr: String, pass: String, api: String): String + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -25,7 +27,11 @@ class DemoStreamActivity : AppCompatActivity() { setSupportActionBar(toolbar) demoStream.setOnClickListener { - test() + toast("vacant").show() + } + + login.setOnClickListener { + loginButton() } fab.setOnClickListener {view -> @@ -34,4 +40,32 @@ class DemoStreamActivity : AppCompatActivity() { } } + private fun loginButton() { + if (!validFields()) { + toast("Fields are invalid").show() + return + } + + var usernameStr = username.text.toString() + var passwordStr = password.text.toString() + var apiUriStr = apiUri.text.toString() + + var token = logUser(usernameStr, passwordStr, apiUriStr) + toast(token).show() + } + + private fun validFields(): Boolean { + if (username.text.isEmpty()) { + return false + } + if (password.text.isEmpty()) { + return false + } + if (password.text.isEmpty()) { + return false + } + + return true + } + } diff --git a/app/src/main/res/layout/content_demo_stream.xml b/app/src/main/res/layout/content_demo_stream.xml index 9fd0be9..aa9f0df 100644 --- a/app/src/main/res/layout/content_demo_stream.xml +++ b/app/src/main/res/layout/content_demo_stream.xml @@ -12,10 +12,60 @@ android:id="@+id/demoStream" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="140dp" + android:layout_marginStart="16dp" android:text="Stream" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.499" /> + app:layout_constraintVertical_bias="0.954" /> + + + + + + + +