package org.wordpress.android.ui;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.text.TextUtils;
import android.widget.Toast;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.fluxc.model.PostModel;
import org.wordpress.android.fluxc.model.SiteModel;
import org.wordpress.android.networking.SSLCertsViewActivity;
import org.wordpress.android.ui.accounts.HelpActivity;
import org.wordpress.android.ui.accounts.NewBlogActivity;
import org.wordpress.android.ui.accounts.SignInActivity;
import org.wordpress.android.ui.comments.CommentsActivity;
import org.wordpress.android.ui.main.SitePickerActivity;
import org.wordpress.android.ui.media.MediaBrowserActivity;
import org.wordpress.android.ui.media.MediaGalleryActivity;
import org.wordpress.android.ui.media.MediaGalleryPickerActivity;
import org.wordpress.android.ui.media.WordPressMediaUtils;
import org.wordpress.android.ui.people.PeopleManagementActivity;
import org.wordpress.android.ui.photopicker.PhotoPickerActivity;
import org.wordpress.android.ui.plans.PlansActivity;
import org.wordpress.android.ui.posts.EditPostActivity;
import org.wordpress.android.ui.posts.PostPreviewActivity;
import org.wordpress.android.ui.posts.PostsListActivity;
import org.wordpress.android.ui.prefs.AccountSettingsActivity;
import org.wordpress.android.ui.prefs.AppSettingsActivity;
import org.wordpress.android.ui.prefs.BlogPreferencesActivity;
import org.wordpress.android.ui.prefs.MyProfileActivity;
import org.wordpress.android.ui.prefs.notifications.NotificationsSettingsActivity;
import org.wordpress.android.ui.reader.ReaderPostPagerActivity;
import org.wordpress.android.ui.stats.StatsActivity;
import org.wordpress.android.ui.stats.StatsConstants;
import org.wordpress.android.ui.stats.StatsSingleItemDetailsActivity;
import org.wordpress.android.ui.stats.models.StatsPostModel;
import org.wordpress.android.ui.themes.ThemeBrowserActivity;
import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.HelpshiftHelper;
import org.wordpress.android.util.HelpshiftHelper.Tag;
import org.wordpress.android.util.ListUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.UrlUtils;
import org.wordpress.android.util.WPActivityUtils;
import org.wordpress.android.util.helpers.MediaGallery;
import org.wordpress.passcodelock.AppLockManager;
import java.util.ArrayList;
public class ActivityLauncher {
public static void showSitePickerForResult(Activity activity, SiteModel site) {
Intent intent = new Intent(activity, SitePickerActivity.class);
intent.putExtra(SitePickerActivity.KEY_LOCAL_ID, site.getId());
ActivityOptionsCompat options = ActivityOptionsCompat.makeCustomAnimation(
activity,
R.anim.activity_slide_in_from_left,
R.anim.do_nothing);
ActivityCompat.startActivityForResult(activity, intent, RequestCodes.SITE_PICKER, options.toBundle());
}
public static void showPhotoPickerForResult(Activity activity) {
Intent intent = new Intent(activity, PhotoPickerActivity.class);
activity.startActivityForResult(intent, RequestCodes.PHOTO_PICKER);
}
public static void viewBlogStats(Context context, SiteModel site) {
Intent intent = new Intent(context, StatsActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
}
public static void viewBlogPlans(Context context, SiteModel site) {
Intent intent = new Intent(context, PlansActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
}
public static void viewCurrentBlogPosts(Context context, SiteModel site) {
Intent intent = new Intent(context, PostsListActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_POSTS, site);
}
public static void viewCurrentBlogMedia(Context context, SiteModel site) {
Intent intent = new Intent(context, MediaBrowserActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_MEDIA_LIBRARY, site);
}
public static void viewCurrentBlogPages(Context context, SiteModel site) {
Intent intent = new Intent(context, PostsListActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.putExtra(PostsListActivity.EXTRA_VIEW_PAGES, true);
context.startActivity(intent);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_PAGES, site);
}
public static void viewCurrentBlogComments(Context context, SiteModel site) {
Intent intent = new Intent(context, CommentsActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_COMMENTS, site);
}
public static void viewCurrentBlogThemes(Context context, SiteModel site) {
if (ThemeBrowserActivity.isAccessible(site)) {
Intent intent = new Intent(context, ThemeBrowserActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
}
}
public static void viewCurrentBlogPeople(Context context, SiteModel site) {
Intent intent = new Intent(context, PeopleManagementActivity.class);
intent.putExtra(WordPress.SITE, site);
context.startActivity(intent);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_PEOPLE_MANAGEMENT, site);
}
public static void viewBlogSettingsForResult(Activity activity, SiteModel site) {
if (site == null) return;
Intent intent = new Intent(activity, BlogPreferencesActivity.class);
intent.putExtra(WordPress.SITE, site);
activity.startActivityForResult(intent, RequestCodes.SITE_SETTINGS);
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_BLOG_SETTINGS, site);
}
public static void viewCurrentSite(Context context, SiteModel site, boolean openFromHeader) {
if (site == null) {
Toast.makeText(context, context.getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show();
return;
}
AnalyticsTracker.Stat stat = openFromHeader ? AnalyticsTracker.Stat.OPENED_VIEW_SITE_FROM_HEADER
: AnalyticsTracker.Stat.OPENED_VIEW_SITE;
AnalyticsUtils.trackWithSiteDetails(stat, site);
openUrlExternal(context, site.getUrl());
}
public static void viewBlogAdmin(Context context, SiteModel site) {
if (site == null || site.getAdminUrl() == null) {
Toast.makeText(context, context.getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show();
return;
}
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_VIEW_ADMIN, site);
openUrlExternal(context, site.getAdminUrl());
}
public static void viewPostPreviewForResult(Activity activity, SiteModel site, PostModel post, boolean isPage) {
if (post == null) return;
Intent intent = new Intent(activity, PostPreviewActivity.class);
intent.putExtra(PostPreviewActivity.EXTRA_POST, post);
intent.putExtra(WordPress.SITE, site);
activity.startActivityForResult(intent, RequestCodes.PREVIEW_POST);
}
public static void newMediaPost(Activity context, SiteModel site, ArrayList<Long> mediaIds) {
if (site == null || mediaIds == null) return;
// Create a new post object and assign default settings
Intent intent = new Intent(context, EditPostActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.setAction(EditPostActivity.NEW_MEDIA_POST);
intent.putExtra(EditPostActivity.NEW_MEDIA_POST_EXTRA_IDS, ListUtils.toLongArray(mediaIds));
context.startActivity(intent);
}
public static void addNewPostOrPageForResult(Activity activity, SiteModel site, boolean isPage) {
if (site == null) return;
Intent intent = new Intent(activity, EditPostActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.putExtra(EditPostActivity.EXTRA_IS_PAGE, isPage);
activity.startActivityForResult(intent, RequestCodes.EDIT_POST);
}
public static void editPostOrPageForResult(Activity activity, SiteModel site, PostModel post) {
if (site == null) return;
Intent intent = new Intent(activity, EditPostActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.putExtra(EditPostActivity.EXTRA_POST, post);
activity.startActivityForResult(intent, RequestCodes.EDIT_POST);
}
/*
* Load the post preview as an authenticated URL so stats aren't bumped
*/
public static void browsePostOrPage(Context context, SiteModel site, PostModel post) {
if (site == null || post == null || TextUtils.isEmpty(post.getLink())) return;
// always add the preview parameter to avoid bumping stats when viewing posts
String url = UrlUtils.appendUrlParameter(post.getLink(), "preview", "true");
String shareableUrl = post.getLink();
String shareSubject = post.getTitle();
if (site.isWPCom()) {
if (!TextUtils.isEmpty(site.getUnmappedUrl())) {
// Custom domains are not properly authenticated due to a server side(?) issue, so this gets around that
url = url.replace(site.getUrl(), site.getUnmappedUrl());
}
WPWebViewActivity.openPostUrlByUsingGlobalWPCOMCredentials(context, url, shareableUrl, shareSubject);
} else if (site.isJetpackConnected()) {
WPWebViewActivity.openJetpackBlogPostPreview(context, url, shareableUrl, shareSubject, site.getFrameNonce());
} else {
// Add the original post URL to the list of allowed URLs.
// This is necessary because links are disabled in the webview, but WP removes "?preview=true"
// from the passed URL, and internally redirects to it. EX:Published posts on a site with Plain
// permalink structure settings.
// Ref: https://github.com/wordpress-mobile/WordPress-Android/issues/4873
WPWebViewActivity.openUrlByUsingBlogCredentials(context, site, post, url, new String[]{post.getLink()});
}
}
public static void addMedia(Activity activity) {
WordPressMediaUtils.launchPictureLibrary(activity);
}
public static void viewMyProfile(Context context) {
Intent intent = new Intent(context, MyProfileActivity.class);
AnalyticsTracker.track(AnalyticsTracker.Stat.OPENED_MY_PROFILE);
context.startActivity(intent);
}
public static void viewAccountSettings(Context context) {
Intent intent = new Intent(context, AccountSettingsActivity.class);
AnalyticsTracker.track(AnalyticsTracker.Stat.OPENED_ACCOUNT_SETTINGS);
context.startActivity(intent);
}
public static void viewAppSettings(Activity activity) {
Intent intent = new Intent(activity, AppSettingsActivity.class);
AnalyticsTracker.track(AnalyticsTracker.Stat.OPENED_APP_SETTINGS);
activity.startActivityForResult(intent, RequestCodes.APP_SETTINGS);
}
public static void viewNotificationsSettings(Activity activity) {
Intent intent = new Intent(activity, NotificationsSettingsActivity.class);
activity.startActivity(intent);
}
public static void viewHelpAndSupport(Context context, Tag origin) {
Intent intent = new Intent(context, HelpActivity.class);
intent.putExtra(HelpshiftHelper.ORIGIN_KEY, origin);
context.startActivity(intent);
}
public static void viewSSLCerts(Context context, String certificateString) {
Intent intent = new Intent(context, SSLCertsViewActivity.class);
intent.putExtra(SSLCertsViewActivity.CERT_DETAILS_KEYS, certificateString.replaceAll("\n", "<br/>"));
context.startActivity(intent);
}
public static void newBlogForResult(Activity activity) {
Intent intent = new Intent(activity, NewBlogActivity.class);
intent.putExtra(NewBlogActivity.KEY_START_MODE, NewBlogActivity.CREATE_BLOG);
activity.startActivityForResult(intent, RequestCodes.CREATE_SITE);
}
public static void showSignInForResult(Activity activity) {
Intent intent = new Intent(activity, SignInActivity.class);
activity.startActivityForResult(intent, RequestCodes.ADD_ACCOUNT);
}
public static void viewStatsSinglePostDetails(Context context, SiteModel site, PostModel post, boolean isPage) {
if (post == null) return;
StatsPostModel statsPostModel = new StatsPostModel(site.getSiteId(),
String.valueOf(post.getRemotePostId()), post.getTitle(), post.getLink(),
isPage ? StatsConstants.ITEM_TYPE_PAGE : StatsConstants.ITEM_TYPE_POST);
viewStatsSinglePostDetails(context, statsPostModel);
}
public static void viewStatsSinglePostDetails(Context context, StatsPostModel post) {
if (post == null) return;
Intent statsPostViewIntent = new Intent(context, StatsSingleItemDetailsActivity.class);
statsPostViewIntent.putExtra(StatsSingleItemDetailsActivity.ARG_REMOTE_BLOG_ID, post.getBlogID());
statsPostViewIntent.putExtra(StatsSingleItemDetailsActivity.ARG_REMOTE_ITEM_ID, post.getItemID());
statsPostViewIntent.putExtra(StatsSingleItemDetailsActivity.ARG_REMOTE_ITEM_TYPE, post.getPostType());
statsPostViewIntent.putExtra(StatsSingleItemDetailsActivity.ARG_ITEM_TITLE, post.getTitle());
statsPostViewIntent.putExtra(StatsSingleItemDetailsActivity.ARG_ITEM_URL, post.getUrl());
context.startActivity(statsPostViewIntent);
}
public static void viewMediaGalleryPickerForSite(Activity activity, @NonNull SiteModel site) {
Intent intent = new Intent(activity, MediaGalleryPickerActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.putExtra(MediaGalleryPickerActivity.PARAM_SELECT_ONE_ITEM, false);
activity.startActivityForResult(intent, MediaGalleryPickerActivity.REQUEST_CODE);
}
public static void viewMediaGalleryPickerForSiteAndMediaIds(Activity activity, @NonNull SiteModel site,
@NonNull ArrayList<Long> mediaIds) {
Intent intent = new Intent(activity, MediaGalleryPickerActivity.class);
intent.putExtra(WordPress.SITE, site);
if (mediaIds != null && !mediaIds.isEmpty()) {
intent.putExtra(MediaGalleryPickerActivity.PARAM_SELECTED_IDS, ListUtils.toLongArray(mediaIds));
}
activity.startActivityForResult(intent, MediaGalleryPickerActivity.REQUEST_CODE);
}
public static void viewMediaGalleryForSiteAndGallery(Activity activity, @NonNull SiteModel site,
@Nullable MediaGallery mediaGallery) {
Intent intent = new Intent(activity, MediaGalleryActivity.class);
intent.putExtra(WordPress.SITE, site);
intent.putExtra(MediaGalleryActivity.PARAMS_MEDIA_GALLERY, mediaGallery);
if (mediaGallery == null) {
intent.putExtra(MediaGalleryActivity.PARAMS_LAUNCH_PICKER, true);
}
activity.startActivityForResult(intent, MediaGalleryActivity.REQUEST_CODE);
}
public static void addSelfHostedSiteForResult(Activity activity) {
Intent intent = new Intent(activity, SignInActivity.class);
intent.putExtra(SignInActivity.EXTRA_START_FRAGMENT, SignInActivity.ADD_SELF_HOSTED_BLOG);
activity.startActivityForResult(intent, RequestCodes.ADD_ACCOUNT);
}
public static void loginWithoutMagicLink(Activity activity) {
Intent signInIntent = new Intent(activity, SignInActivity.class);
signInIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
signInIntent.putExtra(SignInActivity.EXTRA_INHIBIT_MAGIC_LOGIN, true);
activity.startActivityForResult(signInIntent, RequestCodes.DO_LOGIN);
}
/*
* open the passed url in the device's external browser
*/
public static void openUrlExternal(Context context, @NonNull String url) {
try {
// disable deeplinking activity so to not catch WP URLs
WPActivityUtils.disableComponent(context, ReaderPostPagerActivity.class);
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);
AppLockManager.getInstance().setExtendedTimeout();
} catch (ActivityNotFoundException e) {
ToastUtils.showToast(context, context.getString(R.string.no_default_app_available_to_open_link), ToastUtils.Duration.LONG);
AppLog.e(AppLog.T.UTILS, "No default app available on the device to open the link: " + url, e);
} finally {
// re-enable deeplinking
WPActivityUtils.enableComponent(context, ReaderPostPagerActivity.class);
}
}
}