// 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.help;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Browser;
import android.text.TextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.feedback.FeedbackCollector;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.util.UrlUtilities;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Launches an activity that displays a relevant support page and has an option to provide feedback.
*/
public class HelpAndFeedback {
protected static final String FALLBACK_SUPPORT_URL =
"https://support.google.com/chrome/topic/6069782";
private static HelpAndFeedback sInstance;
/**
* Returns the singleton instance of HelpAndFeedback, creating it if needed.
*/
@SuppressFBWarnings("LI_LAZY_INIT_STATIC")
public static HelpAndFeedback getInstance(Context context) {
ThreadUtils.assertOnUiThread();
if (sInstance == null) {
sInstance = ((ChromeApplication) context.getApplicationContext())
.createHelpAndFeedback();
}
return sInstance;
}
/**
* Starts an activity showing a help page for the specified context ID.
*
* @param activity The activity to use for starting the help activity and to take a
* screenshot of.
* @param helpContext One of the CONTEXT_* constants. This should describe the user's current
* context and will be used to show a more relevant help page.
* @param collector the {@link FeedbackCollector} to use for extra data. Must not be null.
*/
protected void show(
Activity activity, String helpContext, @Nonnull FeedbackCollector collector) {
launchFallbackSupportUri(activity);
}
/**
* Starts an activity showing a help page for the specified context ID.
*
* @param activity The activity to use for starting the help activity and to take a
* screenshot of.
* @param helpContext One of the CONTEXT_* constants. This should describe the user's current
* context and will be used to show a more relevant help page.
* @param profile the current profile.
* @param url the current URL. May be null.
*/
public void show(final Activity activity, final String helpContext, Profile profile,
@Nullable String url) {
FeedbackCollector.create(activity, profile, url, new FeedbackCollector.FeedbackResult() {
@Override
public void onResult(FeedbackCollector collector) {
show(activity, helpContext, collector);
}
});
}
/**
* Get help context ID from URL.
*
* @param url The URL to be checked.
* @param isIncognito Whether we are in incognito mode or not.
* @return Help context ID that matches the URL and incognito mode.
*/
public static String getHelpContextIdFromUrl(Context context, String url, boolean isIncognito) {
if (TextUtils.isEmpty(url)) {
return context.getString(R.string.help_context_general);
} else if (url.startsWith(UrlConstants.BOOKMARKS_URL)) {
return context.getString(R.string.help_context_bookmarks);
} else if (url.equals(UrlConstants.HISTORY_URL)) {
return context.getString(R.string.help_context_history);
// Note: For www.google.com the following function returns false.
} else if (UrlUtilities.nativeIsGoogleSearchUrl(url)) {
return context.getString(R.string.help_context_search_results);
// For incognito NTP, we want to show incognito help.
} else if (isIncognito) {
return context.getString(R.string.help_context_incognito);
} else if (url.equals(UrlConstants.NTP_URL)) {
return context.getString(R.string.help_context_new_tab);
}
return context.getString(R.string.help_context_webpage);
}
protected static void launchFallbackSupportUri(Context context) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(FALLBACK_SUPPORT_URL));
// Let Chrome know that this intent is from Chrome, so that it does not close the app when
// the user presses 'back' button.
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
intent.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true);
intent.setPackage(context.getPackageName());
context.startActivity(intent);
}
}