org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid.java Source code

Java tutorial

Introduction

Here is the source code for org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid.java

Source

// Copyright 2015 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.infobar;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.view.ViewCompat;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.banners.AppData;
import org.chromium.chrome.browser.widget.DualControlLayout;

/**
 * Infobar informing the user about an app related to this page.
 */
public class AppBannerInfoBarAndroid extends ConfirmInfoBar implements View.OnClickListener {
    // Installation states.
    public static final int INSTALL_STATE_NOT_INSTALLED = 0;
    public static final int INSTALL_STATE_INSTALLING = 1;
    public static final int INSTALL_STATE_INSTALLED = 2;

    // Views composing the infobar.
    private Button mButton;
    private InfoBarControlLayout mMessageLayout;
    private View mTitleView;
    private View mIconView;

    private final String mAppTitle;

    // Data for native app installs.
    private final AppData mAppData;
    private int mInstallState;

    // Data for web app installs.
    private final String mAppUrl;

    // Indicates whether the infobar is for installing a WebAPK.
    private boolean mIsWebApk;

    // Banner for native apps.
    private AppBannerInfoBarAndroid(String appTitle, Bitmap iconBitmap, AppData data) {
        super(0, iconBitmap, appTitle, null, data.installButtonText(), null);
        mAppTitle = appTitle;
        mAppData = data;
        mAppUrl = null;
        mInstallState = INSTALL_STATE_NOT_INSTALLED;
    }

    // Banner for web apps.
    private AppBannerInfoBarAndroid(String appTitle, Bitmap iconBitmap, String url, boolean isWebApk) {
        super(0, iconBitmap, appTitle, null, getAddToHomescreenText(), null);
        mAppTitle = appTitle;
        mAppData = null;
        mAppUrl = url;
        mIsWebApk = isWebApk;
        mInstallState = INSTALL_STATE_NOT_INSTALLED;
    }

    @Override
    public void createContent(InfoBarLayout layout) {
        super.createContent(layout);

        mButton = layout.getPrimaryButton();
        mIconView = layout.getIcon();
        layout.setIsUsingBigIcon();
        layout.setMessage(mAppTitle);

        mMessageLayout = layout.getMessageLayout();
        mTitleView = layout.getMessageTextView();

        Context context = getContext();
        if (mAppData != null) {
            // Native app.
            layout.getPrimaryButton().setButtonColor(
                    ApiCompatibilityUtils.getColor(context.getResources(), R.color.app_banner_install_button_bg));
            mMessageLayout.addRatingBar(mAppData.rating());
            mMessageLayout.setContentDescription(context
                    .getString(R.string.app_banner_view_native_app_accessibility, mAppTitle, mAppData.rating()));
            updateButton();
        } else {
            // Web app.
            mMessageLayout.addDescription(mAppUrl);
            mMessageLayout.setContentDescription(
                    context.getString(R.string.app_banner_view_web_app_accessibility, mAppTitle, mAppUrl));
        }

        // Hide uninteresting views from accessibility.
        if (mIconView != null) {
            ViewCompat.setImportantForAccessibility(mIconView, View.IMPORTANT_FOR_ACCESSIBILITY_NO);
        }

        // Clicking on the controls brings up the app's details.  The OnClickListener has to be
        // added to both the TextView and its parent because the TextView has special handling for
        // links within the text.
        mMessageLayout.setOnClickListener(this);
        mTitleView.setOnClickListener(this);
        if (mIconView != null)
            mIconView.setOnClickListener(this);
    }

    @Override
    protected void setButtons(InfoBarLayout layout, String primaryText, String secondaryText) {
        if (mAppData == null) {
            // The banner for web apps uses standard buttons.
            super.setButtons(layout, primaryText, secondaryText);
        } else {
            // The banner for native apps shows a Play logo in place of a secondary button.
            assert secondaryText == null;
            ImageView playLogo = new ImageView(layout.getContext());
            playLogo.setImageResource(R.drawable.google_play);
            layout.setBottomViews(primaryText, playLogo, DualControlLayout.ALIGN_APART);
        }
    }

    @Override
    public void onButtonClicked(boolean isPrimaryButton) {
        if (isPrimaryButton && mInstallState == INSTALL_STATE_INSTALLING) {
            setControlsEnabled(true);
            updateButton();
            return;
        }
        super.onButtonClicked(isPrimaryButton);
    }

    @CalledByNative
    public void onInstallStateChanged(int newState) {
        setControlsEnabled(true);
        mInstallState = newState;
        updateButton();
    }

    private void updateButton() {
        if (mButton == null || (mAppData == null && !mIsWebApk))
            return;

        String text;
        String accessibilityText = null;
        boolean enabled = true;
        Context context = getContext();
        if (mInstallState == INSTALL_STATE_NOT_INSTALLED) {
            if (mIsWebApk) {
                // If the installation of the WebAPK fails, the banner will disappear and
                // a failure toast will be shown.
                return;
            }
            text = mAppData.installButtonText();
            accessibilityText = context.getString(R.string.app_banner_view_native_app_install_accessibility, text);
        } else if (mInstallState == INSTALL_STATE_INSTALLING) {
            text = mIsWebApk ? context.getString(R.string.app_banner_installing_webapk)
                    : context.getString(R.string.app_banner_installing);
            enabled = false;
        } else {
            text = context.getString(R.string.app_banner_open);
        }

        mButton.setText(text);
        mButton.setContentDescription(accessibilityText);
        mButton.setEnabled(enabled);
    }

    @Override
    public void onClick(View v) {
        if (v == mMessageLayout || v == mTitleView || v == mIconView)
            onLinkClicked();
    }

    private static String getAddToHomescreenText() {
        return ContextUtils.getApplicationContext().getString(R.string.menu_add_to_homescreen);
    }

    @CalledByNative
    private static InfoBar createNativeAppInfoBar(String appTitle, Bitmap iconBitmap, AppData appData) {
        return new AppBannerInfoBarAndroid(appTitle, iconBitmap, appData);
    }

    @CalledByNative
    private static InfoBar createWebAppInfoBar(String appTitle, Bitmap iconBitmap, String url, boolean isWebApk) {
        return new AppBannerInfoBarAndroid(appTitle, iconBitmap, url, isWebApk);
    }
}