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" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file