UI_NOTIFICATION_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
UI_NOTIFICATION_ERROR_DB_FAILED = TIZEN_ERROR_APPLICATION_CLASS | 0x31, /**< DB operation failed */
UI_NOTIFICATION_ERROR_NO_SUCH_FILE = TIZEN_ERROR_NO_SUCH_FILE, /**< No such file */
- UI_NOTIFICATION_ERROR_ALREADY_POSTED = TIZEN_ERROR_ALREADY_IN_PROGRESS, /**< Notification is already posted */
+ UI_NOTIFICATION_ERROR_INVALID_STATE = TIZEN_ERROR_APPLICATION_CLASS | 0x32, /**< Invalid state */
} ui_notification_error_e;
/**
UI_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE, /**< Percentage (between 0.0 and 1.0) */
} ui_notification_progress_type_e;
+/**
+* @brief Called to retrieve the notifications posted.
+* @remarks You should not free @a notification returned by this function.
+* @param[in] notification The notification handle
+* @param[in] user_data The user data passed from the foreach function
+* @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop.
+* @pre ui_notification_foreach_notification_posted() will invoke this callback.
+* @see ui_notification_foreach_notification_posted()
+* @see ui_notification_clone()
+*/
+typedef bool (*ui_notification_cb)(ui_notification_h notification, void *user_data);
+
/**
* @brief Creates a notification handle.
* @remarks The @a notification must be released with ui_notification_destroy() by you.
*/
int ui_notification_destroy(ui_notification_h notification);
+/**
+ * @brief Checks whether the notification is ongoing or not
+ * @param[in] notification The notification handle
+ * @param[out] ongoing A boolean value that sets whether this is an ongoing notification.
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #UI_NOTIFICATION_ERROR_NONE Successful
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see ui_notification_create()
+ */
+int ui_notification_is_ongoing(ui_notification_h notification, bool *ongoing);
+
/**
* @brief Sets the full path of the icon image to display in the notification.
- * @remarks The @path should be the absolute path. If the icon is not set, the icon of the application will be displayed. \n
- * This function should be called before posting (see ui_notification_post()).
+ * @remarks The @a path should be the absolute path. If the icon is not set, the icon of the application will be displayed. \n
+ * This function should be called before posting or updating the notification (see ui_notification_post(), ui_notification_update()).
* @param[in] notification The notification handle
- * @param[in] path The absolute path to the specified icon
+ * @param[in] path The absolute path to the specified icon \n
+ * If the @a path is NULL, it clears the previous value.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
* @see ui_notification_get_icon()
*/
int ui_notification_set_icon(ui_notification_h notification, const char *path);
/**
* @brief Sets the time that the notification occurred.
- * @remarks This function should be called before posting (see ui_notification_post()).
+ * @remarks This function should be called before posting or updating the notification (see ui_notification_post(), ui_notification_update()).
* @param[in] notification The notification handle
- * @param[in] time The time that the notification occurred
+ * @param[in] time The time that the notification occurred \n
+ * If the @a time is NULL, it clears the previous value.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
* @see ui_notification_get_time()
*/
int ui_notification_set_time(ui_notification_h notification, struct tm *time);
/**
* @brief Sets the title to display in the notification.
* @remarks If the title is not set, the name of the application will be displayed. \n
- * This function should be called before posting (see ui_notification_post()).
+ * This function should be called before posting or updating the notification (see ui_notification_post(), ui_notification_update()).
* @param[in] notification The notification handle
- * @param[in] title The title to display in the notification
+ * @param[in] title The title to display in the notification \n
+ * If the @a title is NULL, it clears the previous value.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
* @see ui_notification_get_title()
*/
int ui_notification_set_title(ui_notification_h notification, const char *title);
/**
* @brief Sets the content to display in the notification
- * @remarks This function should be called before posting (see ui_notification_post()).
+ * @remarks This function should be called before posting or updating the notification (see ui_notification_post(), ui_notification_update()).
* @param[in] notification The notification handle
- * @param[in] content The content to display in the notification
+ * @param[in] content The content to display in the notification \n
+ * If the @a content is NULL, it clears the previous value.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
* @see ui_notification_get_content()
*/
int ui_notification_set_content(ui_notification_h notification, const char *content);
* @details When the notification is selected from the notification tray, the application which is described by the specified service is launched. \n
* If you want to launch the current application, use the explicit launch of the @ref CAPI_SERVICE_MODULE API
* @remarks If the service is not set, the selected notification will be cleared from both the notification tray and the status bar without any action. \n
- * This function should be called before posting (see ui_notification_post()).
+ * This function should be called before posting or updating the notification (see ui_notification_post(), ui_notification_update()).
* @param[in] notification The notification handle
- * @param[in] service The service handle to launch when the notification is selected
+ * @param[in] service The service handle to launch when the notification is selected \n
+ * If the @a service is NULL, it clears the previous value.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
* @see ui_notification_get_service()
* @see service_create()
*/
/**
* @brief Posts the notification to display in the notification tray and the status bar
- * @remarks You cannot alter the icon, time, title, content, and service after posting the notification.
* @param[in] notification The notification handle
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #UI_NOTIFICATION_ERROR_DB_FAILED DB failed
* @retval #UI_NOTIFICATION_ERROR_NO_SUCH_FILE DB No such icon file
- * @retval #UI_NOTIFICATION_ERROR_ALREADY_POSTED Notification is already posted
- * @see ui_notification_remove()
- * @see ui_notification_remove_all()
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_STATE The notification was already posted
+ * @post The posted notification can be canceled or updated.
+ * @see ui_notification_cancel()
+ * @see ui_notification_cancel_all()
+ * @see ui_notification_update()
+ * @see ui_notification_update_progress()
+ * @see ui_notification_foreach_notification_posted()
*/
int ui_notification_post(ui_notification_h notification);
/**
* @brief Cancels the previously posted notification.
* @details The previously posted notification is removed from the notification tray and the status bar.
- * @remarks The canceled @a notification is not be released automatically, must be released with ui_notification_destroy() by you
+ * @remarks The canceled @a notification is not be released automatically, must be released with ui_notification_destroy() by you.
* @param[in] notification The notification handle
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_STATE The notification was not posted or the notification was either cleared or canceled.
+ * @pre The notification must be posted before canceling it.
* @see ui_notification_post()
* @see ui_notification_cancel_all()
*/
/**
* @brief Cancels all previously posted notifications by the current application.
* @details All previously posted notifications are removed from the notification tray and the status bar.
- * @remarks The notifications posted by other applications are not canceled from the notification tray and the status bar
+ * @remarks The notifications posted by other applications are not canceled from the notification tray and the status bar.
+ * @see ui_notification_post()
+ * @see ui_notification_cancel()
+ */
+void ui_notification_cancel_all(void);
+
+/**
+ * @brief Updates the notification posted.
+ * @remarks You cannot update the notification which was cleared or canceled.
+ * @param[in] notification The notification handle
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UI_NOTIFICATION_ERROR_DB_FAILED DB failed
+ * @retval #UI_NOTIFICATION_ERROR_NO_SUCH_FILE DB No such icon file
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_STATE The notification was not posted or the notification was either cleared or canceled.
+ * @pre The notification must be posted before updating it.
* @see ui_notification_post()
- * @see ui_notification_cancel()
+ * @see ui_notification_update_progress()
*/
-int ui_notification_cancel_all(void);
+int ui_notification_update(ui_notification_h notification);
/**
* @brief Updates the progress to the specified value
+ * @remarks You cannot update the notification which was cleared or canceled.
* @param[in] notification The notification handle \n
* It must be ongoing notification. \n
* If not, #UI_NOTIFICATION_ERROR_INVALID_PARAMETER will occur
* @param[in] type The progress type
* @param[in] value The value of the progress \n
- * if @a type is #UI_NOTIFICATION_PROGRESS_TYPE_SIZE, it must be in bytes. \n
- * If @a type is #UI_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE, It must be a floating-point value between 0.0 and 1.0.
+ * The @a value must be greater than or equal to zero. \n
+ * if @a type is #UI_NOTIFICATION_PROGRESS_TYPE_SIZE, it must be in bytes. \n
+ * If @a type is #UI_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE, It must be a floating-point value between 0.0 and 1.0.
* @return 0 on success, otherwise a negative error value.
* @retval #UI_NOTIFICATION_ERROR_NONE Successful
* @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_STATE The notification was not posted or the notification was canceled.
+ * @pre The notification must be posted before updating the progress to the specified value
* @see ui_notification_create()
+ * @see ui_notification_post()
+ * @see ui_notification_update()
* @see #ui_notification_progress_type_e
*/
int ui_notification_update_progress(ui_notification_h notification, ui_notification_progress_type_e type, double value);
+/**
+ * @brief Retrieves all posted notifications.
+ * @details This function calls ui_notification_cb() once for each notification which was posted and is being shown. \n
+ * If ui_notification_cb() callback function returns false, then iteration will be finished.
+ *
+ * @param [in] ongoing A boolean value that sets whether the type is an ongoing notification.
+ * @param [in] callback The iteration callback function
+ * @param [in] user_data The user data to be passed to the callback function
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #UI_NOTIFICATION_ERROR_NONE Successful
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @post This function invokes ui_notification_cb().
+ * @see ui_notification_cb()
+ */
+int ui_notification_foreach_notification_posted(bool ongoing, ui_notification_cb callback, void *user_data);
+
+/**
+ * @brief Creates and returns a copy of the given notification handle.
+ *
+ * @remarks A newly created notification handle should be destroyed by calling ui_notification_destroy() if it is no longer needed.
+ *
+ * @param [out] clone If successful, a newly created notification handle will be returned.
+ * @param [in] service The notification handle
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #UI_NOTIFICATION_ERROR_NONE Successful
+ * @retval #UI_NOTIFICATION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UI_NOTIFICATION_ERROR_OUT_OF_MEMORY Out of memory
+ * @see ui_notification_create()
+ * @see ui_notification_destroy()
+ */
+int ui_notification_clone(ui_notification_h *clone, ui_notification_h notification);
+
+
/**
* @}
*/
#include <dlog.h>
#include <notification.h>
-#include <app_service.h>
+#include <app.h>
#include <app_service_private.h>
-#include <app_ui_notification.h>
#ifdef LOG_TAG
#undef LOG_TAG
#define LOG_TAG "TIZEN_N_UI_NOTIFICATION"
struct ui_notification_s {
- notification_h core;
+ notification_h raw_handle;
bool ongoing;
bool posted;
+ bool removed;
char *icon;
struct tm *time;
char *title;
break;
case NOTIFICATION_ERROR_ALREADY_EXIST_ID:
- retcode = UI_NOTIFICATION_ERROR_ALREADY_POSTED;
- error_msg = "ALREADY_POSTED";
+ case NOTIFICATION_ERROR_NOT_EXIST_ID:
+ retcode = UI_NOTIFICATION_ERROR_INVALID_STATE;
+ error_msg = "INVALID_STATE";
break;
default:
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- notification_out = (ui_notification_h)malloc(sizeof(struct ui_notification_s));
+ notification_out = (ui_notification_h)calloc(1, sizeof(struct ui_notification_s));
if (notification_out == NULL)
{
LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
}
-
+
+ notification_out->raw_handle = NULL;
notification_out->ongoing = ongoing;
notification_out->posted = false;
+ notification_out->removed = false;
notification_out->icon = NULL;
notification_out->time = NULL;
notification_out->title = NULL;
return UI_NOTIFICATION_ERROR_NONE;
}
+static int ui_notification_construct(bool ongoing, notification_h raw_handle, ui_notification_h *notification)
+{
+ int retcode;
+ ui_notification_h notification_out;
+ char *icon;
+ time_t time;
+ char *title;
+ char *content;
+ bundle *service_data;
+
+ if (notification == NULL)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ notification_out = (ui_notification_h)calloc(1, sizeof(struct ui_notification_s));
+
+ if (notification_out == NULL)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
+
+ retcode = ui_notification_error_handler(notification_clone(raw_handle, &(notification_out->raw_handle)),\
+ __FUNCTION__, "failed to clone the notification handle");
+
+ if (retcode != NOTIFICATION_ERROR_NONE)
+ {
+ return retcode;
+ }
+
+ notification_out->ongoing = ongoing;
+
+ notification_out->posted = true;
+
+ notification_out->removed = false;
+
+ if (!notification_get_image(raw_handle, NOTIFICATION_IMAGE_TYPE_ICON, &icon))
+ {
+ notification_out->icon = icon;
+ }
+
+ if (!notification_get_time(raw_handle, &time))
+ {
+ notification_out->time = malloc(sizeof(struct tm));
+
+ if (notification_out->time == NULL)
+ {
+ ui_notification_destroy(notification_out);
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
+
+ localtime_r(&time, notification_out->time);
+ }
+
+ if (!notification_get_text(raw_handle, NOTIFICATION_TEXT_TYPE_TITLE, &title))
+ {
+ notification_out->title = title;
+ }
+
+ if (! notification_get_text(raw_handle, NOTIFICATION_TEXT_TYPE_CONTENT, &content))
+ {
+ notification_out->content = content;
+ }
+
+ if (!notification_get_execute_option(raw_handle, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, NULL, &service_data))
+ {
+ service_h service;
+
+ if (!service_create_request(service_data, &service))
+ {
+ notification_out->service = service;
+ }
+ }
+
+ *notification = notification_out;
+
+ return UI_NOTIFICATION_ERROR_NONE;
+}
+
int ui_notification_destroy(ui_notification_h notification)
{
if (notification == NULL)
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->core)
- notification_free(notification->core);
+ if (notification->raw_handle)
+ notification_free(notification->raw_handle);
if (notification->icon)
free(notification->icon);
return UI_NOTIFICATION_ERROR_NONE;
}
-
-int ui_notification_set_icon(ui_notification_h notification, const char *path)
+int ui_notification_clone(ui_notification_h *clone, ui_notification_h notification)
{
- char *path_dup;
+ ui_notification_h notification_out;
+ int retcode;
- if (notification == NULL || path == NULL)
+ if (clone == NULL || notification == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->posted == true)
+ notification_out = (ui_notification_h)calloc(1, sizeof(struct ui_notification_s));
+
+ if (notification->raw_handle != NULL)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
+ retcode = notification_clone(notification->raw_handle, &(notification_out->raw_handle));
+
+ if (retcode)
+ {
+ return ui_notification_error_handler(retcode, __FUNCTION__, "failed to clone the handle");
+ }
}
- path_dup = strdup(path);
+ notification_out->ongoing = notification->ongoing;
+
+ notification_out->posted = notification->posted;
+
+ notification_out->removed = notification->removed;
+
+ if (notification->icon)
+ {
+ notification_out->icon = strdup(notification->icon);
+ }
- if (path_dup == NULL)
+ if (notification->time)
{
- LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
- return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ notification_out->time = malloc(sizeof(struct tm));
+ if (notification_out->time != NULL)
+ {
+ memcpy(notification_out->time, notification->time, sizeof(struct tm));
+ }
+ }
+
+ if (notification->title)
+ {
+ notification_out->title = strdup(notification->title);
+ }
+
+ if (notification->content)
+ {
+ notification_out->content = strdup(notification->content);
+ }
+
+ if (notification->service)
+ {
+ service_clone(&(notification_out->service), notification->service);
+ }
+
+ *clone = notification_out;
+
+ return UI_NOTIFICATION_ERROR_NONE;
+}
+
+int ui_notification_is_ongoing(ui_notification_h notification, bool *ongoing)
+{
+ if (notification == NULL || ongoing == NULL)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ *ongoing = notification->ongoing;
+
+ return UI_NOTIFICATION_ERROR_NONE;
+}
+
+int ui_notification_set_icon(ui_notification_h notification, const char *path)
+{
+ char *path_dup = NULL;
+
+ if (notification == NULL)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ if (path != NULL)
+ {
+ path_dup = strdup(path);
+
+ if (path_dup == NULL)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
}
if (notification->icon != NULL)
int ui_notification_set_time(ui_notification_h notification, struct tm *time)
{
- struct tm *time_dup;
+ struct tm *time_dup = NULL;
- if (notification == NULL || time == NULL)
+ if (notification == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->posted == true)
+ if (time != NULL)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
- }
+ time_dup = malloc(sizeof(struct tm));
- time_dup = malloc(sizeof(struct tm));
+ if (time_dup == NULL)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
- if (time_dup == NULL)
- {
- LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
- return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ memcpy(time_dup, time, sizeof(struct tm));
}
- memcpy(time_dup, time, sizeof(struct tm));
-
if (notification->time != NULL)
{
free(notification->time);
int ui_notification_set_title(ui_notification_h notification, const char *title)
{
- char *title_dup;
+ char *title_dup = NULL;
- if (notification == NULL || title == NULL)
+ if (notification == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->posted == true)
+ if (title != NULL)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
- }
-
- title_dup = strdup(title);
+ title_dup = strdup(title);
- if (title_dup == NULL)
- {
- LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
- return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ if (title_dup == NULL)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
}
if (notification->title != NULL)
int ui_notification_set_content(ui_notification_h notification, const char *content)
{
- char *content_dup;
+ char *content_dup = NULL;
- if (notification == NULL || content == NULL)
+ if (notification == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->posted == true)
+ if (content != NULL)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
- }
+ content_dup = strdup(content);
- content_dup = strdup(content);
-
- if (content_dup == NULL)
- {
- LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
- return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ if (content_dup == NULL)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
}
if (notification->content != NULL)
int ui_notification_set_service(ui_notification_h notification, service_h service)
{
int retcode;
- service_h service_dup;
+ service_h service_dup = NULL;
- if (notification == NULL || service == NULL)
+ if (notification == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->posted == true)
+ if (service != NULL)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
- }
+ retcode = service_clone(&service_dup, service);
- retcode = service_clone(&service_dup, service);
-
- if (retcode != SERVICE_ERROR_NONE)
- {
- if (retcode == SERVICE_ERROR_OUT_OF_MEMORY)
- {
- LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
- return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
- }
- else
+ if (retcode != SERVICE_ERROR_NONE)
{
- LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid service handle", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
- return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ if (retcode == SERVICE_ERROR_OUT_OF_MEMORY)
+ {
+ LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
+ return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
+ else
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid service handle", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
}
}
return UI_NOTIFICATION_ERROR_NONE;
}
+static int ui_notification_build_attributes(ui_notification_h notification)
+{
+ bundle *service_data;
+
+ if (notification == NULL)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ if (notification->icon != NULL)
+ {
+ struct stat st;
+
+ if (stat(notification->icon, &st) < 0)
+ {
+ LOGE("[%s] NO_SUCH_FILE(0x%08x) : invalid icon", __FUNCTION__, UI_NOTIFICATION_ERROR_NO_SUCH_FILE);
+ return UI_NOTIFICATION_ERROR_NO_SUCH_FILE;
+ }
+
+ notification_set_image(notification->raw_handle, NOTIFICATION_IMAGE_TYPE_ICON, notification->icon);
+ }
+
+ if (notification->time != NULL)
+ {
+ notification_set_time(notification->raw_handle, mktime(notification->time));
+ }
+
+ if (notification->title != NULL)
+ {
+ notification_set_text(notification->raw_handle, NOTIFICATION_TEXT_TYPE_TITLE, notification->title, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
+ }
+
+ if (notification->content != NULL)
+ {
+ notification_set_text(notification->raw_handle, NOTIFICATION_TEXT_TYPE_CONTENT, notification->content, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
+ }
+
+ if (notification->service != NULL && service_to_bundle(notification->service, &service_data) == SERVICE_ERROR_NONE)
+ {
+ notification_set_property(notification->raw_handle, 0);
+ notification_set_execute_option(notification->raw_handle, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, NULL, NULL, service_data);
+ }
+ else
+ {
+ notification_set_property(notification->raw_handle, NOTIFICATION_PROP_DISABLE_APP_LAUNCH);
+ }
+
+ return UI_NOTIFICATION_ERROR_NONE;
+}
int ui_notification_post(ui_notification_h notification)
{
int retcode;
- notification_h core;
- bundle *service_data;
if (notification == NULL)
{
if (notification->posted == true)
{
- LOGE("[%s] ALREADY_POSTED(0x%08x) : unable to change the notification", __FUNCTION__, UI_NOTIFICATION_ERROR_ALREADY_POSTED);
- return UI_NOTIFICATION_ERROR_ALREADY_POSTED;
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was already posted", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
}
- // STEP 1: core handle
+ // STEP 1: notification handle
if (notification->ongoing == true)
{
- core = notification_new(NOTIFICATION_TYPE_ONGOING, NOTIFICATION_GROUP_ID_DEFAULT, NOTIFICATION_PRIV_ID_NONE);
+ notification->raw_handle = notification_new(NOTIFICATION_TYPE_ONGOING, NOTIFICATION_GROUP_ID_DEFAULT, NOTIFICATION_PRIV_ID_NONE);
}
else
{
- core = notification_new(NOTIFICATION_TYPE_NOTI, NOTIFICATION_GROUP_ID_DEFAULT, NOTIFICATION_PRIV_ID_NONE);
+ notification->raw_handle = notification_new(NOTIFICATION_TYPE_NOTI, NOTIFICATION_GROUP_ID_DEFAULT, NOTIFICATION_PRIV_ID_NONE);
}
- if (core == NULL)
+ if (notification->raw_handle == NULL)
{
LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_OUT_OF_MEMORY);
return UI_NOTIFICATION_ERROR_OUT_OF_MEMORY;
}
- notification->core = core;
+ retcode = ui_notification_build_attributes(notification);
- // STEP 2: icon
- if (notification->icon != NULL)
+ if (retcode != UI_NOTIFICATION_ERROR_NONE)
{
- struct stat st;
-
- if (stat(notification->icon, &st) < 0)
- {
- LOGE("[%s] NO_SUCH_FILE(0x%08x) : invalid icon", __FUNCTION__, UI_NOTIFICATION_ERROR_NO_SUCH_FILE);
- return UI_NOTIFICATION_ERROR_NO_SUCH_FILE;
- }
-
- notification_set_image(core, NOTIFICATION_IMAGE_TYPE_ICON, notification->icon);
+ return retcode;
}
- // STEP 3: time
- if (notification->time != NULL)
+ retcode = ui_notification_error_handler(notification_insert(notification->raw_handle, NULL), __FUNCTION__, "failed to post a notification");
+
+ if (retcode == UI_NOTIFICATION_ERROR_NONE)
{
- notification_set_time(core, mktime(notification->time));
+ notification->posted = true;
}
- // STEP 4: title
- if (notification->title != NULL)
+ return retcode;
+}
+
+int ui_notification_update(ui_notification_h notification)
+{
+ int retcode;
+
+ if (notification == NULL)
{
- notification_set_text(core, NOTIFICATION_TEXT_TYPE_TITLE, notification->title, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
+ LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- // STEP 5: content
- if (notification->content != NULL)
+ if (notification->posted == false)
{
- notification_set_text(core, NOTIFICATION_TEXT_TYPE_CONTENT, notification->content, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was not posted", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
}
- // STEP 6: service
- if (notification->service != NULL && service_to_bundle(notification->service, &service_data) == SERVICE_ERROR_NONE)
+ if (notification->removed == true)
{
- notification_set_execute_option(core, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, NULL, NULL, service_data);
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was canceled or cleared", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
}
- else
+
+ retcode = ui_notification_build_attributes(notification);
+
+ if (retcode != UI_NOTIFICATION_ERROR_NONE)
{
- notification_set_property(core, NOTIFICATION_PROP_DISABLE_APP_LAUNCH);
+ return retcode;
}
- // STEP 7: insert
- retcode = ui_notification_error_handler(notification_insert(core, NULL), __FUNCTION__, "failed to post a notification");
+ retcode = ui_notification_error_handler(notification_update(notification->raw_handle), __FUNCTION__, "failed to post a notification");
- if (retcode == UI_NOTIFICATION_ERROR_NONE)
+ if (retcode == UI_NOTIFICATION_ERROR_INVALID_STATE)
{
- notification->posted = true;
+ notification->removed = true;
}
return retcode;
}
-int ui_notification_update_progress(ui_notification_h notification, ui_notification_progress_type_e type, double value)
+int ui_notification_update_progress(ui_notification_h notification, ui_notification_progress_type_e type, double value)
{
int retcode;
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->core == NULL || notification->posted == false)
+ if (notification->raw_handle == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
+ if (notification->posted == false)
+ {
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was not posted", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
+ }
+
+ if (notification->removed == true)
+ {
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was canceled or cleared", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
+ }
+
+ if (value < 0)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : the value must be greater than or equal to zero.", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
switch (type)
{
case UI_NOTIFICATION_PROGRESS_TYPE_SIZE:
retcode = ui_notification_error_handler(
- notification_update_size(notification->core, NOTIFICATION_PRIV_ID_NONE, value),
+ notification_update_size(notification->raw_handle, NOTIFICATION_PRIV_ID_NONE, value),
__FUNCTION__, "failed to update the progress");
break;
case UI_NOTIFICATION_PROGRESS_TYPE_PERCENTAGE:
retcode = ui_notification_error_handler(
- notification_update_progress(notification->core, NOTIFICATION_PRIV_ID_NONE, value),
+ notification_update_progress(notification->raw_handle, NOTIFICATION_PRIV_ID_NONE, value),
__FUNCTION__, "failed to update the progress");
break;
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
+ if (retcode == UI_NOTIFICATION_ERROR_INVALID_STATE)
+ {
+ notification->removed = true;
+ }
+
return retcode;
}
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- if (notification->core == NULL || notification->posted == false)
+ if (notification->raw_handle == NULL)
{
LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
}
- retcode = ui_notification_error_handler(
- notification_delete(notification->core),
- __FUNCTION__, "failed to cancel the notification");
+ if (notification->posted == false)
+ {
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was not posted", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
+ }
+
+ if (notification->removed == true)
+ {
+ LOGE("[%s] INVALID_STATE(0x%08x) : the notification was canceled or cleared", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_STATE);
+ return UI_NOTIFICATION_ERROR_INVALID_STATE;
+ }
+
+ retcode = ui_notification_error_handler(notification_delete(notification->raw_handle), __FUNCTION__, "failed to cancel the notification");
+
+ if (retcode == UI_NOTIFICATION_ERROR_NONE)
+ {
+ notification->removed = true;
+ }
return retcode;
}
-int ui_notification_cancel_all(void)
+void ui_notification_cancel_all(void)
+{
+ notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_NONE);
+}
+
+static bool ui_notification_package_equal(notification_h handle)
{
- return ui_notification_error_handler(
- notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_NONE),
- __FUNCTION__, "failed to cancel the notification");
+ char *package = NULL;
+ char *handle_package = NULL;
+
+ if (app_get_package(&package))
+ {
+ return false;
+ }
+
+ if (notification_get_pkgname(handle, &handle_package))
+ {
+ return false;
+ }
+
+ if (strlen(package) == strlen(handle_package))
+ {
+ if (!strncmp(package, handle_package, strlen(package)))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int ui_notification_foreach_notification_posted(bool ongoing, ui_notification_cb callback, void *user_data)
+{
+ notification_list_h raw_handle_list;
+ notification_h raw_handle;
+ notification_type_e notification_type = ongoing ? NOTIFICATION_TYPE_ONGOING : NOTIFICATION_TYPE_NOTI;
+ ui_notification_h notification = NULL;
+ bool iterate_next = true;
+
+ if (callback == NULL)
+ {
+ LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, UI_NOTIFICATION_ERROR_INVALID_PARAMETER);
+ return UI_NOTIFICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ if (notification_get_grouping_list(notification_type, -1, &raw_handle_list))
+ {
+ LOGE("[%s] DB_FAILED(0x%08x) : failed to get a notification list", __FUNCTION__, UI_NOTIFICATION_ERROR_DB_FAILED);
+ return UI_NOTIFICATION_ERROR_DB_FAILED;
+ }
+
+ while (raw_handle_list != NULL)
+ {
+ raw_handle = notification_list_get_data(raw_handle_list);
+
+ if (raw_handle != NULL && ui_notification_package_equal(raw_handle))
+ {
+ if (!ui_notification_construct(ongoing, raw_handle, ¬ification))
+ {
+ iterate_next = callback(notification, user_data);
+
+ ui_notification_destroy(notification);
+
+ if (iterate_next == false)
+ {
+ break;
+ }
+ }
+ }
+
+ raw_handle_list = notification_list_get_next(raw_handle_list);
+ }
+
+ notification_free_list(raw_handle_list);
+
+ return UI_NOTIFICATION_ERROR_NONE;
}