Search in sources :

Example 21 with TaskStackBuilder

use of android.support.v4.app.TaskStackBuilder in project kdeconnect-android by KDE.

the class SharePlugin method onPackageReceived.

@Override
public boolean onPackageReceived(NetworkPackage np) {
    try {
        if (np.hasPayload()) {
            Log.i("SharePlugin", "hasPayload");
            int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            } else if (permissionCheck == PackageManager.PERMISSION_DENIED) {
                // TODO Request Permission for storage
                Log.i("SharePlugin", "no Permission for Storage");
                return false;
            }
            final InputStream input = np.getPayload();
            final long fileLength = np.getPayloadSize();
            final String originalFilename = np.getString("filename", Long.toString(System.currentTimeMillis()));
            //We need to check for already existing files only when storing in the default path.
            //User-defined paths use the new Storage Access Framework that already handles this.
            final boolean customDestination = ShareSettingsActivity.isCustomDestinationEnabled(context);
            final String defaultPath = ShareSettingsActivity.getDefaultDestinationDirectory().getAbsolutePath();
            final String filename = customDestination ? originalFilename : FilesHelper.findNonExistingNameForNewFile(defaultPath, originalFilename);
            String displayName = FilesHelper.getFileNameWithoutExt(filename);
            final String mimeType = FilesHelper.getMimeTypeFromFile(filename);
            if ("*/*".equals(mimeType)) {
                displayName = filename;
            }
            final DocumentFile destinationFolderDocument = ShareSettingsActivity.getDestinationDirectory(context);
            final DocumentFile destinationDocument = destinationFolderDocument.createFile(mimeType, displayName);
            final OutputStream destinationOutput = context.getContentResolver().openOutputStream(destinationDocument.getUri());
            final Uri destinationUri = destinationDocument.getUri();
            final int notificationId = (int) System.currentTimeMillis();
            Resources res = context.getResources();
            final NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setContentTitle(res.getString(R.string.incoming_file_title, device.getName())).setContentText(res.getString(R.string.incoming_file_text, filename)).setTicker(res.getString(R.string.incoming_file_title, device.getName())).setSmallIcon(android.R.drawable.stat_sys_download).setAutoCancel(true).setOngoing(true).setProgress(100, 0, true);
            final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationHelper.notifyCompat(notificationManager, notificationId, builder.build());
            new Thread(new Runnable() {

                @Override
                public void run() {
                    boolean successful = true;
                    try {
                        byte[] data = new byte[1024];
                        long progress = 0, prevProgressPercentage = 0;
                        int count;
                        while ((count = input.read(data)) >= 0) {
                            progress += count;
                            destinationOutput.write(data, 0, count);
                            if (fileLength > 0) {
                                if (progress >= fileLength)
                                    break;
                                long progressPercentage = (progress * 10 / fileLength);
                                if (progressPercentage != prevProgressPercentage) {
                                    prevProgressPercentage = progressPercentage;
                                    builder.setProgress(100, (int) progressPercentage * 10, false);
                                    NotificationHelper.notifyCompat(notificationManager, notificationId, builder.build());
                                }
                            }
                        //else Log.e("SharePlugin", "Infinite loop? :D");
                        }
                        destinationOutput.flush();
                    } catch (Exception e) {
                        successful = false;
                        Log.e("SharePlugin", "Receiver thread exception");
                        e.printStackTrace();
                    } finally {
                        try {
                            destinationOutput.close();
                        } catch (Exception e) {
                        }
                        try {
                            input.close();
                        } catch (Exception e) {
                        }
                    }
                    try {
                        Log.i("SharePlugin", "Transfer finished: " + destinationUri.getPath());
                        //Update the notification and allow to open the file from it
                        Resources res = context.getResources();
                        String message = successful ? res.getString(R.string.received_file_title, device.getName()) : res.getString(R.string.received_file_fail_title, device.getName());
                        builder.setContentTitle(message).setTicker(message).setSmallIcon(android.R.drawable.stat_sys_download_done).setAutoCancel(true).setProgress(100, 100, false).setOngoing(false);
                        // TODO use FileProvider for >Nougat
                        if (Build.VERSION.SDK_INT < 24) {
                            if (successful) {
                                Intent intent = new Intent(Intent.ACTION_VIEW);
                                intent.setDataAndType(destinationUri, mimeType);
                                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
                                stackBuilder.addNextIntent(intent);
                                PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
                                builder.setContentText(res.getString(R.string.received_file_text, destinationDocument.getName())).setContentIntent(resultPendingIntent);
                            }
                        }
                        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
                        if (prefs.getBoolean("share_notification_preference", true)) {
                            builder.setDefaults(Notification.DEFAULT_ALL);
                        }
                        NotificationHelper.notifyCompat(notificationManager, notificationId, builder.build());
                        if (successful) {
                            if (!customDestination && Build.VERSION.SDK_INT >= 12) {
                                Log.i("SharePlugin", "Adding to downloads");
                                DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                                manager.addCompletedDownload(destinationUri.getLastPathSegment(), device.getName(), true, mimeType, destinationUri.getPath(), fileLength, false);
                            } else {
                                //Make sure it is added to the Android Gallery anyway
                                MediaStoreHelper.indexFile(context, destinationUri);
                            }
                        }
                    } catch (Exception e) {
                        Log.e("SharePlugin", "Receiver thread exception");
                        e.printStackTrace();
                    }
                }
            }).start();
        } else if (np.has("text")) {
            Log.i("SharePlugin", "hasText");
            String text = np.getString("text");
            if (Build.VERSION.SDK_INT >= 11) {
                ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                cm.setText(text);
            } else {
                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                clipboard.setText(text);
            }
            Toast.makeText(context, R.string.shareplugin_text_saved, Toast.LENGTH_LONG).show();
        } else if (np.has("url")) {
            String url = np.getString("url");
            Log.i("SharePlugin", "hasUrl: " + url);
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (openUrlsDirectly) {
                context.startActivity(browserIntent);
            } else {
                Resources res = context.getResources();
                TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
                stackBuilder.addNextIntent(browserIntent);
                PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
                Notification noti = new NotificationCompat.Builder(context).setContentTitle(res.getString(R.string.received_url_title, device.getName())).setContentText(res.getString(R.string.received_url_text, url)).setContentIntent(resultPendingIntent).setTicker(res.getString(R.string.received_url_title, device.getName())).setSmallIcon(R.drawable.ic_notification).setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL).build();
                NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationHelper.notifyCompat(notificationManager, (int) System.currentTimeMillis(), noti);
            }
        } else {
            Log.e("SharePlugin", "Error: Nothing attached!");
        }
    } catch (Exception e) {
        Log.e("SharePlugin", "Exception");
        e.printStackTrace();
    }
    return true;
}
Also used : OutputStream(java.io.OutputStream) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) Uri(android.net.Uri) DownloadManager(android.app.DownloadManager) Notification(android.app.Notification) NotificationCompat(android.support.v4.app.NotificationCompat) Context(android.content.Context) ClipboardManager(android.content.ClipboardManager) DocumentFile(android.support.v4.provider.DocumentFile) NotificationManager(android.app.NotificationManager) SharedPreferences(android.content.SharedPreferences) InputStream(java.io.InputStream) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) Resources(android.content.res.Resources) PendingIntent(android.app.PendingIntent) TaskStackBuilder(android.support.v4.app.TaskStackBuilder)

Example 22 with TaskStackBuilder

use of android.support.v4.app.TaskStackBuilder in project kdeconnect-android by KDE.

the class ReceiveNotificationsPlugin method onPackageReceived.

@Override
public boolean onPackageReceived(final NetworkPackage np) {
    if (!np.has("ticker") || !np.has("appName") || !np.has("id")) {
        Log.e("NotificationsPlugin", "Received notification package lacks properties");
    } else {
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(MaterialActivity.class);
        stackBuilder.addNextIntent(new Intent(context, MaterialActivity.class));
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        Bitmap largeIcon = null;
        if (np.hasPayload()) {
            // default icon dimensions
            int width = 64;
            int height = 64;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                width = context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width);
                height = context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
            }
            final InputStream input = np.getPayload();
            largeIcon = BitmapFactory.decodeStream(np.getPayload());
            try {
                input.close();
            } catch (Exception e) {
            }
            if (largeIcon != null) {
                //Log.i("NotificationsPlugin", "hasPayload: size=" + largeIcon.getWidth() + "/" + largeIcon.getHeight() + " opti=" + width + "/" + height);
                if (largeIcon.getWidth() > width || largeIcon.getHeight() > height) {
                    // older API levels don't scale notification icons automatically, therefore:
                    largeIcon = Bitmap.createScaledBitmap(largeIcon, width, height, false);
                }
            }
        }
        Notification noti = new NotificationCompat.Builder(context).setContentTitle(np.getString("appName")).setContentText(np.getString("ticker")).setContentIntent(resultPendingIntent).setTicker(np.getString("ticker")).setSmallIcon(R.drawable.ic_notification).setLargeIcon(largeIcon).setAutoCancel(true).setLocalOnly(// to avoid bouncing the notification back to other kdeconnect nodes
        true).setDefaults(Notification.DEFAULT_ALL).build();
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationHelper.notifyCompat(notificationManager, "kdeconnectId:" + np.getString("id", "0"), np.getInt("id", 0), noti);
    }
    return true;
}
Also used : Bitmap(android.graphics.Bitmap) MaterialActivity(org.kde.kdeconnect.UserInterface.MaterialActivity) NotificationManager(android.app.NotificationManager) InputStream(java.io.InputStream) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) PendingIntent(android.app.PendingIntent) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) Notification(android.app.Notification)

Example 23 with TaskStackBuilder

use of android.support.v4.app.TaskStackBuilder in project kdeconnect-android by KDE.

the class PingPlugin method onPackageReceived.

@Override
public boolean onPackageReceived(NetworkPackage np) {
    if (!np.getType().equals(PACKAGE_TYPE_PING)) {
        Log.e("PingPlugin", "Ping plugin should not receive packets other than pings!");
        return false;
    }
    //Log.e("PingPackageReceiver", "was a ping!");
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(MaterialActivity.class);
    stackBuilder.addNextIntent(new Intent(context, MaterialActivity.class));
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    int id;
    String message;
    if (np.has("message")) {
        message = np.getString("message");
        id = (int) System.currentTimeMillis();
    } else {
        message = "Ping!";
        //A unique id to create only one notification
        id = 42;
    }
    Notification noti = new NotificationCompat.Builder(context).setContentTitle(device.getName()).setContentText(message).setContentIntent(resultPendingIntent).setTicker(message).setSmallIcon(R.drawable.ic_notification).setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL).build();
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationHelper.notifyCompat(notificationManager, id, noti);
    return true;
}
Also used : MaterialActivity(org.kde.kdeconnect.UserInterface.MaterialActivity) NotificationManager(android.app.NotificationManager) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) PendingIntent(android.app.PendingIntent) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) Notification(android.app.Notification)

Example 24 with TaskStackBuilder

use of android.support.v4.app.TaskStackBuilder in project xabber-android by redsolution.

the class NotificationManager method updateNotifications.

/**
 * Update notifications for specified provider.
 *
 * @param <T>
 * @param provider
 * @param notify   Ticker to be shown. Can be <code>null</code>.
 */
public <T extends NotificationItem> void updateNotifications(NotificationProvider<T> provider, T notify) {
    int id = providers.indexOf(provider);
    if (id == -1) {
        throw new IllegalStateException("registerNotificationProvider() must be called from onLoaded() method.");
    }
    id += BASE_NOTIFICATION_PROVIDER_ID;
    Iterator<? extends NotificationItem> iterator = provider.getNotifications().iterator();
    if (!iterator.hasNext()) {
        notificationManager.cancel(id);
        return;
    }
    NotificationItem top;
    String ticker;
    if (notify == null) {
        top = iterator.next();
        ticker = null;
    } else {
        top = notify;
        ticker = top.getTitle();
    }
    NotificationCompat.Builder notificationBuilder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        notificationBuilder = new NotificationCompat.Builder(application, createNotificationChannel());
    else
        notificationBuilder = new NotificationCompat.Builder(application, "");
    notificationBuilder.setSmallIcon(provider.getIcon());
    notificationBuilder.setTicker(ticker);
    if (!provider.canClearNotifications()) {
        notificationBuilder.setOngoing(true);
    }
    notificationBuilder.setContentTitle(top.getTitle());
    notificationBuilder.setContentText(top.getText());
    TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(application);
    taskStackBuilder.addNextIntentWithParentStack(top.getIntent());
    notificationBuilder.setContentIntent(taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT));
    if (ticker != null) {
        setNotificationDefaults(notificationBuilder, SettingsManager.eventsLightning(), provider.getSound(), provider.getStreamType());
    }
    notificationBuilder.setDeleteIntent(clearNotifications);
    notificationBuilder.setColor(ColorManager.getInstance().getAccountPainter().getDefaultMainColor());
    notify(id, notificationBuilder.build());
}
Also used : TaskStackBuilder(android.support.v4.app.TaskStackBuilder) NotificationCompat(android.support.v4.app.NotificationCompat) TaskStackBuilder(android.support.v4.app.TaskStackBuilder) SuppressLint(android.annotation.SuppressLint)

Example 25 with TaskStackBuilder

use of android.support.v4.app.TaskStackBuilder in project k-9 by k9mail.

the class NotificationActionCreator method buildMessageListBackStack.

private TaskStackBuilder buildMessageListBackStack(Account account, String folderName) {
    TaskStackBuilder stack = skipFolderListInBackStack(account, folderName) ? buildAccountsBackStack() : buildFolderListBackStack(account);
    LocalSearch search = new LocalSearch(folderName);
    search.addAllowedFolder(folderName);
    search.addAccountUuid(account.getUuid());
    Intent intent = MessageList.intentDisplaySearch(context, search, false, true, true);
    stack.addNextIntent(intent);
    return stack;
}
Also used : LocalSearch(com.fsck.k9.search.LocalSearch) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) TaskStackBuilder(android.support.v4.app.TaskStackBuilder)

Aggregations

Intent (android.content.Intent)40 TaskStackBuilder (android.support.v4.app.TaskStackBuilder)40 PendingIntent (android.app.PendingIntent)35 NotificationCompat (android.support.v4.app.NotificationCompat)21 NotificationManager (android.app.NotificationManager)14 Bitmap (android.graphics.Bitmap)13 InputStream (java.io.InputStream)10 IOException (java.io.IOException)8 URL (java.net.URL)8 Notification (android.app.Notification)7 Context (android.content.Context)5 Uri (android.net.Uri)5 SharedPreferences (android.content.SharedPreferences)3 Resources (android.content.res.Resources)3 Cursor (android.database.Cursor)3 Bundle (android.os.Bundle)3 RemoteViews (android.widget.RemoteViews)3 TaskStackBuilder (android.app.TaskStackBuilder)2 ContentResolver (android.content.ContentResolver)2 NonNull (android.support.annotation.NonNull)2