diff --git a/.travis.yml b/.travis.yml index b375e74..62db2d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,3 +23,9 @@ android: - 'google-gdk-license-.+' - 'android-sdk-preview-license-.+' - '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" \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0250097 --- /dev/null +++ b/CMakeLists.txt @@ -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}) \ No newline at end of file diff --git a/build.gradle b/build.gradle index cc59c08..72b4c55 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,17 @@ android { minSdkVersion 16 targetSdkVersion 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 { @@ -36,6 +47,11 @@ android { packagingOptions { exclude 'META-INF/LICENSE.txt' } + externalNativeBuild { + cmake { + path 'CMakeLists.txt' + } + } } repositories { diff --git a/src/main/cpp/httpclient.cpp b/src/main/cpp/httpclient.cpp new file mode 100644 index 0000000..0adb535 --- /dev/null +++ b/src/main/cpp/httpclient.cpp @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2017, Loic Blot + * + * 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 . + */ + +#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); +} diff --git a/src/main/cpp/httpclient.h b/src/main/cpp/httpclient.h new file mode 100644 index 0000000..3bd0d50 --- /dev/null +++ b/src/main/cpp/httpclient.h @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2017, Loic Blot + * + * 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 . + */ + +#pragma once + +#include +#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 +}; + + diff --git a/src/main/cpp/macro_helpers.h b/src/main/cpp/macro_helpers.h new file mode 100644 index 0000000..be6871a --- /dev/null +++ b/src/main/cpp/macro_helpers.h @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2017, Loic Blot + * + * 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 . + */ + +#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; \ No newline at end of file diff --git a/src/main/cpp/nativesms.cpp b/src/main/cpp/nativesms.cpp new file mode 100644 index 0000000..1f84a56 --- /dev/null +++ b/src/main/cpp/nativesms.cpp @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2014-2017, Loic Blot + * + * 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 . + */ + +#include +#include +#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(&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; +} diff --git a/src/main/cpp/smsbuffer.cpp b/src/main/cpp/smsbuffer.cpp new file mode 100644 index 0000000..431906c --- /dev/null +++ b/src/main/cpp/smsbuffer.cpp @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2017, Loic Blot + * + * 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 . + */ + +#include +#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(new SmsBuffer()); +} + +void SmsBuffer::deleteNativeObject(JNIEnv *env, jobject self, jlong ptr) +{ + __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "deleteSmsBuffer"); + delete reinterpret_cast(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(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(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()); +} \ No newline at end of file diff --git a/src/main/cpp/smsbuffer.h b/src/main/cpp/smsbuffer.h new file mode 100644 index 0000000..9f0a61f --- /dev/null +++ b/src/main/cpp/smsbuffer.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2017, Loic Blot + * + * 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 . + */ + +#pragma once + +#include +#include +#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}; +}; \ No newline at end of file diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java index b99811e..83597ec 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java @@ -1,7 +1,7 @@ package fr.unix_experience.owncloud_sms.activities; /* - * Copyright (c) 2014-2015, Loic Blot + * Copyright (c) 2014-2017, Loic Blot * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as diff --git a/src/main/java/fr/unix_experience/owncloud_sms/engine/AndroidSmsFetcher.java b/src/main/java/fr/unix_experience/owncloud_sms/engine/AndroidSmsFetcher.java index d8b196d..35532f5 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/engine/AndroidSmsFetcher.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/engine/AndroidSmsFetcher.java @@ -26,6 +26,7 @@ import org.json.JSONException; import org.json.JSONObject; import fr.unix_experience.owncloud_sms.enums.MailboxID; +import fr.unix_experience.owncloud_sms.jni.SmsBuffer; import fr.unix_experience.owncloud_sms.providers.SmsDataProvider; public class AndroidSmsFetcher { @@ -56,6 +57,9 @@ public class AndroidSmsFetcher { // Mailbox ID is required by server entry.put("mbox", mbID.ordinal()); result.put(entry); + SmsBuffer buf = new SmsBuffer(); + buf.push(mbID.ordinal()); + buf.print(); } catch (JSONException e) { Log.e(AndroidSmsFetcher.TAG, "JSON Exception when reading SMS Mailbox", e); diff --git a/src/main/java/fr/unix_experience/owncloud_sms/engine/OCHttpClient.java b/src/main/java/fr/unix_experience/owncloud_sms/engine/OCHttpClient.java index 4246df7..2e368ce 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/engine/OCHttpClient.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/engine/OCHttpClient.java @@ -27,24 +27,32 @@ import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpVersion; +import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.URI; 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.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; 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.ProtocolSocketFactory; -import org.apache.commons.httpclient.params.HttpMethodParams; import java.io.IOException; import fr.unix_experience.owncloud_sms.providers.AndroidVersionProvider; 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 PARAM_PROTOCOL_VERSION = "http.protocol.version"; @@ -52,12 +60,6 @@ public class OCHttpClient extends HttpClient { private final String _username; 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 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"; @@ -72,7 +74,7 @@ public class OCHttpClient extends HttpClient { _username = accountName; _password = accountPassword; 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().setParameter(HttpMethodParams.USER_AGENT, "nextcloud-phonesync (" + new AndroidVersionProvider(context).getVersionCode() + ")"); @@ -84,15 +86,15 @@ public class OCHttpClient extends HttpClient { } GetMethod getAllSmsIds() { - return get(OCHttpClient.OC_GET_ALL_SMS_IDS); + return get(OCHttpClient.getAllSmsIdsCall()); } public GetMethod getVersion() { - return get(OCHttpClient.OC_GET_VERSION); + return get(OCHttpClient.getVersionCall()); } 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); return post; } @@ -109,24 +111,24 @@ public class OCHttpClient extends HttpClient { private int followRedirections(HttpMethod httpMethod) throws IOException { int redirectionsCount = 0; int status = httpMethod.getStatusCode(); - while (redirectionsCount < 3 && - (status == HttpStatus.SC_MOVED_PERMANENTLY || - status == HttpStatus.SC_MOVED_TEMPORARILY || - status == HttpStatus.SC_TEMPORARY_REDIRECT) + while ((redirectionsCount < 3) && + ((status == HttpStatus.SC_MOVED_PERMANENTLY) || + (status == HttpStatus.SC_MOVED_TEMPORARILY) || + (status == HttpStatus.SC_TEMPORARY_REDIRECT)) ) { Header location = httpMethod.getResponseHeader("Location"); if (location == null) { location = httpMethod.getResponseHeader("location"); } 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; } try { httpMethod.setURI(new URI(location.getValue())); } catch (URIException e) { - Log.e(TAG, "Invalid URI in 302 FOUND response"); + Log.e(OCHttpClient.TAG, "Invalid URI in 302 FOUND response"); return 500; } @@ -134,10 +136,10 @@ public class OCHttpClient extends HttpClient { redirectionsCount++; } - if (redirectionsCount >= 3 && status == HttpStatus.SC_MOVED_PERMANENTLY || - status == HttpStatus.SC_MOVED_TEMPORARILY || - status == HttpStatus.SC_TEMPORARY_REDIRECT) { - Log.e(TAG, "Too many redirection done. Aborting, please ensure your server is " + + if (((redirectionsCount >= 3) && (status == HttpStatus.SC_MOVED_PERMANENTLY)) || + (status == HttpStatus.SC_MOVED_TEMPORARILY) || + (status == HttpStatus.SC_TEMPORARY_REDIRECT)) { + Log.e(OCHttpClient.TAG, "Too many redirection done. Aborting, please ensure your server is " + "correctly configured"); return 400; } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java b/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java new file mode 100644 index 0000000..86a00ec --- /dev/null +++ b/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java @@ -0,0 +1,49 @@ +package fr.unix_experience.owncloud_sms.jni; + +/** + * Copyright (c) 2014-2017, Loic Blot + * + * 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 . + */ + +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); + } +} diff --git a/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java b/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java index 0df1878..40141c5 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java @@ -1,5 +1,22 @@ package fr.unix_experience.owncloud_sms.notifications; +/* + * Copyright (c) 2014-2017, Loic Blot + * + * 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 . + */ + import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationManager;