package com.boardgamegeek.util;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.ShareCompat;
import android.text.TextUtils;
import android.util.Pair;
import android.widget.Toast;
import com.boardgamegeek.R;
import com.boardgamegeek.events.PlaySelectedEvent;
import com.boardgamegeek.model.Play;
import com.boardgamegeek.model.persister.PlayPersister;
import com.boardgamegeek.provider.BggContract;
import com.boardgamegeek.provider.BggContract.Games;
import com.boardgamegeek.service.SyncService;
import com.boardgamegeek.ui.BuddyActivity;
import com.boardgamegeek.ui.GamePlaysActivity;
import com.boardgamegeek.ui.ImageActivity;
import com.boardgamegeek.ui.LocationActivity;
import com.boardgamegeek.ui.LogPlayActivity;
import com.boardgamegeek.ui.PlayActivity;
import com.boardgamegeek.util.fabric.PlayManipulationEvent;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.crashlytics.android.answers.ShareEvent;
import java.util.ArrayList;
import java.util.List;
import timber.log.Timber;
public class ActivityUtils {
public static final String KEY_INTERNAL_ID = "_ID";
public static final String KEY_TITLE = "TITLE";
public static final String KEY_GAME_ID = "GAME_ID";
public static final String KEY_GAME_NAME = "GAME_NAME";
public static final String KEY_COLLECTION_ID = "COLLECTION_ID";
public static final String KEY_COLLECTION_NAME = "COLLECTION_NAME";
public static final String KEY_IMAGE_URL = "IMAGE_URL";
public static final String KEY_THUMBNAIL_URL = "THUMBNAIL_URL";
public static final String KEY_END_PLAY = "END_PLAY";
public static final String KEY_REMATCH = "REMATCH";
public static final String KEY_CUSTOM_PLAYER_SORT = "CUSTOM_PLAYER_SORT";
public static final String KEY_FROM_SHORTCUT = "FROM_SHORTCUT";
public static final String KEY_QUERY_TOKEN = "QUERY_TOKEN";
public static final String KEY_SORT = "SORT";
public static final String KEY_LOCATION = "LOCATION";
public static final String KEY_BUDDY_NAME = "BUDDY_NAME";
public static final String KEY_PLAYER_NAME = "PLAYER_NAME";
public static final String KEY_USER = "USER";
public static final String KEY_USERNAME = "USERNAME";
public static final String KEY_FORUM_ID = "FORUM_ID";
public static final String KEY_FORUM_TITLE = "FORUM_TITLE";
public static final String KEY_THREAD_ID = "THREAD_ID";
public static final String KEY_THREAD_SUBJECT = "THREAD_SUBJECT";
public static final String KEY_ARTICLE_ID = "ARTICLE_ID";
public static final String KEY_POST_DATE = "POST_DATE";
public static final String KEY_EDIT_DATE = "EDIT_DATE";
public static final String KEY_EDIT_COUNT = "EDIT_COUNT";
public static final String KEY_BODY = "BODY";
public static final String KEY_LINK = "LINK";
public static final String KEY_LOCATION_NAME = "LOCATION_NAME";
public static final String KEY_TYPE = "TYPE";
public static final String KEY_ID = "GEEK_LIST_ID";
public static final String KEY_ORDER = "GEEK_LIST_ORDER";
public static final String KEY_NAME = "GEEK_LIST_NAME";
public static final String KEY_THUMBS = "GEEK_LIST_THUMBS";
public static final String KEY_IMAGE_ID = "GEEK_LIST_IMAGE_ID";
public static final String KEY_POSTED_DATE = "GEEK_LIST_POSTED_DATE";
public static final String KEY_EDITED_DATE = "GEEK_LIST_EDITED_DATE";
public static final String KEY_OBJECT_ID = "GEEK_LIST_OBJECT_ID";
public static final String KEY_OBJECT_URL = "GEEK_LIST_OBJECT_URL";
public static final String KEY_IS_BOARD_GAME = "GEEK_LIST_IS_BOARD_GAME";
public static final String KEY_HEADER_COLOR = "HEADER_COLOR";
public static final String KEY_ICON_COLOR = "ICON_COLOR";
public static final String KEY_COMMENTS = "COMMENTS";
public static final String LINK_AMAZON_COM = "www.amazon.com";
public static final String LINK_AMAZON_UK = "www.amazon.co.uk";
public static final String LINK_AMAZON_DE = "www.amazon.de";
private static final String BOARDGAME_PATH = "boardgame";
private static final Uri BGG_URI = Uri.parse("https://www.boardgamegeek.com/");
public static void launchGame(Context context, int gameId, String gameName) {
final Intent intent = createGameIntent(gameId, gameName);
if (intent == null) return;
context.startActivity(intent);
}
public static void navigateUpToGame(Context context, int gameId, String gameName) {
final Intent intent = createGameIntent(gameId, gameName);
if (intent == null) return;
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
@Nullable
public static Intent createGameIntent(int gameId, String gameName) {
if (gameId == BggContract.INVALID_ID) return null;
final Uri gameUri = Games.buildGameUri(gameId);
final Intent intent = new Intent(Intent.ACTION_VIEW, gameUri);
intent.putExtra(ActivityUtils.KEY_GAME_NAME, gameName);
return intent;
}
public static void startBuddyActivity(Context context, String username, String playerName) {
context.startActivity(createBuddyIntent(context, username, playerName));
}
public static void navigateUpToBuddy(Context context, String buddyName) {
navigateUpToBuddy(context, buddyName, null);
}
public static void navigateUpToBuddy(Context context, String buddyName, String playerName) {
Intent intent = createBuddyIntent(context, buddyName, playerName);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
private static Intent createBuddyIntent(Context context, String username, String playerName) {
Intent intent = new Intent(context, BuddyActivity.class);
intent.putExtra(ActivityUtils.KEY_BUDDY_NAME, username);
intent.putExtra(ActivityUtils.KEY_PLAYER_NAME, playerName);
return intent;
}
@NonNull
public static Intent createLocationIntent(Context context, String locationName) {
Intent intent = new Intent(context, LocationActivity.class);
intent.putExtra(ActivityUtils.KEY_LOCATION_NAME, locationName);
return intent;
}
public static void share(Activity activity, String subject, String text, @StringRes int titleResId) {
Intent intent = ShareCompat.IntentBuilder.from(activity)
.setType("text/plain")
.setSubject(subject.trim())
.setText(text.trim())
.setChooserTitle(titleResId)
.createChooserIntent();
activity.startActivity(intent);
}
public static void shareGame(Activity activity, int gameId, String gameName, String method) {
Resources r = activity.getResources();
String subject = String.format(r.getString(R.string.share_game_subject), gameName);
String text = r.getString(R.string.share_game_text) + "\n\n" + formatGameLink(gameId, gameName);
share(activity, subject, text, R.string.title_share_game);
Answers.getInstance().logShare(new ShareEvent()
.putMethod(method)
.putContentType("Game")
.putContentName(gameName)
.putContentId(String.valueOf(gameId)));
}
public static void shareGames(Activity activity, List<Pair<Integer, String>> games, String method) {
Resources r = activity.getResources();
StringBuilder text = new StringBuilder(r.getString(R.string.share_games_text));
text.append("\n").append("\n");
List<String> gameNames = new ArrayList<>();
List<String> gameIds = new ArrayList<>();
for (Pair<Integer, String> game : games) {
text.append(formatGameLink(game.first, game.second));
gameNames.add(game.second);
gameNames.add(String.valueOf(game.first));
}
share(activity, r.getString(R.string.share_games_subject), text.toString(), R.string.title_share_games);
Answers.getInstance().logShare(new ShareEvent()
.putMethod(method)
.putContentType("Games")
.putContentName(StringUtils.formatList(gameNames))
.putContentId(String.valueOf(StringUtils.formatList(gameIds))));
}
private static String formatGameLink(int id, String name) {
return String.format("%s (%s)\n", name, createBggUri(BOARDGAME_PATH, id));
}
public static void shareGeekList(Activity activity, int id, String title) {
String description = String.format(activity.getString(R.string.share_geeklist_text), title);
Uri uri = ActivityUtils.createBggUri("geeklist", id);
ActivityUtils.share(activity, activity.getString(R.string.share_geeklist_subject), description + "\n\n" + uri, R.string.title_share);
Answers.getInstance().logShare(new ShareEvent()
.putContentType("GeekList")
.putContentName(title)
.putContentId(String.valueOf(id)));
}
public static Intent createGamePlaysIntent(Context context, Uri gameUri, String gameName, String imageUrl, String thumbnailUrl) {
return createGamePlaysIntent(context, gameUri, gameName, imageUrl, thumbnailUrl, false, 0);
}
public static Intent createGamePlaysIntent(Context context, Uri gameUri, String gameName, String imageUrl, String thumbnailUrl, boolean arePlayersCustomSorted, int iconColor) {
Intent intent = new Intent(context, GamePlaysActivity.class);
intent.setData(gameUri);
intent.putExtra(ActivityUtils.KEY_GAME_NAME, gameName);
intent.putExtra(ActivityUtils.KEY_IMAGE_URL, imageUrl);
intent.putExtra(ActivityUtils.KEY_THUMBNAIL_URL, thumbnailUrl);
intent.putExtra(ActivityUtils.KEY_CUSTOM_PLAYER_SORT, arePlayersCustomSorted);
intent.putExtra(ActivityUtils.KEY_ICON_COLOR, iconColor);
return intent;
}
public static void startPlayActivity(Context context, PlaySelectedEvent event) {
Intent intent = createPlayIntent(context, event.getInternalId(), event.getGameId(), event.getGameName(), event.getThumbnailUrl(), event.getImageUrl());
context.startActivity(intent);
}
public static Intent createPlayIntent(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
Intent intent = new Intent(context, PlayActivity.class);
intent.putExtra(KEY_ID, internalId);
intent.putExtra(KEY_GAME_ID, gameId);
intent.putExtra(KEY_GAME_NAME, gameName);
intent.putExtra(KEY_THUMBNAIL_URL, thumbnailUrl);
intent.putExtra(KEY_IMAGE_URL, imageUrl);
return intent;
}
public static void editPlay(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
PlayManipulationEvent.log("Edit", gameName);
Intent intent = createEditPlayIntent(context, internalId, gameId, gameName, thumbnailUrl, imageUrl);
context.startActivity(intent);
}
public static void endPlay(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
Intent intent = createEditPlayIntent(context, internalId, gameId, gameName, thumbnailUrl, imageUrl);
intent.putExtra(KEY_END_PLAY, true);
context.startActivity(intent);
}
public static void rematch(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
Intent intent = createRematchIntent(context, internalId, gameId, gameName, thumbnailUrl, imageUrl);
context.startActivity(intent);
}
public static Intent createRematchIntent(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
Intent intent = createEditPlayIntent(context, internalId, gameId, gameName, thumbnailUrl, imageUrl);
intent.putExtra(KEY_REMATCH, true);
return intent;
}
public static void logPlay(Context context, int gameId, String gameName, String thumbnailUrl, String imageUrl, boolean customPlayerSort) {
Intent intent = createEditPlayIntent(context, gameId, gameName, thumbnailUrl, imageUrl);
intent.putExtra(KEY_CUSTOM_PLAYER_SORT, customPlayerSort);
context.startActivity(intent);
}
public static Intent createEditPlayIntent(Context context, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
return createEditPlayIntent(context, BggContract.INVALID_ID, gameId, gameName, thumbnailUrl, imageUrl);
}
public static Intent createEditPlayIntent(Context context, long internalId, int gameId, String gameName, String thumbnailUrl, String imageUrl) {
Intent intent = new Intent(context, LogPlayActivity.class);
intent.putExtra(KEY_ID, internalId);
intent.putExtra(KEY_GAME_ID, gameId);
intent.putExtra(KEY_GAME_NAME, gameName);
intent.putExtra(KEY_THUMBNAIL_URL, thumbnailUrl);
intent.putExtra(KEY_IMAGE_URL, imageUrl);
return intent;
}
public static void startImageActivity(Context context, String imageUrl) {
if (TextUtils.isEmpty(imageUrl)) {
Timber.w("Missing the required image URL.");
return;
}
Intent intent = new Intent(context, ImageActivity.class);
intent.putExtra(KEY_IMAGE_URL, imageUrl);
context.startActivity(intent);
}
public static void logQuickPlay(Context context, int gameId, String gameName) {
Play play = new Play(gameId, gameName);
play.setCurrentDate();
play.updateTimestamp = System.currentTimeMillis();
new PlayPersister(context).save(play, BggContract.INVALID_ID, false);
SyncService.sync(context, SyncService.FLAG_SYNC_PLAYS_UPLOAD);
}
public static void linkBgg(Context context, int gameId) {
if (gameId == BggContract.INVALID_ID) {
return;
}
linkToBgg(context, BOARDGAME_PATH, gameId);
}
public static void linkBgPrices(Context context, String gameName) {
if (TextUtils.isEmpty(gameName)) {
return;
}
link(context, "http://boardgameprices.com/compare-prices-for?q=" + HttpUtils.encode(gameName));
}
public static void linkAmazon(Context context, String gameName, String domain) {
if (TextUtils.isEmpty(gameName)) {
return;
}
link(context, String.format("http://%s/gp/aw/s/?i=toys&keywords=%s", domain, HttpUtils.encode(gameName)));
}
public static void linkEbay(Context context, String gameName) {
if (TextUtils.isEmpty(gameName)) {
return;
}
link(context, "http://m.ebay.com/sch/i.html?_sacat=233&cnm=Games&_nkw=" + HttpUtils.encode(gameName));
}
public static void linkToBgg(Context context, String path) {
link(context, createBggUri(path));
Answers.getInstance().logCustom(new CustomEvent("Link")
.putCustomAttribute("Path", path));
}
public static void linkToBgg(Context context, String path, int id) {
link(context, createBggUri(path, id));
Answers.getInstance().logCustom(new CustomEvent("Link")
.putCustomAttribute("Path", path));
}
public static void link(Context context, String url) {
link(context, Uri.parse(url));
Answers.getInstance().logCustom(new CustomEvent("Link")
.putCustomAttribute("Url", url));
}
private static void link(Context context, Uri link) {
final Intent intent = new Intent(Intent.ACTION_VIEW, link);
if (isIntentAvailable(context, intent)) {
context.startActivity(intent);
} else {
String message = "Can't figure out how to launch " + link;
Timber.w(message);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
public static Uri createBggUri(String path) {
return BGG_URI.buildUpon().appendPath(path).build();
}
public static Uri createBggUri(String path, int id) {
return BGG_URI.buildUpon().appendPath(path).appendPath(String.valueOf(id)).build();
}
public static boolean isIntentAvailable(Context context, Intent intent) {
final PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
}