2019-09-18 22:29:09 +02:00

358 lines
14 KiB
Java

package com.danielstone.materialaboutlibrary;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import android.webkit.WebView;
import android.widget.Toast;
import com.danielstone.materialaboutlibrary.items.MaterialAboutActionItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutItemOnClickAction;
import com.danielstone.materialaboutlibrary.items.MaterialAboutTitleItem;
import com.danielstone.materialaboutlibrary.model.MaterialAboutCard;
import com.danielstone.materialaboutlibrary.util.OpenSourceLicense;
@SuppressWarnings("JavaDoc")
public class ConvenienceBuilder {
public static MaterialAboutTitleItem createAppTitleItem(String appName, Drawable applicationIcon) {
return new MaterialAboutTitleItem(appName, null, applicationIcon);
}
public static MaterialAboutTitleItem createAppTitleItem(Context c) {
Context applicationContext = c.getApplicationContext();
PackageManager packageManager = applicationContext.getPackageManager();
ApplicationInfo applicationInfo = applicationContext.getApplicationInfo();
CharSequence appName = packageManager.getApplicationLabel(applicationInfo);
Drawable applicationIcon = packageManager.getApplicationIcon(applicationInfo);
return createAppTitleItem(appName == null ? "" : appName.toString(), applicationIcon);
}
/**
* Creates an item with version info read from the PackageManager for current application.
*
* @param c context
* @param icon
* @param text
* @param includeVersionCode
* @return Item to add to card.
*/
public static MaterialAboutActionItem createVersionActionItem(Context c, Drawable icon, CharSequence text, boolean includeVersionCode) {
String versionName = "";
int versionCode = 0;
try {
PackageInfo pInfo = c.getPackageManager().getPackageInfo(c.getPackageName(), 0);
versionName = pInfo.versionName;
versionCode = pInfo.versionCode;
} catch (PackageManager.NameNotFoundException ignored) {
// This shouldn't happen.
}
return new MaterialAboutActionItem.Builder()
.text(text)
.subText(versionName + (includeVersionCode ? " (" + versionCode + ")" : ""))
.icon(icon)
.build();
}
public static MaterialAboutItemOnClickAction createWebViewDialogOnClickAction(final Context c, final CharSequence dialogTitle, final String htmlString, final boolean isStringUrl, final boolean supportZoom) {
return createWebViewDialogOnClickAction(c, dialogTitle, c.getString(R.string.mal_close), htmlString, isStringUrl, supportZoom);
}
public static MaterialAboutItemOnClickAction createWebViewDialogOnClickAction(final Context c, final CharSequence dialogTitle, final CharSequence dialogNegativeButton, final String htmlString, final boolean isStringUrl, final boolean supportZoom) {
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(c);
alertBuilder.setTitle(dialogTitle);
final WebView wv = new WebView(c);
wv.getSettings().setSupportZoom(supportZoom);
if (!supportZoom) {
wv.getSettings().setLoadWithOverviewMode(true);
wv.getSettings().setUseWideViewPort(true);
}
if (isStringUrl) {
wv.loadUrl(htmlString);
} else {
wv.loadData(htmlString, "text/html; charset=utf-8", "UTF-8");
}
alertBuilder.setView(wv);
alertBuilder.setNegativeButton(dialogNegativeButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
wv.destroy();
dialog.dismiss();
}
});
final AlertDialog dialog = alertBuilder.create();
dialog.show();
}
};
}
public static MaterialAboutActionItem createWebViewDialogItem(Context c, Drawable icon, CharSequence text, @Nullable CharSequence subText, CharSequence dialogTitle, String htmlString, boolean isStringUrl, boolean supportZoom) {
return createWebViewDialogItem(c, icon, text, subText, dialogTitle, c.getString(R.string.mal_close), htmlString, isStringUrl, supportZoom);
}
public static MaterialAboutActionItem createWebViewDialogItem(Context c, Drawable icon, CharSequence text, @Nullable CharSequence subText, CharSequence dialogTitle, CharSequence dialogNegativeButton, String htmlString, boolean isStringUrl, boolean supportZoom) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText(subText)
.icon(icon)
.setOnClickAction(createWebViewDialogOnClickAction(c, dialogTitle, dialogNegativeButton, htmlString, isStringUrl, supportZoom))
.build();
}
public static MaterialAboutItemOnClickAction createWebsiteOnClickAction(final Context c, final Uri websiteUrl) {
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(websiteUrl);
try {
c.startActivity(i);
} catch (Exception e) {
// No activity to handle intent
Toast.makeText(c, R.string.mal_activity_exception, Toast.LENGTH_SHORT).show();
}
}
};
}
/**
* Creates an ActionItem which will open a url when tapped
*
* @param c context
* @param text
* @param icon
* @param websiteUrl (subText)
* @return Item to add to card.
*/
public static MaterialAboutActionItem createWebsiteActionItem(Context c, Drawable icon, CharSequence text, boolean showAddress, final Uri websiteUrl) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText((showAddress ? websiteUrl.toString() : null))
.icon(icon)
.setOnClickAction(createWebsiteOnClickAction(c, websiteUrl))
.build();
}
/**
* Creates a MaterialAboutItemOnClickAction that will open
* the Google Play store listing for the app.
*
* @param c context
* @return onClickAction
*/
public static MaterialAboutItemOnClickAction createRateOnClickAction(final Context c) {
Uri uri = Uri.parse("market://details?id=" + c.getPackageName());
final Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
} else {
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
try {
c.startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
c.startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/apps/details?id=" + c.getPackageName())));
}
}
};
}
/**
* Creates an ActionItem which will open the play store when tapped
*
* @param c context
* @param text
* @param subText
* @param icon
* @return Item to add to card.
*/
public static MaterialAboutActionItem createRateActionItem(Context c, Drawable icon, CharSequence text, @Nullable CharSequence subText) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText(subText)
.icon(icon)
.setOnClickAction(createRateOnClickAction(c))
.build();
}
public static MaterialAboutItemOnClickAction createEmailOnClickAction(final Context c, String email, String emailSubject) {
return createEmailOnClickAction(c, email, emailSubject, c.getString(R.string.mal_send_email));
}
/**
* Creates a MaterialAboutItemOnClickAction that will open
* an email intent with specified address.
*
* @param c context
* @param email email address
* @return onClickAction
*/
public static MaterialAboutItemOnClickAction createEmailOnClickAction(final Context c, String email, String emailSubject, final CharSequence chooserTitle) {
final Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, emailSubject);
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
try {
c.startActivity(Intent.createChooser(emailIntent, chooserTitle));
} catch (Exception e) {
// No activity to handle intent
Toast.makeText(c, R.string.mal_activity_exception, Toast.LENGTH_SHORT).show();
}
}
};
}
/**
* Creates an ActionItem which will open the an email intent when tapped
*
* @param c context
* @param text
* @param icon
* @param email email address (also used as subText)
* @return Item to add to card.
*/
public static MaterialAboutActionItem createEmailItem(Context c, Drawable icon, CharSequence text, boolean showEmail, String email, String emailSubject, CharSequence chooserTitle) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText((showEmail ? email : null))
.icon(icon)
.setOnClickAction(createEmailOnClickAction(c, email, emailSubject, chooserTitle))
.build();
}
public static MaterialAboutActionItem createEmailItem(Context c, Drawable icon, CharSequence text, boolean showEmail, String email, String emailSubject) {
return createEmailItem(c, icon, text, showEmail, email, emailSubject, c.getString(R.string.mal_send_email));
}
/**
* Creates a MaterialAboutItemOnClickAction that will open
* the dialer with specified number.
*
* @param c context
* @param number phone number
* @return onClickAction
*/
public static MaterialAboutItemOnClickAction createPhoneOnClickAction(final Context c, String number) {
final Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
phoneIntent.setData(Uri.parse("tel:" + number));
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
try {
c.startActivity(phoneIntent);
} catch (Exception e) {
// No activity to handle intent
Toast.makeText(c, R.string.mal_activity_exception, Toast.LENGTH_SHORT).show();
}
}
};
}
/**
* Creates an ActionItem which will open the dialer when tapped
*
* @param c context
* @param text
* @param icon
* @param number phone number (also used as subText)
* @return Item to add to card.
*/
public static MaterialAboutActionItem createPhoneItem(Context c, Drawable icon, CharSequence text, boolean showNumber, String number) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText((showNumber ? number : null))
.icon(icon)
.setOnClickAction(createPhoneOnClickAction(c, number))
.build();
}
/**
* Creates a MaterialAboutItemOnClickAction that will open
* maps with a query.
* Query can be either lat,lng(label) or written address
*
* @param c context
* @param addressQuery address query
* @return onClickAction
*/
public static MaterialAboutItemOnClickAction createMapOnClickAction(final Context c, String addressQuery) {
final Intent mapIntent = new Intent(Intent.ACTION_VIEW);
mapIntent.setData(Uri.parse("geo:0,0").buildUpon().appendQueryParameter("q", addressQuery).build());
return new MaterialAboutItemOnClickAction() {
@Override
public void onClick() {
try {
c.startActivity(mapIntent);
} catch (Exception e) {
// No activity to handle intent
Toast.makeText(c, R.string.mal_activity_exception, Toast.LENGTH_SHORT).show();
}
}
};
}
/**
* Creates an ActionItem which will open maps when tapped
* Query can be either lat,lng(label) or written address
*
* @param c context
* @param text
* @param subText can be set to null
* @param icon
* @param addressQuery addressQuery
* @return Item to add to card.
*/
public static MaterialAboutActionItem createMapItem(Context c, Drawable icon, CharSequence text, CharSequence subText, String addressQuery) {
return new MaterialAboutActionItem.Builder()
.text(text)
.subText(subText)
.icon(icon)
.setOnClickAction(createMapOnClickAction(c, addressQuery))
.build();
}
public static MaterialAboutCard createLicenseCard(Context c, Drawable icon, CharSequence libraryTitle, CharSequence year, CharSequence name, OpenSourceLicense license) {
MaterialAboutActionItem licenseItem = new MaterialAboutActionItem.Builder()
.icon(icon)
.setIconGravity(MaterialAboutActionItem.GRAVITY_TOP)
.text(libraryTitle)
.subText(String.format(c.getString(license.getResourceId()), year, name))
.build();
return new MaterialAboutCard.Builder().addItem(licenseItem).build();
}
}