mirror of
https://github.com/nerzhul/ownCloud-SMS-App.git
synced 2025-06-09 17:06:13 +00:00
Update tools versions & prepare JNI work to reduce memory & CPU usage
This commit is contained in:
parent
c52168c939
commit
47c2923d0e
@ -23,3 +23,9 @@ android:
|
|||||||
- 'google-gdk-license-.+'
|
- 'google-gdk-license-.+'
|
||||||
- 'android-sdk-preview-license-.+'
|
- 'android-sdk-preview-license-.+'
|
||||||
- 'android-.*'
|
- 'android-.*'
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- wget https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip > /dev/null
|
||||||
|
- mkdir -p /usr/local/android-sdk/ndk-bundle
|
||||||
|
- unzip android-ndk-r15c-linux-x86_64.zip -d /usr/local/android-sdk/ndk-bundle > /dev/null
|
||||||
|
- export ANDROID_NDK_HOME="/usr/local/android-sdk/ndk-bundle/android-ndk-r15c"
|
13
CMakeLists.txt
Normal file
13
CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5.0)
|
||||||
|
|
||||||
|
set (SRC_FILES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/httpclient.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/nativesms.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/smsbuffer.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LOGGING_LIBRARY log)
|
||||||
|
|
||||||
|
add_library(nativesms SHARED ${SRC_FILES})
|
||||||
|
|
||||||
|
target_link_libraries(nativesms ${LOGGING_LIBRARY})
|
16
build.gradle
16
build.gradle
@ -25,6 +25,17 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 26
|
targetSdkVersion 26
|
||||||
maxSdkVersion 26
|
maxSdkVersion 26
|
||||||
|
ndk {
|
||||||
|
// Specifies the ABI configurations of your native
|
||||||
|
// libraries Gradle should build and package with your APK.
|
||||||
|
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
|
||||||
|
'arm64-v8a'
|
||||||
|
}
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
cppFlags "-frtti -fexceptions -std=c++11"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
@ -36,6 +47,11 @@ android {
|
|||||||
packagingOptions {
|
packagingOptions {
|
||||||
exclude 'META-INF/LICENSE.txt'
|
exclude 'META-INF/LICENSE.txt'
|
||||||
}
|
}
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
path 'CMakeLists.txt'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
56
src/main/cpp/httpclient.cpp
Normal file
56
src/main/cpp/httpclient.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "httpclient.h"
|
||||||
|
|
||||||
|
const char *HTTPClient::classPathName = "fr/unix_experience/owncloud_sms/engine/OCHttpClient";
|
||||||
|
|
||||||
|
// See https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html
|
||||||
|
JNINativeMethod HTTPClient::methods[] =
|
||||||
|
{
|
||||||
|
DECL_JNIMETHOD(getAllSmsIdsCall, "()Ljava/lang/String;")
|
||||||
|
DECL_JNIMETHOD(getLastMsgTimestamp, "()Ljava/lang/String;")
|
||||||
|
DECL_JNIMETHOD(getPushRoute, "()Ljava/lang/String;")
|
||||||
|
DECL_JNIMETHOD(getVersionCall, "()Ljava/lang/String;")
|
||||||
|
};
|
||||||
|
DECL_METHODSIZE(HTTPClient)
|
||||||
|
|
||||||
|
// APIv1 calls
|
||||||
|
#define RCALL_GET_VERSION "/index.php/apps/ocsms/get/apiversion?format=json"
|
||||||
|
#define RCALL_GET_ALL_SMS_IDS "/index.php/apps/ocsms/get/smsidlist?format=json"
|
||||||
|
#define RCALL_GET_LAST_MSG_TIMESTAMP "/index.php/apps/ocsms/get/lastmsgtime?format=json"
|
||||||
|
#define RCALL_PUSH_ROUTE "/index.php/apps/ocsms/push?format=json"
|
||||||
|
|
||||||
|
jstring HTTPClient::getVersionCall(JNIEnv *env, jobject)
|
||||||
|
{
|
||||||
|
return env->NewStringUTF(RCALL_GET_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring HTTPClient::getAllSmsIdsCall(JNIEnv *env, jobject)
|
||||||
|
{
|
||||||
|
return env->NewStringUTF(RCALL_GET_ALL_SMS_IDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring HTTPClient::getLastMsgTimestamp(JNIEnv *env, jobject)
|
||||||
|
{
|
||||||
|
return env->NewStringUTF(RCALL_GET_LAST_MSG_TIMESTAMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring HTTPClient::getPushRoute(JNIEnv *env, jobject)
|
||||||
|
{
|
||||||
|
return env->NewStringUTF(RCALL_PUSH_ROUTE);
|
||||||
|
}
|
34
src/main/cpp/httpclient.h
Normal file
34
src/main/cpp/httpclient.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
#include "macro_helpers.h"
|
||||||
|
|
||||||
|
class HTTPClient
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
JNIEXPORT static jstring JNICALL getVersionCall(JNIEnv *env, jobject);
|
||||||
|
JNIEXPORT static jstring JNICALL getAllSmsIdsCall(JNIEnv *env, jobject);
|
||||||
|
JNIEXPORT static jstring JNICALL getLastMsgTimestamp(JNIEnv *env, jobject);
|
||||||
|
JNIEXPORT static jstring JNICALL getPushRoute(JNIEnv *env, jobject);
|
||||||
|
|
||||||
|
DECL_JNICLASSATTRS
|
||||||
|
};
|
||||||
|
|
||||||
|
|
29
src/main/cpp/macro_helpers.h
Normal file
29
src/main/cpp/macro_helpers.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define DECL_JNIMETHOD(name, type) \
|
||||||
|
{#name, type, (void*) &name },
|
||||||
|
|
||||||
|
#define DECL_METHODSIZE(T) \
|
||||||
|
int T::methods_size = sizeof(T::methods) / sizeof(T::methods[0]);
|
||||||
|
|
||||||
|
#define DECL_JNICLASSATTRS \
|
||||||
|
static const char *classPathName; \
|
||||||
|
static JNINativeMethod methods[]; \
|
||||||
|
static int methods_size;
|
76
src/main/cpp/nativesms.cpp
Normal file
76
src/main/cpp/nativesms.cpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2014-2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
#include "httpclient.h"
|
||||||
|
#include "smsbuffer.h"
|
||||||
|
|
||||||
|
#define LOG_TAG "nativesms.cpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register several native methods for one class.
|
||||||
|
*/
|
||||||
|
static int registerNativeMethods(JNIEnv* env, const char* className,
|
||||||
|
JNINativeMethod* gMethods, int numMethods)
|
||||||
|
{
|
||||||
|
jclass clazz;
|
||||||
|
clazz = env->FindClass(className);
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "Registering class '%s'", className);
|
||||||
|
if (clazz == NULL) {
|
||||||
|
__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "Native registration unable to find class %s", className);
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "RegisterNatives failed for %s", className);
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
return JNI_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int registerNatives(JNIEnv* env)
|
||||||
|
{
|
||||||
|
if (!registerNativeMethods(env,
|
||||||
|
HTTPClient::classPathName,
|
||||||
|
HTTPClient::methods,
|
||||||
|
HTTPClient::methods_size)) {
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!registerNativeMethods(env,
|
||||||
|
SmsBuffer::classPathName,
|
||||||
|
SmsBuffer::methods,
|
||||||
|
SmsBuffer::methods_size)) {
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JNI_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "NativeSMS library loading...");
|
||||||
|
JNIEnv* env;
|
||||||
|
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerNatives(env);
|
||||||
|
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "NativeSMS library loaded.");
|
||||||
|
return JNI_VERSION_1_6;
|
||||||
|
}
|
94
src/main/cpp/smsbuffer.cpp
Normal file
94
src/main/cpp/smsbuffer.cpp
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <android/log.h>
|
||||||
|
#include "smsbuffer.h"
|
||||||
|
|
||||||
|
#define LOG_TAG "SmsBuffer"
|
||||||
|
const char *SmsBuffer::classPathName = "fr/unix_experience/owncloud_sms/jni/SmsBuffer";
|
||||||
|
|
||||||
|
// See https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html
|
||||||
|
JNINativeMethod SmsBuffer::methods[] =
|
||||||
|
{
|
||||||
|
DECL_JNIMETHOD(createNativeObject, "()J")
|
||||||
|
DECL_JNIMETHOD(deleteNativeObject, "(J)V")
|
||||||
|
DECL_JNIMETHOD(push, "(JI)V")
|
||||||
|
DECL_JNIMETHOD(print, "(J)V")
|
||||||
|
};
|
||||||
|
DECL_METHODSIZE(SmsBuffer)
|
||||||
|
|
||||||
|
jlong SmsBuffer::createNativeObject(JNIEnv *env, jobject self)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<jlong>(new SmsBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmsBuffer::deleteNativeObject(JNIEnv *env, jobject self, jlong ptr)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "deleteSmsBuffer");
|
||||||
|
delete reinterpret_cast<SmsBuffer *>(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
SmsBuffer::SmsBuffer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmsBuffer::reset_buffer()
|
||||||
|
{
|
||||||
|
m_buffer.clear();
|
||||||
|
m_buffer_empty = true;
|
||||||
|
}
|
||||||
|
void SmsBuffer::push(JNIEnv *env, jobject self, jlong ptr, jint mailbox_id)
|
||||||
|
{
|
||||||
|
SmsBuffer *me = reinterpret_cast<SmsBuffer *>(ptr);
|
||||||
|
if (!me) {
|
||||||
|
__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
me->_push(mailbox_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmsBuffer::_push(int mailbox_id)
|
||||||
|
{
|
||||||
|
// If buffer is not empty, we are joining messages
|
||||||
|
if (!m_buffer_empty) {
|
||||||
|
m_buffer << ",";
|
||||||
|
}
|
||||||
|
// Else, we are starting array
|
||||||
|
else {
|
||||||
|
m_buffer << "[";
|
||||||
|
m_buffer_empty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_buffer << "{\"mbox\": " << mailbox_id << "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmsBuffer::print(JNIEnv *env, jobject self, jlong ptr)
|
||||||
|
{
|
||||||
|
SmsBuffer *me = reinterpret_cast<SmsBuffer *>(ptr);
|
||||||
|
if (!me) {
|
||||||
|
__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
me->_print();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmsBuffer::_print()
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "SmsBuffer content: '%s'", m_buffer.str().c_str());
|
||||||
|
}
|
44
src/main/cpp/smsbuffer.h
Normal file
44
src/main/cpp/smsbuffer.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
#include <sstream>
|
||||||
|
#include "macro_helpers.h"
|
||||||
|
|
||||||
|
class SmsBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SmsBuffer();
|
||||||
|
|
||||||
|
JNIEXPORT static jlong JNICALL createNativeObject(JNIEnv *env, jobject self);
|
||||||
|
JNIEXPORT static void JNICALL deleteNativeObject(JNIEnv *env, jobject self, jlong ptr);
|
||||||
|
|
||||||
|
JNIEXPORT static void JNICALL push(JNIEnv *env, jobject self, jlong ptr, jint mailbox_id);
|
||||||
|
void _push(int mailbox_id);
|
||||||
|
|
||||||
|
JNIEXPORT static void JNICALL print(JNIEnv *env, jobject self, jlong ptr);
|
||||||
|
void _print();
|
||||||
|
|
||||||
|
DECL_JNICLASSATTRS
|
||||||
|
|
||||||
|
private:
|
||||||
|
void reset_buffer();
|
||||||
|
std::stringstream m_buffer;
|
||||||
|
bool m_buffer_empty{true};
|
||||||
|
};
|
@ -1,7 +1,7 @@
|
|||||||
package fr.unix_experience.owncloud_sms.activities;
|
package fr.unix_experience.owncloud_sms.activities;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014-2015, Loic Blot <loic.blot@unix-experience.fr>
|
* Copyright (c) 2014-2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -26,6 +26,7 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import fr.unix_experience.owncloud_sms.enums.MailboxID;
|
import fr.unix_experience.owncloud_sms.enums.MailboxID;
|
||||||
|
import fr.unix_experience.owncloud_sms.jni.SmsBuffer;
|
||||||
import fr.unix_experience.owncloud_sms.providers.SmsDataProvider;
|
import fr.unix_experience.owncloud_sms.providers.SmsDataProvider;
|
||||||
|
|
||||||
public class AndroidSmsFetcher {
|
public class AndroidSmsFetcher {
|
||||||
@ -56,6 +57,9 @@ public class AndroidSmsFetcher {
|
|||||||
// Mailbox ID is required by server
|
// Mailbox ID is required by server
|
||||||
entry.put("mbox", mbID.ordinal());
|
entry.put("mbox", mbID.ordinal());
|
||||||
result.put(entry);
|
result.put(entry);
|
||||||
|
SmsBuffer buf = new SmsBuffer();
|
||||||
|
buf.push(mbID.ordinal());
|
||||||
|
buf.print();
|
||||||
|
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
Log.e(AndroidSmsFetcher.TAG, "JSON Exception when reading SMS Mailbox", e);
|
Log.e(AndroidSmsFetcher.TAG, "JSON Exception when reading SMS Mailbox", e);
|
||||||
|
@ -27,24 +27,32 @@ import org.apache.commons.httpclient.HttpClient;
|
|||||||
import org.apache.commons.httpclient.HttpMethod;
|
import org.apache.commons.httpclient.HttpMethod;
|
||||||
import org.apache.commons.httpclient.HttpStatus;
|
import org.apache.commons.httpclient.HttpStatus;
|
||||||
import org.apache.commons.httpclient.HttpVersion;
|
import org.apache.commons.httpclient.HttpVersion;
|
||||||
|
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
|
||||||
import org.apache.commons.httpclient.URI;
|
import org.apache.commons.httpclient.URI;
|
||||||
import org.apache.commons.httpclient.URIException;
|
import org.apache.commons.httpclient.URIException;
|
||||||
import org.apache.commons.httpclient.cookie.CookiePolicy;
|
|
||||||
import org.apache.commons.httpclient.params.HttpClientParams;
|
|
||||||
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
|
|
||||||
import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
|
import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
|
||||||
|
import org.apache.commons.httpclient.cookie.CookiePolicy;
|
||||||
import org.apache.commons.httpclient.methods.GetMethod;
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
import org.apache.commons.httpclient.methods.PostMethod;
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
||||||
|
import org.apache.commons.httpclient.params.HttpClientParams;
|
||||||
|
import org.apache.commons.httpclient.params.HttpMethodParams;
|
||||||
import org.apache.commons.httpclient.protocol.Protocol;
|
import org.apache.commons.httpclient.protocol.Protocol;
|
||||||
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
|
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
|
||||||
import org.apache.commons.httpclient.params.HttpMethodParams;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import fr.unix_experience.owncloud_sms.providers.AndroidVersionProvider;
|
import fr.unix_experience.owncloud_sms.providers.AndroidVersionProvider;
|
||||||
|
|
||||||
public class OCHttpClient extends HttpClient {
|
public class OCHttpClient extends HttpClient {
|
||||||
|
static {
|
||||||
|
System.loadLibrary("nativesms");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static native String getAllSmsIdsCall();
|
||||||
|
public static native String getLastMsgTimestamp();
|
||||||
|
public static native String getPushRoute();
|
||||||
|
public static native String getVersionCall();
|
||||||
|
|
||||||
private static final String TAG = OCHttpClient.class.getCanonicalName();
|
private static final String TAG = OCHttpClient.class.getCanonicalName();
|
||||||
private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version";
|
private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version";
|
||||||
@ -52,12 +60,6 @@ public class OCHttpClient extends HttpClient {
|
|||||||
private final String _username;
|
private final String _username;
|
||||||
private final String _password;
|
private final String _password;
|
||||||
|
|
||||||
// API v1 calls
|
|
||||||
private static final String OC_GET_VERSION = "/index.php/apps/ocsms/get/apiversion?format=json";
|
|
||||||
private static final String OC_GET_ALL_SMS_IDS = "/index.php/apps/ocsms/get/smsidlist?format=json";
|
|
||||||
private static final String OC_GET_LAST_MSG_TIMESTAMP = "/index.php/apps/ocsms/get/lastmsgtime?format=json";
|
|
||||||
private static final String OC_PUSH_ROUTE = "/index.php/apps/ocsms/push?format=json";
|
|
||||||
|
|
||||||
// API v2 calls
|
// API v2 calls
|
||||||
private static final String OC_V2_GET_PHONELIST = "/index.php/apps/ocsms/api/v2/phones/list?format=json";
|
private static final String OC_V2_GET_PHONELIST = "/index.php/apps/ocsms/api/v2/phones/list?format=json";
|
||||||
private static final String OC_V2_GET_MESSAGES ="/index.php/apps/ocsms/api/v2/messages/[START]/[LIMIT]?format=json";
|
private static final String OC_V2_GET_MESSAGES ="/index.php/apps/ocsms/api/v2/messages/[START]/[LIMIT]?format=json";
|
||||||
@ -72,7 +74,7 @@ public class OCHttpClient extends HttpClient {
|
|||||||
_username = accountName;
|
_username = accountName;
|
||||||
_password = accountPassword;
|
_password = accountPassword;
|
||||||
getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true);
|
getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true);
|
||||||
getParams().setParameter(PARAM_PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
|
getParams().setParameter(OCHttpClient.PARAM_PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
|
||||||
getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
|
getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
|
||||||
getParams().setParameter(HttpMethodParams.USER_AGENT,
|
getParams().setParameter(HttpMethodParams.USER_AGENT,
|
||||||
"nextcloud-phonesync (" + new AndroidVersionProvider(context).getVersionCode() + ")");
|
"nextcloud-phonesync (" + new AndroidVersionProvider(context).getVersionCode() + ")");
|
||||||
@ -84,15 +86,15 @@ public class OCHttpClient extends HttpClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetMethod getAllSmsIds() {
|
GetMethod getAllSmsIds() {
|
||||||
return get(OCHttpClient.OC_GET_ALL_SMS_IDS);
|
return get(OCHttpClient.getAllSmsIdsCall());
|
||||||
}
|
}
|
||||||
|
|
||||||
public GetMethod getVersion() {
|
public GetMethod getVersion() {
|
||||||
return get(OCHttpClient.OC_GET_VERSION);
|
return get(OCHttpClient.getVersionCall());
|
||||||
}
|
}
|
||||||
|
|
||||||
PostMethod pushSms(StringRequestEntity ent) {
|
PostMethod pushSms(StringRequestEntity ent) {
|
||||||
PostMethod post = new PostMethod(_serverURI.toString() + OCHttpClient.OC_PUSH_ROUTE);
|
PostMethod post = new PostMethod(_serverURI.toString() + OCHttpClient.getPushRoute());
|
||||||
post.setRequestEntity(ent);
|
post.setRequestEntity(ent);
|
||||||
return post;
|
return post;
|
||||||
}
|
}
|
||||||
@ -109,24 +111,24 @@ public class OCHttpClient extends HttpClient {
|
|||||||
private int followRedirections(HttpMethod httpMethod) throws IOException {
|
private int followRedirections(HttpMethod httpMethod) throws IOException {
|
||||||
int redirectionsCount = 0;
|
int redirectionsCount = 0;
|
||||||
int status = httpMethod.getStatusCode();
|
int status = httpMethod.getStatusCode();
|
||||||
while (redirectionsCount < 3 &&
|
while ((redirectionsCount < 3) &&
|
||||||
(status == HttpStatus.SC_MOVED_PERMANENTLY ||
|
((status == HttpStatus.SC_MOVED_PERMANENTLY) ||
|
||||||
status == HttpStatus.SC_MOVED_TEMPORARILY ||
|
(status == HttpStatus.SC_MOVED_TEMPORARILY) ||
|
||||||
status == HttpStatus.SC_TEMPORARY_REDIRECT)
|
(status == HttpStatus.SC_TEMPORARY_REDIRECT))
|
||||||
) {
|
) {
|
||||||
Header location = httpMethod.getResponseHeader("Location");
|
Header location = httpMethod.getResponseHeader("Location");
|
||||||
if (location == null) {
|
if (location == null) {
|
||||||
location = httpMethod.getResponseHeader("location");
|
location = httpMethod.getResponseHeader("location");
|
||||||
}
|
}
|
||||||
if (location == null) {
|
if (location == null) {
|
||||||
Log.e(TAG, "No valid location header found when redirecting.");
|
Log.e(OCHttpClient.TAG, "No valid location header found when redirecting.");
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
httpMethod.setURI(new URI(location.getValue()));
|
httpMethod.setURI(new URI(location.getValue()));
|
||||||
} catch (URIException e) {
|
} catch (URIException e) {
|
||||||
Log.e(TAG, "Invalid URI in 302 FOUND response");
|
Log.e(OCHttpClient.TAG, "Invalid URI in 302 FOUND response");
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,10 +136,10 @@ public class OCHttpClient extends HttpClient {
|
|||||||
redirectionsCount++;
|
redirectionsCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (redirectionsCount >= 3 && status == HttpStatus.SC_MOVED_PERMANENTLY ||
|
if (((redirectionsCount >= 3) && (status == HttpStatus.SC_MOVED_PERMANENTLY)) ||
|
||||||
status == HttpStatus.SC_MOVED_TEMPORARILY ||
|
(status == HttpStatus.SC_MOVED_TEMPORARILY) ||
|
||||||
status == HttpStatus.SC_TEMPORARY_REDIRECT) {
|
(status == HttpStatus.SC_TEMPORARY_REDIRECT)) {
|
||||||
Log.e(TAG, "Too many redirection done. Aborting, please ensure your server is " +
|
Log.e(OCHttpClient.TAG, "Too many redirection done. Aborting, please ensure your server is " +
|
||||||
"correctly configured");
|
"correctly configured");
|
||||||
return 400;
|
return 400;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package fr.unix_experience.owncloud_sms.jni;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2014-2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SmsBuffer {
|
||||||
|
static {
|
||||||
|
System.loadLibrary("nativesms");
|
||||||
|
}
|
||||||
|
|
||||||
|
private long mHandle;
|
||||||
|
|
||||||
|
public SmsBuffer() {
|
||||||
|
mHandle = SmsBuffer.createNativeObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
SmsBuffer.deleteNativeObject(mHandle);
|
||||||
|
mHandle = 0;
|
||||||
|
super.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static native long createNativeObject();
|
||||||
|
private static native void deleteNativeObject(long handle);
|
||||||
|
|
||||||
|
public static native void push(long handle, int mbid);
|
||||||
|
public void push(int mbid) {
|
||||||
|
SmsBuffer.push(mHandle, mbid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static native void print(long handle);
|
||||||
|
public void print() {
|
||||||
|
SmsBuffer.print(mHandle);
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,22 @@
|
|||||||
package fr.unix_experience.owncloud_sms.notifications;
|
package fr.unix_experience.owncloud_sms.notifications;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2017, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user