diff --git a/README.md b/README.md index e1dc49b..24137eb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ [![Circle CI](https://circleci.com/gh/eggheadgames/android-about-box.svg?style=svg)](https://circleci.com/gh/eggheadgames/android-about-box) [![Release](https://jitpack.io/v/eggheadgames/android-about-box.svg)](https://jitpack.io/#eggheadgames/android-about-box) +![Downloads](https://jitpack.io/v/eggheadgames/android-about-box/month.svg) +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/eggheadgames/android-about-box/blob/develop/LICENSE) # About Box A modern About Box for an Android App built on the [daniel-stoneuk/material-about-library](https://github.com/daniel-stoneuk/material-about-library). @@ -8,10 +10,12 @@ A modern About Box for an Android App built on the [daniel-stoneuk/material-abou ## About -Android About Box is configured with a set of (mostly) strings for the company name, twitter and Facebook accounts, website, and filenames to html files for help files, privacy policy etc. +Android About Box is configured with a set of (mostly) strings for the company name, twitter and Facebook accounts, website, and filenames to html files for help files, privacy policy etc. When triggered from a menu item, it will display the app name, icon and version, provide links to contact support, leave a review, share the app, go to other apps by the same company in the app store -- as well as links to Facebook etc. +You can omit most features if they don't apply (e.g. like website), by not setting the values. + ## Installation Instructions Add the JitPack.io repository to your root `build.gradle`: @@ -32,12 +36,7 @@ dependencies { } ``` -## Example -### Setup Branch.io - -Branch.io integration can be found [here](https://github.com/BranchMetrics/android-branch-deep-linking) - -### Setup AboutBox +## Setup AboutBox Add AboutBox configuration to your Application class @@ -46,6 +45,7 @@ Add AboutBox configuration to your Application class aboutConfig.appName = getString(R.string.app_name); aboutConfig.appIcon = R.mipmap.ic_launcher; aboutConfig.version = "1.0.0"; + aboutConfig.author = "Tolstoy"; aboutConfig.aboutLabelTitle = "About App"; aboutConfig.packageName = getApplicationContext().getPackageName(); aboutConfig.buildType = google ? AboutConfig.BuildType.GOOGLE : AboutConfig.BuildType.AMAZON; @@ -88,18 +88,62 @@ Add AboutBox configuration to your Application class aboutConfig.emailSubject = EMAIL_SUBJECT; aboutConfig.emailBody = EMAIL_BODY; - // Branch.io labels. - aboutConfig.shareMessageTitle = getString(R.string.share_message_title); - aboutConfig.shareMessage = getString(R.string.share_message); - aboutConfig.sharingTitle = getString(R.string.sharing_title); + ``` -Open AboutBox screen +## Open the About Box from your app ```java AboutActivity.launch(activity); ``` + + +## Sharing + +By default, the default Android share intent will be called with the values specified in `shareMessage` and `sharingTitle`. For example: +```java + aboutConfig.shareMessage = getString(R.string.share_message); + aboutConfig.sharingTitle = getString(R.string.sharing_title); +``` +The `share_message` string will have an app store URL appended to it (appropriately constructed for Google Play or Amazon). + +Alternatively, you can provide a custom sharing function (and omit `shareMessage` and `sharingTitle`): + ```java + aboutConfig.share = new IShare() { + @Override + public void share(Activity activity) { + // do custom sharing + } + }; +``` + +## Theme + +If you add the following to your AndroidManifest.xml file, the About Box will use these colours. This allows you to match your app colours: + +```xml + +``` + +Ensure that `AppTheme.MaterialAboutActivity` theme extends either of these themes, and apply primary & accent colours: +``` +Theme.Mal.Light.DarkActionBar +Theme.Mal.Light.LightActionBar +Theme.Mal.Dark.LightActionBar +Theme.Mal.Dark.DarkActionBar +``` + +```xml + +``` ## Screenshot diff --git a/circle.yml b/circle.yml index e6a8356..a6eee0c 100644 --- a/circle.yml +++ b/circle.yml @@ -1,7 +1,7 @@ dependencies: pre: - - echo y | android update sdk --no-ui --all --filter tools,platform-tools,android-24 - - echo y | android update sdk --no-ui --all --filter build-tools-24.0.2 + - echo y | android update sdk --no-ui --all --filter tools,platform-tools,android-25 + - echo y | android update sdk --no-ui --all --filter build-tools-25.0.3 test: override: diff --git a/library/build.gradle b/library/build.gradle index 8a7fc8f..d5d552d 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -5,14 +5,14 @@ apply plugin: 'com.github.dcendents.android-maven' group='com.github.eggheadgames' android { - compileSdkVersion 24 - buildToolsVersion "24.0.2" + compileSdkVersion 25 + buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 15 targetSdkVersion 24 - versionCode 2 - versionName "1.0.1" + versionCode 7 + versionName "1.3.1" } buildTypes { release { @@ -28,8 +28,5 @@ android { } dependencies { - compile 'com.github.daniel-stoneuk:material-about-library:1.5.0' - compile('io.branch.sdk.android:library:2.5.7') { - exclude module: 'answers.shim' - } + compile 'com.github.daniel-stoneuk:material-about-library:2.2.1' } diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 3b15948..ef784a0 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,10 +1,10 @@ + package="com.eggheadgames.aboutbox"> - + + android:theme="@style/AppTheme.MaterialAboutActivity"/> diff --git a/library/src/main/java/com/eggheadgames/aboutbox/AboutBoxUtils.java b/library/src/main/java/com/eggheadgames/aboutbox/AboutBoxUtils.java new file mode 100644 index 0000000..32a3524 --- /dev/null +++ b/library/src/main/java/com/eggheadgames/aboutbox/AboutBoxUtils.java @@ -0,0 +1,109 @@ +package com.eggheadgames.aboutbox; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.net.Uri; +import android.widget.Toast; + +public final class AboutBoxUtils { + + public final static String playStoreAppURI = "https://play.google.com/store/apps/details?id="; + public final static String amznStoreAppURI = "https://www.amazon.com/gp/mas/dl/android?p="; + + private AboutBoxUtils() { + //nothing + } + + public static void getOpenFacebookIntent(Activity context, String name) { + try { + context.getPackageManager().getPackageInfo("com.facebook.katana", 0); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/" + name)); + context.startActivity(intent); + } catch (Exception e) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + name)); + context.startActivity(intent); + } catch (Exception e1) { + Toast.makeText(context, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); + } + } + } + + public static void startTwitter(Activity context, String name) { + try { + context.getPackageManager().getPackageInfo("com.twitter.android", 0); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("twitter://user?screen_name=" + name)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } catch (Exception e) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/" + name)); + context.startActivity(intent); + } catch (Exception e1) { + Toast.makeText(context, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); + } + } + } + + public static void openApp(Activity context, AboutConfig.BuildType buildType, String packageName) { + String appURI = null; + String webURI = null; + switch (buildType) { + case GOOGLE: + appURI = "market://details?id=" + packageName; + webURI = playStoreAppURI + packageName; + break; + case AMAZON: + appURI = "amzn://apps/android?p=" + packageName; + webURI = amznStoreAppURI + packageName; + break; + default: + //nothing + } + openApplication(context, appURI, webURI); + } + + public static void openPublisher(Activity context, AboutConfig.BuildType buildType, String publisher, String packageName) { + String appURI = null; + String webURI = null; + switch (buildType) { + case GOOGLE: + // see: + // https://developer.android.com/distribute/marketing-tools/linking-to-google-play.html#OpeningPublisher + // https://stackoverflow.com/questions/32029408/how-to-open-developer-page-on-google-play-store-market + // https://issuetracker.google.com/65244694 + if (publisher.matches("\\d+")) { + webURI = "https://play.google.com/store/apps/dev?id=" + publisher; + appURI = webURI; + } else { + appURI = "market://search?q=pub:" + publisher; + webURI = "https://play.google.com/store/search?q=pub:" + publisher; + } + break; + case AMAZON: + appURI = "amzn://apps/android?showAll=1&p=" + packageName; + webURI = "http://www.amazon.com/gp/mas/dl/android?showAll=1&p=" + packageName; + break; + default: + //nothing + } + openApplication(context, appURI, webURI); + } + + public static void openApplication(Activity context, String appURI, String webURI) { + try { + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(appURI))); + } catch (ActivityNotFoundException e1) { + try { + openHTMLPage(context, webURI); + } catch (ActivityNotFoundException e2) { + Toast.makeText(context, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); + } + } + } + + public static void openHTMLPage(Activity context, String htmlPath) { + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(htmlPath))); + } +} diff --git a/library/src/main/java/com/eggheadgames/aboutbox/AboutConfig.java b/library/src/main/java/com/eggheadgames/aboutbox/AboutConfig.java index 490fc95..4929ab6 100644 --- a/library/src/main/java/com/eggheadgames/aboutbox/AboutConfig.java +++ b/library/src/main/java/com/eggheadgames/aboutbox/AboutConfig.java @@ -8,11 +8,15 @@ public class AboutConfig { public String appName; public int appIcon; public String version; + public String author; + public String extra; + public String extraTitle; public String aboutLabelTitle; public String logUiEventName; public String facebookUserName; public String twitterUserName; public String webHomePage; + public String guideHtmlPath; public String appPublisher; public String companyHtmlPath; public String privacyHtmlPath; @@ -20,9 +24,10 @@ public class AboutConfig { public BuildType buildType; public String packageName; - // custom analytics and dialog + // custom analytics, dialog and share public IAnalytic analytics; public IDialog dialog; + public IShare share; // email public String emailAddress; @@ -30,7 +35,6 @@ public class AboutConfig { public String emailBody; // share - public String shareMessageTitle; public String shareMessage; public String sharingTitle; diff --git a/library/src/main/java/com/eggheadgames/aboutbox/IShare.java b/library/src/main/java/com/eggheadgames/aboutbox/IShare.java new file mode 100644 index 0000000..b9b5520 --- /dev/null +++ b/library/src/main/java/com/eggheadgames/aboutbox/IShare.java @@ -0,0 +1,9 @@ +package com.eggheadgames.aboutbox; + + +import android.app.Activity; + +public interface IShare { + + void share(Activity activity); +} diff --git a/library/src/main/java/com/eggheadgames/aboutbox/activity/AboutActivity.java b/library/src/main/java/com/eggheadgames/aboutbox/activity/AboutActivity.java index 14674e5..98555a1 100644 --- a/library/src/main/java/com/eggheadgames/aboutbox/activity/AboutActivity.java +++ b/library/src/main/java/com/eggheadgames/aboutbox/activity/AboutActivity.java @@ -1,18 +1,20 @@ package com.eggheadgames.aboutbox.activity; import android.app.Activity; -import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.net.Uri; -import android.widget.Toast; +import android.support.annotation.NonNull; +import android.text.TextUtils; import com.danielstone.materialaboutlibrary.MaterialAboutActivity; -import com.danielstone.materialaboutlibrary.model.MaterialAboutActionItem; +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.model.MaterialAboutList; -import com.danielstone.materialaboutlibrary.model.MaterialAboutTitleItem; +import com.eggheadgames.aboutbox.AboutBoxUtils; import com.eggheadgames.aboutbox.AboutConfig; +import com.eggheadgames.aboutbox.IAnalytic; import com.eggheadgames.aboutbox.R; import com.eggheadgames.aboutbox.share.EmailUtil; import com.eggheadgames.aboutbox.share.ShareUtil; @@ -21,6 +23,7 @@ public class AboutActivity extends MaterialAboutActivity { public static void launch(Activity activity) { Intent intent = new Intent(activity, AboutActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(intent); } @@ -29,6 +32,18 @@ public class AboutActivity extends MaterialAboutActivity { final AboutConfig config = AboutConfig.getInstance(); + return new MaterialAboutList.Builder() + .addCard(buildGeneralInfoCard(config)) + .addCard(buildSupportCard(config)) + .addCard(buildShareCard(config)) + .addCard(buildAboutCard(config)) + .addCard(buildSocialNetworksCard(config)) + .addCard(buildPrivacyCard(config)) + .build(); + } + + @NonNull + private MaterialAboutCard buildGeneralInfoCard(AboutConfig config) { MaterialAboutCard.Builder generalInfoCardBuilder = new MaterialAboutCard.Builder(); generalInfoCardBuilder.addItem(new MaterialAboutTitleItem.Builder() @@ -41,262 +56,218 @@ public class AboutActivity extends MaterialAboutActivity { .subText(config.version) .build()); + if (!TextUtils.isEmpty(config.author)) { + generalInfoCardBuilder.addItem(new MaterialAboutActionItem.Builder() + .text(R.string.egab_author) + .subText(config.author) + .build()); + } - MaterialAboutCard.Builder supportCardBuilder = new MaterialAboutCard.Builder(); - supportCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_contact_support) - .icon(R.drawable.ic_email_black) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { + if (!TextUtils.isEmpty(config.extra) && !TextUtils.isEmpty(config.extraTitle)) { + generalInfoCardBuilder.addItem(new MaterialAboutActionItem.Builder() + .text(config.extraTitle) + .subTextHtml(config.extra) + .build()); + } + + return generalInfoCardBuilder.build(); + } + + @NonNull + private MaterialAboutCard buildSupportCard(final AboutConfig config) { + MaterialAboutCard.Builder card = new MaterialAboutCard.Builder(); + + if (!TextUtils.isEmpty(config.guideHtmlPath)) { + card.addItem(itemHelper(R.string.egab_guide, R.drawable.ic_help_green, + new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + if (config.dialog == null) { + AboutBoxUtils.openHTMLPage(AboutActivity.this, config.guideHtmlPath); + } else { + config.dialog.open(AboutActivity.this, config.guideHtmlPath, getString(R.string.egab_guide)); + } + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_guide)); + } + }) + ); + } + card.addItem(itemHelper(R.string.egab_contact_support, R.drawable.ic_email_black, + new MaterialAboutItemOnClickAction() { @Override public void onClick() { EmailUtil.contactUs(AboutActivity.this); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_contact_log_event)); - } + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_contact_log_event)); } - }) - .build()); + })); + return card.build(); + } - MaterialAboutCard.Builder shareCardBuilder = new MaterialAboutCard.Builder(); - shareCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_leave_review) - .icon(R.drawable.ic_review) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { + @NonNull + private MaterialAboutCard buildShareCard(final AboutConfig config) { + MaterialAboutCard.Builder card = new MaterialAboutCard.Builder(); + if (config.buildType != null && !TextUtils.isEmpty(config.packageName)) { + card.addItem(itemHelper(R.string.egab_leave_review, R.drawable.ic_review, + new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + AboutBoxUtils.openApp(AboutActivity.this, config.buildType, config.packageName); + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_review_log_event)); + } + })); + } + card.addItem(itemHelper(R.string.egab_share, R.drawable.ic_share_black, + new MaterialAboutItemOnClickAction() { @Override public void onClick() { - openApp(config.buildType, config.packageName); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_review_log_event)); - } - } - }) - .build()); - shareCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_share) - .icon(R.drawable.ic_share_black) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - ShareUtil.share(AboutActivity.this); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_share_log_event)); - } - } - }) - .build()); - - - MaterialAboutCard.Builder aboutCardBuilder = new MaterialAboutCard.Builder(); - aboutCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_try_other_apps) - .icon(R.drawable.ic_try_other_apps) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - openPublisher(config.buildType, config.appPublisher, config.packageName); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_try_other_app_log_event)); - } - } - }) - .build()); - aboutCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(config.aboutLabelTitle) - .icon(R.drawable.ic_about_black) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - if (config.dialog == null) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(config.companyHtmlPath))); + if (config.share == null) { + ShareUtil.share(AboutActivity.this); } else { - config.dialog.open(AboutActivity.this, config.companyHtmlPath, config.aboutLabelTitle); - } - - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, config.aboutLabelTitle); + config.share.share(AboutActivity.this); } + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_share_log_event)); } - }) - .build()); + })); + return card.build(); + } - - MaterialAboutCard.Builder socialNetworksCardBuilder = new MaterialAboutCard.Builder(); - socialNetworksCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_facebook_label) - .subText(config.facebookUserName) - .icon(R.drawable.ic_facebook_24) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - getOpenFacebookIntent(AboutActivity.this, config.facebookUserName); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_facebook_log_event)); + @NonNull + private MaterialAboutCard buildAboutCard(final AboutConfig config) { + MaterialAboutCard.Builder card = new MaterialAboutCard.Builder(); + if (config.buildType != null && !TextUtils.isEmpty(config.appPublisher) && !TextUtils.isEmpty(config.packageName)) { + card.addItem(itemHelper(R.string.egab_try_other_apps, R.drawable.ic_try_other_apps, + new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + AboutBoxUtils.openPublisher(AboutActivity.this, config.buildType, + config.appPublisher, config.packageName); + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_try_other_app_log_event)); } - } - }) - .build()); - socialNetworksCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_twitter_label) - .subText(config.twitterUserName) - .icon(R.drawable.ic_twitter_24dp) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - startTwitter(AboutActivity.this, config.twitterUserName); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_twitter_log_event)); + })); + } + if (!TextUtils.isEmpty(config.companyHtmlPath) && !TextUtils.isEmpty(config.aboutLabelTitle)) { + card.addItem(new MaterialAboutActionItem.Builder() + .text(config.aboutLabelTitle) + .icon(R.drawable.ic_about_black) + .setOnClickAction(new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + if (config.dialog == null) { + AboutBoxUtils.openHTMLPage(AboutActivity.this, config.companyHtmlPath); + } else { + config.dialog.open(AboutActivity.this, config.companyHtmlPath, config.aboutLabelTitle); + } + logUIEventName(config.analytics, config.logUiEventName, config.aboutLabelTitle); } - } - }) - .build()); + }) + .build()); + } + return card.build(); + } - socialNetworksCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_web_label) - .subText(config.webHomePage.replace("https://", "").replace("http://", "").replace("/", "")) - .icon(R.drawable.ic_web_black_24dp) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(config.webHomePage))); - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_website_log_event)); + @NonNull + private MaterialAboutCard buildSocialNetworksCard(final AboutConfig config) { + MaterialAboutCard.Builder card = new MaterialAboutCard.Builder(); + if (!TextUtils.isEmpty(config.facebookUserName)) { + card.addItem(new MaterialAboutActionItem.Builder() + .text(R.string.egab_facebook_label) + .subText(config.facebookUserName) + .icon(R.drawable.ic_facebook_24) + .setOnClickAction(new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + AboutBoxUtils.getOpenFacebookIntent(AboutActivity.this, config.facebookUserName); + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_facebook_log_event)); } - } - }) - .build()); - - MaterialAboutCard.Builder privacyCardBuilder = new MaterialAboutCard.Builder(); - privacyCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_privacy_policy) - .icon(R.drawable.ic_privacy) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - if (config.dialog == null) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(config.privacyHtmlPath))); - } else { - config.dialog.open(AboutActivity.this, config.privacyHtmlPath, getString(R.string.egab_privacy_policy)); + }) + .build()); + } + if (!TextUtils.isEmpty(config.twitterUserName)) { + card.addItem(new MaterialAboutActionItem.Builder() + .text(R.string.egab_twitter_label) + .subText(config.twitterUserName) + .icon(R.drawable.ic_twitter_24dp) + .setOnClickAction(new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + AboutBoxUtils.startTwitter(AboutActivity.this, config.twitterUserName); + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_twitter_log_event)); } - - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_privacy_log_event)); + }) + .build()); + } + if (!TextUtils.isEmpty(config.webHomePage)) { + card.addItem(new MaterialAboutActionItem.Builder() + .text(R.string.egab_web_label) + .subText(config.webHomePage.replaceFirst("^https?://", "").replaceAll("/$", "")) + .icon(R.drawable.ic_web_black_24dp) + .setOnClickAction(new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + AboutBoxUtils.openHTMLPage(AboutActivity.this, config.webHomePage); + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_website_log_event)); } - } - }) - .build()); - privacyCardBuilder.addItem(new MaterialAboutActionItem.Builder() - .text(R.string.egab_acknowledgements) - .icon(R.drawable.ic_acknowledgements) - .setOnClickListener(new MaterialAboutActionItem.OnClickListener() { - @Override - public void onClick() { - if (config.dialog == null) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(config.acknowledgmentHtmlPath))); - } else { - config.dialog.open(AboutActivity.this, config.acknowledgmentHtmlPath, getString(R.string.egab_acknowledgements)); + }) + .build()); + } + return card.build(); + } + + @NonNull + private MaterialAboutCard buildPrivacyCard(final AboutConfig config) { + MaterialAboutCard.Builder card = new MaterialAboutCard.Builder(); + if (!TextUtils.isEmpty(config.privacyHtmlPath)) { + card.addItem(itemHelper(R.string.egab_privacy_policy, R.drawable.ic_privacy, + new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + if (config.dialog == null) { + AboutBoxUtils.openHTMLPage(AboutActivity.this, config.privacyHtmlPath); + } else { + config.dialog.open(AboutActivity.this, config.privacyHtmlPath, getString(R.string.egab_privacy_policy)); + } + + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_privacy_log_event)); } - - if (config.analytics != null) { - config.analytics.logUiEvent(config.logUiEventName, getString(R.string.egab_acknowledgements_log_event)); + }) + ); + } + if (!TextUtils.isEmpty(config.acknowledgmentHtmlPath)) { + card.addItem(itemHelper(R.string.egab_acknowledgements, R.drawable.ic_acknowledgements, + new MaterialAboutItemOnClickAction() { + @Override + public void onClick() { + if (config.dialog == null) { + AboutBoxUtils.openHTMLPage(AboutActivity.this, config.acknowledgmentHtmlPath); + } else { + config.dialog.open(AboutActivity.this, config.acknowledgmentHtmlPath, getString(R.string.egab_acknowledgements)); + } + logUIEventName(config.analytics, config.logUiEventName, getString(R.string.egab_acknowledgements_log_event)); } - } - }) - .build()); + }) + ); + } + return card.build(); + } - - return new MaterialAboutList.Builder() - .addCard(generalInfoCardBuilder.build()) - .addCard(supportCardBuilder.build()) - .addCard(shareCardBuilder.build()) - .addCard(aboutCardBuilder.build()) - .addCard(socialNetworksCardBuilder.build()) - .addCard(privacyCardBuilder.build()) + private MaterialAboutActionItem itemHelper(int name, int icon, MaterialAboutItemOnClickAction clickAction) { + return new MaterialAboutActionItem.Builder() + .text(name) + .icon(icon) + .setOnClickAction(clickAction) .build(); } + @Override protected CharSequence getActivityTitle() { return getString(R.string.egab_about_screen_title); } - public static void getOpenFacebookIntent(Activity context, String name) { - try { - context.getPackageManager().getPackageInfo("com.facebook.katana", 0); - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/" + name)); - context.startActivity(intent); - } catch (Exception e) { - try { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + name)); - context.startActivity(intent); - } catch (Exception e1) { - Toast.makeText(context, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); - } - } - } - - public static void startTwitter(Activity context, String name) { - try { - context.getPackageManager().getPackageInfo("com.twitter.android", 0); - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("twitter://user?screen_name=" + name)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } catch (Exception e) { - try { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/" + name)); - context.startActivity(intent); - } catch (Exception e1) { - Toast.makeText(context, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); - } - } - - } - - public void openApp(AboutConfig.BuildType buildType, String packageName) { - String appURI = null; - String webURI = null; - switch (buildType) { - case GOOGLE: - appURI = "market://details?id=" + packageName; - webURI = "http://play.google.com/store/apps/details?id=" + packageName; - break; - case AMAZON: - appURI = "amzn://apps/android?p=" + packageName; - webURI = "http://www.amazon.com/gp/mas/dl/android?p=" + packageName; - break; - default: - //nothing - } - open(appURI, webURI); - } - - public void openPublisher(AboutConfig.BuildType buildType, String publisher, String packageName) { - String appURI = null; - String webURI = null; - switch (buildType) { - case GOOGLE: - appURI = "market://search?q=pub:" + publisher; - webURI = "http://play.google.com/store/search?q=pub:" + publisher; - break; - case AMAZON: - appURI = "amzn://apps/android?showAll=1&p=" + packageName; - webURI = "http://www.amazon.com/gp/mas/dl/android?showAll=1&p=" + packageName; - break; - default: - //nothing - } - open(appURI, webURI); - } - - private void open(String appURI, String webURI) { - try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(appURI))); - } catch (ActivityNotFoundException e1) { - try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(webURI))); - } catch (ActivityNotFoundException e2) { - Toast.makeText(this, R.string.egab_can_not_open, Toast.LENGTH_SHORT).show(); - } + private void logUIEventName(IAnalytic analytics, String eventType, String eventValue) { + if (analytics != null) { + analytics.logUiEvent(eventType, eventValue); } } } diff --git a/library/src/main/java/com/eggheadgames/aboutbox/share/ShareUtil.java b/library/src/main/java/com/eggheadgames/aboutbox/share/ShareUtil.java index 364c9ab..95c59a9 100644 --- a/library/src/main/java/com/eggheadgames/aboutbox/share/ShareUtil.java +++ b/library/src/main/java/com/eggheadgames/aboutbox/share/ShareUtil.java @@ -1,17 +1,12 @@ package com.eggheadgames.aboutbox.share; import android.app.Activity; +import android.content.Intent; import android.text.TextUtils; +import com.eggheadgames.aboutbox.AboutBoxUtils; import com.eggheadgames.aboutbox.AboutConfig; -import io.branch.indexing.BranchUniversalObject; -import io.branch.referral.Branch; -import io.branch.referral.BranchError; -import io.branch.referral.SharingHelper; -import io.branch.referral.util.LinkProperties; -import io.branch.referral.util.ShareSheetStyle; - public final class ShareUtil { private ShareUtil() { @@ -19,48 +14,29 @@ public final class ShareUtil { } public static void share(Activity activity) { - BranchUniversalObject branchUniversalObject = new BranchUniversalObject(); - final AboutConfig config = AboutConfig.getInstance(); + AboutConfig config = AboutConfig.getInstance(); - ShareSheetStyle shareSheetStyle = new ShareSheetStyle(activity, config.shareMessageTitle, - config.shareMessage) - .setCopyUrlStyle(activity.getResources().getDrawable(android.R.drawable.ic_menu_send), - "Copy", "Added to clipboard") - .setMoreOptionStyle(activity.getResources().getDrawable(android.R.drawable.ic_menu_search), "Show more") - .addPreferredSharingOption(SharingHelper.SHARE_WITH.FACEBOOK) - .addPreferredSharingOption(SharingHelper.SHARE_WITH.EMAIL) - .setSharingTitle(config.sharingTitle); + Intent intent2 = new Intent(); + intent2.setAction(Intent.ACTION_SEND); + intent2.setType("text/plain"); - branchUniversalObject.showShareSheet(activity, - new LinkProperties(), shareSheetStyle, new Branch.BranchLinkShareListener() { - @Override - public void onShareLinkDialogLaunched() { - //nothing - } + String shareMessage = config.shareMessage; - @Override - public void onShareLinkDialogDismissed() { - if (config.analytics != null) { - config.analytics.logUiEvent("Share", "Dismissed"); - } - } + if (!TextUtils.isEmpty(config.packageName) && !TextUtils.isEmpty(shareMessage) && config.buildType != null) { + switch (config.buildType) { + case GOOGLE: + shareMessage = shareMessage + AboutBoxUtils.playStoreAppURI + config.packageName; + break; + case AMAZON: + shareMessage = shareMessage + AboutBoxUtils.amznStoreAppURI + config.packageName; + break; + default: + break; + } + } - @Override - public void onLinkShareResponse(String sharedLink, String sharedChannel, BranchError error) { - if (config.analytics != null) { - if (error == null || TextUtils.isEmpty(error.getMessage())) { - config.analytics.logUiEvent("Share", sharedChannel); - } else { - config.analytics.logUiEvent("Share Failure", error.getMessage()); - } - } - } - - @Override - public void onChannelSelected(String channelName) { - //nothing - } - }); + intent2.putExtra(Intent.EXTRA_TEXT, shareMessage); + activity.startActivity(Intent.createChooser(intent2, config.sharingTitle)); } } diff --git a/library/src/main/res/drawable/ic_help_green.xml b/library/src/main/res/drawable/ic_help_green.xml new file mode 100644 index 0000000..e1e7ce0 --- /dev/null +++ b/library/src/main/res/drawable/ic_help_green.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/library/src/main/res/values-pt/strings.xml b/library/src/main/res/values-pt/strings.xml index 00e8471..18a0b23 100644 --- a/library/src/main/res/values-pt/strings.xml +++ b/library/src/main/res/values-pt/strings.xml @@ -1,9 +1,9 @@ - AboutBox Avaliar Contactar o Suporte Experimentar outras aplicações Versão + Autor Facebook Twitter Web @@ -22,4 +22,5 @@ Acknowledgements Tu não tens nenhuma aplicação que possa abrir esta ligação Digite sua pergunta aqui: + Guia diff --git a/library/src/main/res/values/strings.xml b/library/src/main/res/values/strings.xml index 724d70c..894f9ae 100644 --- a/library/src/main/res/values/strings.xml +++ b/library/src/main/res/values/strings.xml @@ -1,9 +1,9 @@ - AboutBox Leave Review Contact Support Try Other Apps Version + Author Facebook Twitter Web @@ -22,5 +22,6 @@ Acknowledgements You don\'t have any app that can open this link Please type your question here: + Guide diff --git a/library/src/main/res/values/styles.xml b/library/src/main/res/values/styles.xml index 41c850f..d0590ed 100644 --- a/library/src/main/res/values/styles.xml +++ b/library/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ -