chromium/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProviderFactory.java

// Copyright 2019 The Chromium Authors
// 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.webapps;

import android.content.Intent;
import android.text.TextUtils;

import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.Log;
import org.chromium.blink.mojom.DisplayMode;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.intents.WebappConstants;
import org.chromium.chrome.browser.browserservices.intents.WebappExtras;
import org.chromium.chrome.browser.browserservices.intents.WebappIcon;
import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils;
import org.chromium.components.webapps.ShortcutSource;
import org.chromium.device.mojom.ScreenOrientationLockType;
import org.chromium.ui.util.ColorUtils;
import org.chromium.webapk.lib.common.splash.SplashLayout;

/** Factory for building {@link BrowserServicesIntentDataProvider} for homescreen shortcuts. */
public class WebappIntentDataProviderFactory {
    private static final String TAG = "WebappInfo";

    private static int sourceFromIntent(Intent intent) {
        int source =
                IntentUtils.safeGetIntExtra(
                        intent, WebappConstants.EXTRA_SOURCE, ShortcutSource.UNKNOWN);
        if (source >= ShortcutSource.COUNT) {
            source = ShortcutSource.UNKNOWN;
        }
        return source;
    }

    private static String titleFromIntent(Intent intent) {
        // The reference to title has been kept for reasons of backward compatibility. For intents
        // and shortcuts which were created before we utilized the concept of name and shortName,
        // we set the name and shortName to be the title.
        String title = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_TITLE);
        return title == null ? "" : title;
    }

    private static String nameFromIntent(Intent intent) {
        String name = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_NAME);
        return name == null ? titleFromIntent(intent) : name;
    }

    private static String shortNameFromIntent(Intent intent) {
        String shortName = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_SHORT_NAME);
        return shortName == null ? titleFromIntent(intent) : shortName;
    }

    /**
     * Construct a BrowserServicesIntentDataProvider.
     * @param intent Intent containing info about the app.
     */
    public static BrowserServicesIntentDataProvider create(Intent intent) {
        String id = WebappIntentUtils.getIdForHomescreenShortcut(intent);
        String url = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_URL);
        if (id == null || url == null) {
            Log.e(TAG, "Incomplete data provided: " + id + ", " + url);
            return null;
        }

        long themeColor =
                IntentUtils.safeGetLongExtra(
                        intent, WebappConstants.EXTRA_THEME_COLOR, ColorUtils.INVALID_COLOR);
        boolean hasValidToolbarColor = WebappIntentUtils.isLongColorValid(themeColor);
        int toolbarColor =
                hasValidToolbarColor
                        ? (int) themeColor
                        : WebappIntentDataProvider.getDefaultToolbarColor();
        long darkThemeColor =
                IntentUtils.safeGetLongExtra(
                        intent, WebappConstants.EXTRA_DARK_THEME_COLOR, ColorUtils.INVALID_COLOR);
        boolean hasValidDarkToolbarColor = WebappIntentUtils.isLongColorValid(darkThemeColor);
        int darkToolbarColor =
                hasValidDarkToolbarColor
                        ? (int) darkThemeColor
                        : WebappIntentDataProvider.getDefaultDarkToolbarColor();

        String icon = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_ICON);

        String scope = IntentUtils.safeGetStringExtra(intent, WebappConstants.EXTRA_SCOPE);
        if (TextUtils.isEmpty(scope)) {
            scope = ShortcutHelper.getScopeFromUrl(url);
        }

        @DisplayMode.EnumType
        int displayMode =
                IntentUtils.safeGetIntExtra(
                        intent, WebappConstants.EXTRA_DISPLAY_MODE, DisplayMode.STANDALONE);
        int orientation =
                IntentUtils.safeGetIntExtra(
                        intent,
                        WebappConstants.EXTRA_ORIENTATION,
                        ScreenOrientationLockType.DEFAULT);
        int source = sourceFromIntent(intent);
        Integer backgroundColor =
                WebappIntentUtils.colorFromLongColor(
                        IntentUtils.safeGetLongExtra(
                                intent,
                                WebappConstants.EXTRA_BACKGROUND_COLOR,
                                ColorUtils.INVALID_COLOR));
        Integer darkBackgroundColor =
                WebappIntentUtils.colorFromLongColor(
                        IntentUtils.safeGetLongExtra(
                                intent,
                                WebappConstants.EXTRA_DARK_BACKGROUND_COLOR,
                                ColorUtils.INVALID_COLOR));
        boolean isIconGenerated =
                IntentUtils.safeGetBooleanExtra(
                        intent, WebappConstants.EXTRA_IS_ICON_GENERATED, false);
        boolean isIconAdaptive =
                IntentUtils.safeGetBooleanExtra(
                        intent, WebappConstants.EXTRA_IS_ICON_ADAPTIVE, false);
        boolean forceNavigation =
                IntentUtils.safeGetBooleanExtra(
                        intent, WebappConstants.EXTRA_FORCE_NAVIGATION, false);

        String name = nameFromIntent(intent);
        String shortName = shortNameFromIntent(intent);

        int defaultBackgroundColor =
                SplashLayout.getDefaultBackgroundColor(ContextUtils.getApplicationContext());

        WebappExtras webappExtras =
                new WebappExtras(
                        id,
                        url,
                        scope,
                        new WebappIcon(icon, /* isTrusted= */ true),
                        name,
                        shortName,
                        displayMode,
                        orientation,
                        source,
                        backgroundColor,
                        darkBackgroundColor,
                        defaultBackgroundColor,
                        isIconGenerated,
                        isIconAdaptive,
                        forceNavigation);
        return new WebappIntentDataProvider(
                intent,
                toolbarColor,
                hasValidToolbarColor,
                darkToolbarColor,
                hasValidDarkToolbarColor,
                /* shareData= */ null,
                webappExtras,
                /* webApkExtras= */ null);
    }
}