chromium/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/MergedWebappInfo.java

// Copyright 2022 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.browserservices.intents;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Map;

/**
 * Stores information about a web app and the previous information of the web app, and can be
 * conditionally configured to return either information. This is useful because when updating a
 * webapp, it is possible that the new WebAppInfo object created for the update contains a request
 * to alter element(s) of the app identity (name and/or icons) that are not permitted to change.
 * This object therefore keeps track of the previous values for the currently installed webapp, so
 * that they can be returned to callers in order for the rest of the (non-App Identity) update
 * requests to be fulfilled.
 */
public class MergedWebappInfo extends WebappInfo {
    // The old WebappInfo values (typically the current values for a webapp being upgraded).
    private WebappInfo mOldWebappInfo;

    // Whether to override the name and shortName information returned to callers.
    private boolean mUseOldName;

    // Whether to override the icon information returned to callers.
    private boolean mUseOldIcons;

    public static MergedWebappInfo create(
            @NonNull WebappInfo oldWebappInfo,
            @Nullable BrowserServicesIntentDataProvider provider) {
        return (provider == null) ? null : new MergedWebappInfo(oldWebappInfo, provider);
    }

    public static MergedWebappInfo createForTesting(
            @NonNull WebappInfo oldWebappInfo, @NonNull WebappInfo newWebappInfo) {
        return new MergedWebappInfo(oldWebappInfo, newWebappInfo.getProvider());
    }

    private MergedWebappInfo(
            @NonNull WebappInfo oldWebappInfo,
            @NonNull BrowserServicesIntentDataProvider provider) {
        super(provider);
        mOldWebappInfo = oldWebappInfo;
        setUseOldName(oldWebappInfo.getWebApkExtras().hasCustomName);
    }

    /** Sets whether to use the override values when webapp name/shortName are requested. */
    public void setUseOldName(boolean enabled) {
        mUseOldName = enabled;
    }

    /** Sets whether to use the override values when webapp icon information is requested. */
    public void setUseOldIcon(boolean enabled) {
        mUseOldIcons = enabled;
    }

    @Override
    public String name() {
        if (mUseOldName) {
            return mOldWebappInfo.getWebappExtras().name;
        }
        return super.name();
    }

    @Override
    public String shortName() {
        if (mUseOldName) {
            return mOldWebappInfo.getWebappExtras().shortName;
        }
        return super.shortName();
    }

    @Override
    public @NonNull WebappIcon icon() {
        if (mUseOldIcons) {
            return mOldWebappInfo.getWebappExtras().icon;
        }
        return super.icon();
    }

    /** Returns whether the {@link #icon} should be used as an Android Adaptive Icon. */
    @Override
    public boolean isIconAdaptive() {
        if (mUseOldIcons) {
            return mOldWebappInfo.getWebappExtras().isIconAdaptive;
        }
        return super.isIconAdaptive();
    }

    /** Returns whether the icon was generated by Chromium. */
    @Override
    public boolean isIconGenerated() {
        if (mUseOldIcons) {
            return mOldWebappInfo.getWebappExtras().isIconGenerated;
        }
        return super.isIconGenerated();
    }

    @Override
    @NonNull
    public Map<String, String> iconUrlToMurmur2HashMap() {
        if (mUseOldIcons) {
            return mOldWebappInfo.getWebApkExtras().iconUrlToMurmur2HashMap;
        }
        return super.iconUrlToMurmur2HashMap();
    }

    @Override
    public String appKey() {
        return mOldWebappInfo.appKey();
    }
}