// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser;

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;

import org.chromium.base.CalledByNative;

import java.util.UUID;

/**
 * This is a helper class to create shortcuts on the Android home screen.
 */
public class ShortcutHelper {
    public static final String EXTRA_ID = "org.chromium.chrome.browser.webapp_id";
    public static final String EXTRA_MAC = "org.chromium.chrome.browser.webapp_mac";
    public static final String EXTRA_URL = "org.chromium.chrome.browser.webapp_url";

    private static String sFullScreenAction;

    /**
     * Sets the class name used when launching the shortcuts.
     * @param fullScreenAction Class name of the fullscreen Activity.
     */
    public static void setFullScreenAction(String fullScreenAction) {
        sFullScreenAction = fullScreenAction;
    }

    /**
     * Adds a shortcut for the current Tab.
     * @param appContext The application context.
     * @param tab Tab to create a shortcut for.
     * @param userRequestedTitle Updated title for the shortcut.
     */
    public static void addShortcut(Context appContext, TabBase tab, String userRequestedTitle) {
        if (TextUtils.isEmpty(sFullScreenAction)) {
            Log.e("ShortcutHelper", "ShortcutHelper is uninitialized.  Aborting.");
            return;
        }
        ActivityManager am = (ActivityManager) appContext.getSystemService(
                Context.ACTIVITY_SERVICE);
        nativeAddShortcut(tab.getNativePtr(), userRequestedTitle, am.getLauncherLargeIconSize());
    }

    /**
     * Called when we have to fire an Intent to add a shortcut to the homescreen.
     * If the webpage indicated that it was capable of functioning as a webapp, it is added as a
     * shortcut to a webapp Activity rather than as a general bookmark. User is sent to the
     * homescreen as soon as the shortcut is created.
     */
    @SuppressWarnings("unused")
    @CalledByNative
    private static void addShortcut(Context context, String url, String title, Bitmap favicon,
            int red, int green, int blue, boolean isWebappCapable) {
        assert sFullScreenAction != null;

        Intent shortcutIntent = null;
        if (isWebappCapable) {
            // Add the shortcut as a launcher icon for a full-screen Activity.
            shortcutIntent = new Intent();
            shortcutIntent.setAction(sFullScreenAction);
            shortcutIntent.putExtra(EXTRA_URL, url);
            shortcutIntent.putExtra(EXTRA_ID, UUID.randomUUID().toString());

            // The only reason we convert to a String here is because Android inexplicably eats a
            // byte[] when adding the shortcut -- the Bundle received by the launched Activity even
            // lacks the key for the extra.
            byte[] mac = WebappAuthenticator.getMacForUrl(context, url);
            String encodedMac = Base64.encodeToString(mac, Base64.DEFAULT);
            shortcutIntent.putExtra(EXTRA_MAC, encodedMac);
        } else {
            // Add the shortcut as a launcher icon to open in the browser Activity.
            shortcutIntent = BookmarkUtils.createShortcutIntent(context, url);
        }

        shortcutIntent.setPackage(context.getPackageName());
        context.sendBroadcast(BookmarkUtils.createAddToHomeIntent(context, shortcutIntent, title,
                favicon, red, green, blue));

        // User is sent to the homescreen as soon as the shortcut is created.
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory(Intent.CATEGORY_HOME);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(homeIntent);
    }

    private static native void nativeAddShortcut(long tabAndroidPtr, String userRequestedTitle,
            int launcherLargeIconSize);
}
