com.nextgis.maplibui.util.NotificationHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.nextgis.maplibui.util.NotificationHelper.java

Source

/*
 * Project:  NextGIS Mobile
 * Purpose:  Mobile GIS for Android.
 * Author:   Stanislav Petriakov, becomeglory@gmail.com
 * *****************************************************************************
 * Copyright (c) 2015-2016 NextGIS, info@nextgis.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.nextgis.maplibui.util;

import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.location.LocationManager;
import android.os.Build;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AlertDialog;
import android.util.DisplayMetrics;

import com.nextgis.maplibui.R;

public final class NotificationHelper {
    private static final int NOTIFICATION_GPS_ID = 695;

    public static Bitmap getLargeIcon(int iconResourceId, Resources resources) {
        Bitmap icon = BitmapFactory.decodeResource(resources, iconResourceId);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
            return icon;

        int iconSize = ControlHelper.dpToPx(40, resources);
        int innerIconSize = ControlHelper.dpToPx(24, resources);
        icon = Bitmap.createScaledBitmap(icon, iconSize, iconSize, false);
        Bitmap largeIcon = icon.copy(Bitmap.Config.ARGB_8888, true);
        icon = Bitmap.createScaledBitmap(icon, innerIconSize, innerIconSize, false);

        Canvas canvas = new Canvas(largeIcon);
        int center = canvas.getHeight() / 2;
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(resources.getColor(R.color.accent));
        canvas.drawCircle(center, center, center, paint);
        paint.setColor(Color.WHITE);
        canvas.drawBitmap(icon, center - icon.getWidth() / 2, center - icon.getWidth() / 2, paint);

        return largeIcon;
    }

    public static void showLocationInfo(final Context context) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        if (!preferences.getBoolean(SettingsConstantsUI.KEY_PREF_SHOW_GEO_DIALOG, true))
            return;

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        final boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        final boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled || !isNetworkEnabled) {
            String title, info;

            if (!isGPSEnabled && !isNetworkEnabled) {
                title = context.getString(R.string.location_disabled);
                info = context.getString(R.string.location_disabled_msg);
            } else {
                String network = "", gps = "";

                if (!isNetworkEnabled)
                    network = "\r\n- " + context.getString(R.string.location_network);

                if (!isGPSEnabled)
                    gps = "\r\n- " + context.getString(R.string.location_gps);

                title = context.getString(R.string.location_accuracy);
                info = context.getString(R.string.location_inaccuracy) + network + gps;
            }

            if (context instanceof Activity)
                showLocationDialog(context, title, info);
            else
                showLocationNotification(context, title, info);
        }
    }

    private static void showLocationDialog(final Context context, String title, String info) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title).setMessage(info)
                .setPositiveButton(R.string.action_settings, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                }).setNegativeButton(android.R.string.cancel, null)
                .setNeutralButton(R.string.do_not_ask_again, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context)
                                .edit();
                        editor.putBoolean(SettingsConstantsUI.KEY_PREF_SHOW_GEO_DIALOG, false).commit();
                    }
                });
        builder.create();
        builder.show();
    }

    private static void showLocationNotification(Context context, String title, String info) {
        NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent locationSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        PendingIntent intentNotify = PendingIntent.getActivity(context, 0, locationSettings,
                PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setContentIntent(intentNotify)
                .setAutoCancel(true).setSmallIcon(R.drawable.ic_location).setContentTitle(title)
                .setContentText(info).setTicker(title);

        manager.notify(NOTIFICATION_GPS_ID, builder.build());
    }
}