com.sspai.dkjt.service.GenerateFrameService.java Source code

Java tutorial

Introduction

Here is the source code for com.sspai.dkjt.service.GenerateFrameService.java

Source

/*
 * Copyright 2014 Prateek Srivastava (@f2prateek)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sspai.dkjt.service;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.*;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.NotificationCompat;
import com.f2prateek.dart.InjectExtra;
import com.sspai.dkjt.R;
import com.sspai.dkjt.prefs.ConfigString;
import com.sspai.dkjt.model.Events;
import com.sspai.dkjt.prefs.GlareEnabled;
import com.sspai.dkjt.prefs.ShadowEnabled;
import com.sspai.dkjt.model.BooleanPreference;
import com.sspai.dkjt.ui.activity.MainActivity;

import javax.inject.Inject;

/** A service that generates our frames. */
public class GenerateFrameService extends AbstractGenerateFrameService {

    public static final String KEY_EXTRA_SCREENSHOT = "KEY_EXTRA_SCREENSHOT";

    @Inject
    @ShadowEnabled
    BooleanPreference shadowEnabled;
    @Inject
    @GlareEnabled
    BooleanPreference glareEnabled;
    @Inject
    Resources resources;

    @InjectExtra(KEY_EXTRA_SCREENSHOT)
    Uri screenshotUri;
    DeviceFrameGenerator generator;

    public GenerateFrameService() {
        super("GenerateFrameService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        super.onHandleIntent(intent);

        generator = new DeviceFrameGenerator(this, this, device, shadowEnabled.get(), glareEnabled.get());
        generator.generateFrame(screenshotUri);
    }

    @Override
    public void startingImage(Bitmap screenshot) {
        // Create the large notification icon
        int imageWidth = screenshot.getWidth();
        int imageHeight = screenshot.getHeight();
        int iconSize = resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
        final int shortSide = imageWidth < imageHeight ? imageWidth : imageHeight;

        // Check for if config is null, http://crashes.to/s/dd0857c8648
        Bitmap preview = Bitmap.createBitmap(shortSide, shortSide,
                screenshot.getConfig() == null ? Bitmap.Config.ARGB_8888 : screenshot.getConfig());
        Canvas c = new Canvas(preview);
        Paint paint = new Paint();
        ColorMatrix desat = new ColorMatrix();
        desat.setSaturation(0.25f);
        paint.setColorFilter(new ColorMatrixColorFilter(desat));
        Matrix matrix = new Matrix();
        matrix.postTranslate((shortSide - imageWidth) / 2, (shortSide - imageHeight) / 2);
        c.drawBitmap(screenshot, matrix, paint);
        c.drawColor(0x40FFFFFF);

        Bitmap croppedIcon = Bitmap.createScaledBitmap(preview, iconSize, iconSize, true);

        Intent nullIntent = new Intent(this, MainActivity.class);
        nullIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationBuilder = new NotificationCompat.Builder(this)
                .setTicker(resources.getString(R.string.screenshot_saving_ticker))
                .setContentTitle(resources.getString(R.string.screenshot_saving_title))
                .setSmallIcon(R.drawable.ic_actionbar_logo)
                .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(preview))
                .setContentIntent(PendingIntent.getActivity(this, 0, nullIntent, 0))
                .setWhen(System.currentTimeMillis()).setProgress(0, 0, true).setLargeIcon(croppedIcon);

        Notification n = notificationBuilder.build();
        n.flags |= Notification.FLAG_NO_CLEAR;
        notificationManager.notify(DFG_NOTIFICATION_ID, n);
    }

    @Override
    public void doneImage(final Uri imageUri) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(new Events.SingleImageProcessed(device, imageUri));
            }
        });

        // Create the intent to let the user share the image
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        sharingIntent.setType("image/png");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
        Intent chooserIntent = Intent.createChooser(sharingIntent, null);
        chooserIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        notificationBuilder.addAction(R.drawable.ic_action_share, getResources().getString(R.string.share),
                PendingIntent.getActivity(this, 0, chooserIntent, PendingIntent.FLAG_CANCEL_CURRENT));

        // Create the intent to let the user rate the app
        Intent rateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(ConfigString.MARKET_URL));
        notificationBuilder.addAction(R.drawable.ic_action_rate, getResources().getString(R.string.rate),
                PendingIntent.getActivity(this, 0, rateIntent, PendingIntent.FLAG_CANCEL_CURRENT));

        // Create the intent to show the screenshot in gallery
        Intent launchIntent = new Intent(Intent.ACTION_VIEW);
        launchIntent.setDataAndType(imageUri, "image/png");
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        notificationBuilder.setContentTitle(resources.getString(R.string.screenshot_saved_title))
                .setContentText(resources.getString(R.string.single_screenshot_saved, device.name()))
                .setContentIntent(PendingIntent.getActivity(this, 0, launchIntent, 0))
                .setWhen(System.currentTimeMillis()).setProgress(0, 0, false).setAutoCancel(true);

        notificationManager.notify(DFG_NOTIFICATION_ID, notificationBuilder.build());
    }
}