Bug 748391 - Implement markMessageRead on the Android backend. r=snorp

This commit is contained in:
Reuben Morais 2015-10-13 01:08:51 -03:00
parent 271ba69909
commit 0ea536d19d
11 changed files with 198 additions and 2 deletions

View File

@ -98,7 +98,14 @@ MobileMessageDatabaseService::MarkMessageRead(int32_t aMessageId,
bool aSendReadReport,
nsIMobileMessageCallback* aRequest)
{
// TODO: This would need to be implemented as part of Bug 748391
if (!AndroidBridge::Bridge()) {
return NS_OK;
}
AndroidBridge::Bridge()->MarkMessageRead(aMessageId,
aValue,
aSendReadReport,
aRequest);
return NS_OK;
}

View File

@ -393,5 +393,36 @@ SmsManager::NotifyCursorDone(int32_t aRequestId)
NS_DispatchToMainThread(runnable);
}
} // namespace
/*static*/
void
SmsManager::NotifySmsMarkedAsRead(bool aMarkedAsRead, int32_t aRequestId)
{
nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction([=]() {
nsCOMPtr<nsIMobileMessageCallback> request =
AndroidBridge::Bridge()->DequeueSmsRequest(aRequestId);
if (!request) {
return;
}
request->NotifyMessageMarkedRead(aMarkedAsRead);
});
NS_DispatchToMainThread(runnable);
}
/*static*/
void
SmsManager::NotifySmsMarkAsReadFailed(int32_t aError, int32_t aRequestId)
{
nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction([=]() {
nsCOMPtr<nsIMobileMessageCallback> request =
AndroidBridge::Bridge()->DequeueSmsRequest(aRequestId);
if (!request) {
return;
}
request->NotifyMarkMessageReadFailed(aError);
});
NS_DispatchToMainThread(runnable);
}
} // namespace

View File

@ -66,6 +66,8 @@ public:
bool aRead,
int32_t aRequestId);
static void NotifyCursorDone(int32_t aRequestId);
static void NotifySmsMarkedAsRead(bool aMarkedAsRead, int32_t aRequestId);
static void NotifySmsMarkAsReadFailed(int32_t aError, int32_t aRequestId);
};
} // namespace

View File

@ -2361,6 +2361,15 @@ public class GeckoAppShell
SmsManager.getInstance().deleteMessage(aMessageId, aRequestId);
}
@WrapForJNI
public static void markMessageRead(int aMessageId, boolean aValue, boolean aSendReadReport, int aRequestId) {
if (!SmsManager.isEnabled()) {
return;
}
SmsManager.getInstance().markMessageRead(aMessageId, aValue, aSendReadReport, aRequestId);
}
@WrapForJNI(stubName = "CreateMessageCursorWrapper")
public static void createMessageCursor(long aStartDate, long aEndDate, String[] aNumbers, int aNumbersCount, String aDelivery, boolean aHasRead, boolean aRead, boolean aHasThreadId, long aThreadId, boolean aReverse, int aRequestId) {
if (!SmsManager.isEnabled()) {

View File

@ -762,6 +762,48 @@ public class GeckoSmsManager
aRequestId);
}
@Override
public void markMessageRead(int aMessageId, boolean aValue, boolean aSendReadReport, int aRequestId) {
class MarkMessageReadRunnable implements Runnable {
private final int mMessageId;
private final boolean mValue;
private final int mRequestId;
MarkMessageReadRunnable(int aMessageId, boolean aValue, int aRequestId) {
mMessageId = aMessageId;
mValue = aValue;
mRequestId = aRequestId;
}
@Override
public void run() {
try {
ContentResolver cr = GeckoAppShell.getContext().getContentResolver();
Uri message = ContentUris.withAppendedId(kSmsContentUri, mMessageId);
ContentValues updatedProps = new ContentValues();
updatedProps.put("read", mValue);
int count = cr.update(message, updatedProps, null, null);
notifySmsMarkedAsRead(count == 1, mRequestId);
} catch (Exception e) {
Log.e("GeckoSmsManager", "Error while trying to mark message as read: " + e);
notifySmsMarkAsReadFailed(kUnknownError, mRequestId);
}
}
}
if (aSendReadReport == true) {
Log.w("GeckoSmsManager", "Android SmsManager doesn't suport read receipts for SMS.");
}
if (!SmsIOThread.getInstance().execute(new MarkMessageReadRunnable(aMessageId, aValue, aRequestId))) {
Log.e("GeckoSmsManager", "Failed to add MarkMessageReadRunnable to the SmsIOThread");
notifySmsMarkAsReadFailed(kUnknownError, aRequestId);
}
}
@Override
public void createMessageCursor(long aStartDate, long aEndDate, String[] aNumbers, int aNumbersCount, String aDelivery, boolean aHasRead, boolean aRead, boolean aHasThreadId, long aThreadId, boolean aReverse, int aRequestId) {
class CreateMessageCursorRunnable implements Runnable {
@ -1101,6 +1143,10 @@ public class GeckoSmsManager
@WrapForJNI
private static native void notifySmsDeleteFailed(int aError, int aRequestId);
@WrapForJNI
private static native void notifySmsMarkedAsRead(boolean aMarkedAsRead, int aRequestId);
@WrapForJNI
private static native void notifySmsMarkAsReadFailed(int aError, int aRequestId);
@WrapForJNI
private static native void notifyCursorError(int aError, int aRequestId);
@WrapForJNI
private static native void notifyThreadCursorResult(long aId, String aLastMessageSubject, String aBody, long aUnreadCount, Object[] aParticipants, long aTimestamp, String aLastMessageType, int aRequestId);

View File

@ -31,6 +31,7 @@ public class SmsManager {
void send(String aNumber, String aMessage, int aRequestId);
void getMessage(int aMessageId, int aRequestId);
void deleteMessage(int aMessageId, int aRequestId);
void markMessageRead(int aMessageId, boolean aValue, boolean aSendReadReport, int aRequestId);
void createMessageCursor(long aStartDate, long aEndDate, String[] aNumbers, int aNumbersCount, String aDelivery, boolean aHasRead, boolean aRead, boolean aHasThreadId, long aThreadId, boolean aReverse, int aRequestId);
void createThreadCursor(int aRequestId);
void getNextThread(int aRequestId);

View File

@ -1101,6 +1101,25 @@ AndroidBridge::DeleteMessage(int32_t aMessageId, nsIMobileMessageCallback* aRequ
GeckoAppShell::DeleteMessageWrapper(aMessageId, requestId);
}
void
AndroidBridge::MarkMessageRead(int32_t aMessageId,
bool aValue,
bool aSendReadReport,
nsIMobileMessageCallback* aRequest)
{
ALOG_BRIDGE("AndroidBridge::MarkMessageRead");
uint32_t requestId;
if (!QueueSmsRequest(aRequest, &requestId)) {
return;
}
GeckoAppShell::MarkMessageRead(aMessageId,
aValue,
aSendReadReport,
requestId);
}
NS_IMPL_ISUPPORTS0(MessageCursorContinueCallback)
NS_IMETHODIMP

View File

@ -270,6 +270,10 @@ public:
nsIMobileMessageCallback* aRequest);
void GetMessage(int32_t aMessageId, nsIMobileMessageCallback* aRequest);
void DeleteMessage(int32_t aMessageId, nsIMobileMessageCallback* aRequest);
void MarkMessageRead(int32_t aMessageId,
bool aValue,
bool aSendReadReport,
nsIMobileMessageCallback* aRequest);
already_AddRefed<nsICursorContinueCallback>
CreateMessageCursor(bool aHasStartDate,
uint64_t aStartDate,

View File

@ -104,6 +104,14 @@ public:
mozilla::jni::NativeStub<GeckoSmsManager::NotifySmsDelivery_t, Impl>
::template Wrap<&Impl::NotifySmsDelivery>),
mozilla::jni::MakeNativeMethod<GeckoSmsManager::NotifySmsMarkAsReadFailed_t>(
mozilla::jni::NativeStub<GeckoSmsManager::NotifySmsMarkAsReadFailed_t, Impl>
::template Wrap<&Impl::NotifySmsMarkAsReadFailed>),
mozilla::jni::MakeNativeMethod<GeckoSmsManager::NotifySmsMarkedAsRead_t>(
mozilla::jni::NativeStub<GeckoSmsManager::NotifySmsMarkedAsRead_t, Impl>
::template Wrap<&Impl::NotifySmsMarkedAsRead>),
mozilla::jni::MakeNativeMethod<GeckoSmsManager::NotifySmsReceived_t>(
mozilla::jni::NativeStub<GeckoSmsManager::NotifySmsReceived_t, Impl>
::template Wrap<&Impl::NotifySmsReceived>),

View File

@ -518,6 +518,14 @@ auto GeckoAppShell::LockScreenOrientation(int32_t a0) -> void
return mozilla::jni::Method<LockScreenOrientation_t>::Call(nullptr, nullptr, a0);
}
constexpr char GeckoAppShell::MarkMessageRead_t::name[];
constexpr char GeckoAppShell::MarkMessageRead_t::signature[];
auto GeckoAppShell::MarkMessageRead(int32_t a0, bool a1, bool a2, int32_t a3) -> void
{
return mozilla::jni::Method<MarkMessageRead_t>::Call(nullptr, nullptr, a0, a1, a2, a3);
}
constexpr char GeckoAppShell::MarkURIVisited_t::name[];
constexpr char GeckoAppShell::MarkURIVisited_t::signature[];
@ -857,6 +865,12 @@ constexpr char GeckoSmsManager::NotifySmsDeleted_t::signature[];
constexpr char GeckoSmsManager::NotifySmsDelivery_t::name[];
constexpr char GeckoSmsManager::NotifySmsDelivery_t::signature[];
constexpr char GeckoSmsManager::NotifySmsMarkAsReadFailed_t::name[];
constexpr char GeckoSmsManager::NotifySmsMarkAsReadFailed_t::signature[];
constexpr char GeckoSmsManager::NotifySmsMarkedAsRead_t::name[];
constexpr char GeckoSmsManager::NotifySmsMarkedAsRead_t::signature[];
constexpr char GeckoSmsManager::NotifySmsReceived_t::name[];
constexpr char GeckoSmsManager::NotifySmsReceived_t::signature[];

View File

@ -1243,6 +1243,27 @@ public:
static auto LockScreenOrientation(int32_t) -> void;
public:
struct MarkMessageRead_t {
typedef GeckoAppShell Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
bool,
bool,
int32_t> Args;
static constexpr char name[] = "markMessageRead";
static constexpr char signature[] =
"(IZZI)V";
static const bool isStatic = true;
static const bool isMultithreaded = false;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
};
static auto MarkMessageRead(int32_t, bool, bool, int32_t) -> void;
public:
struct MarkURIVisited_t {
typedef GeckoAppShell Owner;
@ -2181,6 +2202,40 @@ public:
mozilla::jni::ExceptionMode::ABORT;
};
public:
struct NotifySmsMarkAsReadFailed_t {
typedef GeckoSmsManager Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
int32_t> Args;
static constexpr char name[] = "notifySmsMarkAsReadFailed";
static constexpr char signature[] =
"(II)V";
static const bool isStatic = true;
static const bool isMultithreaded = false;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
};
public:
struct NotifySmsMarkedAsRead_t {
typedef GeckoSmsManager Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
bool,
int32_t> Args;
static constexpr char name[] = "notifySmsMarkedAsRead";
static constexpr char signature[] =
"(ZI)V";
static const bool isStatic = true;
static const bool isMultithreaded = false;
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
};
public:
struct NotifySmsReceived_t {
typedef GeckoSmsManager Owner;