From ae172df8387fa2146dc10b1d3c8e847adfbf9397 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Tue, 24 Jul 2018 19:29:48 +0200 Subject: [PATCH] OeffiMainActivity: Add generic 'update' button to remote message dialogs. --- oeffi/res/values-de/strings.xml | 3 +- oeffi/res/values/strings.xml | 3 +- .../schildbach/oeffi/OeffiMainActivity.java | 105 ++++++++++-------- 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/oeffi/res/values-de/strings.xml b/oeffi/res/values-de/strings.xml index f05e545..ecedf59 100644 --- a/oeffi/res/values-de/strings.xml +++ b/oeffi/res/values-de/strings.xml @@ -328,7 +328,8 @@ Willkommen zu Öffi Version %s! Folgendes ist neu: Weiter - Weiter + Weiter + App-Update Öffi ist letztens abgestürzt Es gibt eine neue Öffi-Version %s. Du solltest aktualisieren, denn möglicherweise wurde dein Problem schon behoben. Möchtest du einen Fehlerbericht senden, um dabei zu helfen das Problem zu lösen? diff --git a/oeffi/res/values/strings.xml b/oeffi/res/values/strings.xml index 25af249..926a43c 100644 --- a/oeffi/res/values/strings.xml +++ b/oeffi/res/values/strings.xml @@ -329,7 +329,8 @@ Welcome to Offi version %s! Here is what\'s new: Dismiss - Dismiss + Dismiss + Update app Previous crash detected There is a new Offi version %s available. You should update, as your problem might already have been fixed. Would you like to send a crash report, helping to fix this issue in the future? diff --git a/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java b/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java index eff59ba..d435cb4 100644 --- a/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java +++ b/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java @@ -632,6 +632,64 @@ public abstract class OeffiMainActivity extends OeffiActivity { return true; } + private Dialog messageDialog(final Bundle message) { + final DialogBuilder builder = DialogBuilder.get(this); + final String action = message.getString("action"); + if ("info".equals(action)) + builder.setIcon(R.drawable.ic_info_grey600_24dp); + else if ("warning".equals(action)) + builder.setIcon(R.drawable.ic_warning_amber_24dp); + final String title = message.getString("title"); + if (title != null) + builder.setTitle(title); + final String body = message.getString("body"); + builder.setMessage(body); + final String positive = message.getString("button-positive"); + if (positive != null) + builder.setPositiveButton(messageButtonText(positive), messageButtonListener(positive)); + final String neutral = message.getString("button-neutral"); + if (neutral != null) + builder.setNeutralButton(messageButtonText(neutral), messageButtonListener(neutral)); + final String negative = message.getString("button-negative"); + if (negative != null) + builder.setNegativeButton(messageButtonText(negative), messageButtonListener(negative)); + else + builder.setNegativeButton(R.string.alert_message_button_dismiss, null); + + final Dialog dialog = builder.create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; + } + + private String messageButtonText(final String buttonSpec) { + if ("dismiss".equals(buttonSpec)) + return getString(R.string.alert_message_button_dismiss); + else if ("update".equals(buttonSpec)) + return getString(R.string.alert_message_button_update); + else + return Splitter.on('|').trimResults().limit(2).split(buttonSpec).iterator().next(); + } + + private MessageOnClickListener messageButtonListener(final String buttonSpec) { + if ("dismiss".equals(buttonSpec)) { + return null; + } else if ("update".equals(buttonSpec)) { + final String installerPackageName = getPackageManager().getInstallerPackageName(getPackageName()); + if ("com.android.vending".equals(installerPackageName)) + return new MessageOnClickListener("https://play.google.com/store/apps/details?id=" + getPackageName()); + else if ("org.fdroid.fdroid".equals(installerPackageName) + || "org.fdroid.fdroid.privileged".equals(installerPackageName)) + return new MessageOnClickListener("https://f-droid.org/de/packages/" + getPackageName() + "/"); + else + // TODO localize + return new MessageOnClickListener("https://oeffi.schildbach.de/download.html"); + } else { + final Iterator iterator = Splitter.on('|').trimResults().limit(2).split(buttonSpec).iterator(); + iterator.next(); + return new MessageOnClickListener(iterator.next()); + } + } + private class MessageOnClickListener implements DialogInterface.OnClickListener { private final String link; @@ -647,53 +705,6 @@ public abstract class OeffiMainActivity extends OeffiActivity { } } - private Dialog messageDialog(final Bundle message) { - final DialogBuilder builder = DialogBuilder.get(this); - final String action = message.getString("action"); - if ("info".equals(action)) - builder.setIcon(R.drawable.ic_info_grey600_24dp); - else if ("warning".equals(action)) - builder.setIcon(R.drawable.ic_warning_amber_24dp); - final String title = message.getString("title"); - if (title != null) - builder.setTitle(title); - final String body = message.getString("body"); - builder.setMessage(body); - final String positive = message.getString("button-positive"); - if (positive != null) { - final Iterator parts = Splitter.on('|').trimResults().limit(2).split(positive).iterator(); - final String text = parts.next(); - if ("dismiss".equals(text)) - builder.setPositiveButton(R.string.alert_hint_neutral, null); - else - builder.setPositiveButton(text, parts.hasNext() ? new MessageOnClickListener(parts.next()) : null); - } - final String neutral = message.getString("button-neutral"); - if (neutral != null) { - final Iterator parts = Splitter.on('|').trimResults().limit(2).split(neutral).iterator(); - final String text = parts.next(); - if ("dismiss".equals(text)) - builder.setNeutralButton(R.string.alert_hint_neutral, null); - else - builder.setNeutralButton(text, parts.hasNext() ? new MessageOnClickListener(parts.next()) : null); - } - final String negative = message.getString("button-negative"); - if (negative != null) { - final Iterator parts = Splitter.on('|').trimResults().limit(2).split(negative).iterator(); - final String text = parts.next(); - if ("dismiss".equals(text)) - builder.setNegativeButton(R.string.alert_hint_neutral, null); - else - builder.setNegativeButton(text, parts.hasNext() ? new MessageOnClickListener(parts.next()) : null); - } else { - builder.setNegativeButton(R.string.alert_hint_neutral, null); - } - - final Dialog dialog = builder.create(); - dialog.setCanceledOnTouchOutside(false); - return dialog; - } - private long parseTimeExp(final String exp) { if (exp.endsWith("h")) return DateUtils.HOUR_IN_MILLIS * Integer.parseInt(exp.substring(0, exp.length() - 1));