blob: 1c27991a9286568607d47480c0f5ad7741669fb9 [file] [log] [blame]
// Copyright 2018 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.banners;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Pair;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.PackageUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenDialogView;
import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenProperties;
import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenViewBinder;
import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenViewDelegate;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
/**
* Handles the promotion and installation of an app specified by the current web page. This object
* is created by and owned by the native AppBannerUiDelegate.
*/
@JNINamespace("banners")
public class AppBannerUiDelegateAndroid implements AddToHomescreenViewDelegate {
private static final String TAG = "AppBannerUi";
/** Pointer to the native AppBannerUiDelegateAndroid. */
private long mNativePointer;
private Tab mTab;
private PropertyModel mViewModel;
private boolean mAddedToHomescreen;
private AppBannerUiDelegateAndroid(long nativePtr, Tab tab) {
mNativePointer = nativePtr;
mTab = tab;
}
@Override
public void onAddToHomescreen(String title) {
mAddedToHomescreen = true;
// The title is ignored for app banners as we respect the developer-provided title.
if (mNativePointer != 0) {
AppBannerUiDelegateAndroidJni.get().addToHomescreen(
mNativePointer, AppBannerUiDelegateAndroid.this);
}
}
@Override
public boolean onAppDetailsRequested() {
if (mNativePointer != 0) {
return AppBannerUiDelegateAndroidJni.get().showNativeAppDetails(
mNativePointer, AppBannerUiDelegateAndroid.this);
}
return false;
}
@Override
public void onViewDismissed() {
if (!mAddedToHomescreen && mNativePointer != 0) {
AppBannerUiDelegateAndroidJni.get().onUiCancelled(
mNativePointer, AppBannerUiDelegateAndroid.this);
}
mViewModel = null;
mAddedToHomescreen = false;
}
@CalledByNative
private void destroy() {
mNativePointer = 0;
mAddedToHomescreen = false;
}
@CalledByNative
private boolean installOrOpenNativeApp(AppData appData) {
Context context = ContextUtils.getApplicationContext();
Intent launchIntent;
if (PackageUtils.isPackageInstalled(context, appData.packageName())) {
launchIntent =
context.getPackageManager().getLaunchIntentForPackage(appData.packageName());
} else {
launchIntent = appData.installIntent();
}
if (launchIntent != null && mTab.getActivity() != null) {
try {
mTab.getActivity().startActivity(launchIntent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Failed to install or open app : %s!", appData.packageName(), e);
return false;
}
}
return true;
}
@CalledByNative
private void showAppDetails(AppData appData) {
mTab.getWindowAndroid().showIntent(appData.detailsIntent(), null, null);
}
/**
* Build a view model.
*
* @return An instance of {@link PropertyModel}.
*/
private PropertyModel createViewModel() {
PropertyModel model = new PropertyModel.Builder(AddToHomescreenProperties.ALL_KEYS).build();
PropertyModelChangeProcessor.create(model,
new AddToHomescreenDialogView(mTab.getActivity(),
mTab.getActivity().getModalDialogManager(),
AppBannerManager.getHomescreenLanguageOption(), this),
AddToHomescreenViewBinder::bind);
return model;
}
@CalledByNative
private boolean showNativeAppDialog(String title, Bitmap iconBitmap, AppData appData) {
mViewModel = createViewModel();
mViewModel.set(AddToHomescreenProperties.TITLE, title);
mViewModel.set(AddToHomescreenProperties.ICON, new Pair<>(iconBitmap, false));
mViewModel.set(AddToHomescreenProperties.TYPE, AddToHomescreenProperties.AppType.NATIVE);
mViewModel.set(AddToHomescreenProperties.CAN_SUBMIT, true);
mViewModel.set(AddToHomescreenProperties.NATIVE_APP_RATING, appData.rating());
mViewModel.set(
AddToHomescreenProperties.NATIVE_INSTALL_BUTTON_TEXT, appData.installButtonText());
return true;
}
@CalledByNative
private boolean showWebAppDialog(String title, Bitmap iconBitmap, String url) {
mViewModel = createViewModel();
mViewModel.set(AddToHomescreenProperties.TITLE, title);
mViewModel.set(AddToHomescreenProperties.ICON, new Pair<>(iconBitmap, false));
mViewModel.set(AddToHomescreenProperties.TYPE, AddToHomescreenProperties.AppType.WEB_APK);
mViewModel.set(AddToHomescreenProperties.CAN_SUBMIT, true);
mViewModel.set(AddToHomescreenProperties.URL, url);
return true;
}
@CalledByNative
private static AppBannerUiDelegateAndroid create(long nativePtr, Tab tab) {
return new AppBannerUiDelegateAndroid(nativePtr, tab);
}
@NativeMethods
interface Natives {
void addToHomescreen(
long nativeAppBannerUiDelegateAndroid, AppBannerUiDelegateAndroid caller);
void onUiCancelled(
long nativeAppBannerUiDelegateAndroid, AppBannerUiDelegateAndroid caller);
boolean showNativeAppDetails(
long nativeAppBannerUiDelegateAndroid, AppBannerUiDelegateAndroid caller);
}
}