/* * Copyright (c) 2013-2015 by appPlant UG. All rights reserved. * * @APPPLANT_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apache License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://opensource.org/licenses/Apache-2.0/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPPLANT_LICENSE_HEADER_END@ */ package de.appplant.cordova.plugin.notification; import android.app.AlarmManager; import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import android.support.v4.app.NotificationCompat; import org.json.JSONException; import org.json.JSONObject; import java.util.Date; /** * Wrapper around the JSON object passed through JS which contains all * possible option values. Class provides simple readers and more advanced * methods to convert independent values into platform specific values. */ public class Options { // Key name for bundled extras static final String EXTRA = "NOTIFICATION_OPTIONS"; // The original JSON object private JSONObject options = new JSONObject(); // Repeat interval private long interval = 0; // Application context private final Context context; // Asset util instance private final AssetUtil assets; /** * Constructor * * @param context * Application context */ public Options(Context context){ this.context = context; this.assets = AssetUtil.getInstance(context); } /** * Parse given JSON properties. * * @param options * JSON properties */ public Options parse (JSONObject options) { this.options = options; parseInterval(); parseAssets(); return this; } /** * Parse repeat interval. */ private void parseInterval() { String every = options.optString("every").toLowerCase(); if (every.isEmpty()) { interval = 0; } else if (every.equals("second")) { interval = 1000; } else if (every.equals("minute")) { interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES / 15; } else if (every.equals("hour")) { interval = AlarmManager.INTERVAL_HOUR; } else if (every.equals("day")) { interval = AlarmManager.INTERVAL_DAY; } else if (every.equals("week")) { interval = AlarmManager.INTERVAL_DAY * 7; } else if (every.equals("month")) { interval = AlarmManager.INTERVAL_DAY * 31; } else if (every.equals("quarter")) { interval = AlarmManager.INTERVAL_HOUR * 2190; } else if (every.equals("year")) { interval = AlarmManager.INTERVAL_DAY * 365; } else { try { interval = Integer.parseInt(every) * 60000; } catch (Exception e) { e.printStackTrace(); } } } /** * Parse asset URIs. */ private void parseAssets() { if (options.has("iconUri") && !options.optBoolean("updated")) return; Uri iconUri = assets.parse(options.optString("icon", "res://icon")); Uri soundUri = assets.parseSound(options.optString("sound", null)); try { options.put("iconUri", iconUri.toString()); options.put("soundUri", soundUri.toString()); } catch (JSONException e) { e.printStackTrace(); } } /** * Application context. */ public Context getContext () { return context; } /** * Wrapped JSON object. */ JSONObject getDict () { return options; } /** * Text for the local notification. */ public String getText() { return options.optString("text", ""); } /** * Repeat interval (day, week, month, year, aso.) */ public long getRepeatInterval() { return interval; } /** * Badge number for the local notification. */ public int getBadgeNumber() { return options.optInt("badge", 0); } /** * ongoing flag for local notifications. */ public Boolean isOngoing() { return options.optBoolean("ongoing", false); } /** * autoClear flag for local notifications. */ public Boolean isAutoClear() { return options.optBoolean("autoClear", false); } /** * ID for the local notification as a number. */ public Integer getId() { return options.optInt("id", 0); } /** * ID for the local notification as a string. */ public String getIdStr() { return getId().toString(); } /** * Trigger date. */ public Date getTriggerDate() { return new Date(getTriggerTime()); } /** * Trigger date in milliseconds. */ public long getTriggerTime() { return options.optLong("at", 0) * 1000; } /** * Title for the local notification. */ public String getTitle() { String title = options.optString("title", ""); if (title.isEmpty()) { title = context.getApplicationInfo().loadLabel( context.getPackageManager()).toString(); } return title; } /** * @return * The notification color for LED */ public int getLedColor() { String hex = options.optString("led", null); if (hex == null) { return 0; } int aRGB = Integer.parseInt(hex, 16); return aRGB + 0xFF000000; } /** * @return * The notification background color for the small icon * Returns null, if no color is given. */ public int getColor() { String hex = options.optString("color", null); if (hex == null) { return NotificationCompat.COLOR_DEFAULT; } int aRGB = Integer.parseInt(hex, 16); return aRGB + 0xFF000000; } /** * Sound file path for the local notification. */ public Uri getSoundUri() { Uri uri = null; try{ uri = Uri.parse(options.optString("soundUri")); } catch (Exception e){ e.printStackTrace(); } return uri; } /** * Icon bitmap for the local notification. */ public Bitmap getIconBitmap() { Bitmap bmp; try { Uri uri = Uri.parse(options.optString("iconUri")); bmp = assets.getIconFromUri(uri); } catch (Exception e){ e.printStackTrace(); bmp = assets.getIconFromDrawable("icon"); } return bmp; } /** * Icon resource ID for the local notification. */ public int getIcon () { String icon = options.optString("icon", ""); int resId = assets.getResIdForDrawable(icon); if (resId == 0) { resId = getSmallIcon(); } if (resId == 0) { resId = android.R.drawable.ic_popup_reminder; } return resId; } /** * Small icon resource ID for the local notification. */ public int getSmallIcon () { String icon = options.optString("smallIcon", ""); return assets.getResIdForDrawable(icon); } /** * JSON object as string. */ public String toString() { return options.toString(); } }