diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DeviceConfigurationQRCodeUtils.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DeviceConfigurationQRCodeUtils.java
index 2ab10e792a2..217489daf6e 100644
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DeviceConfigurationQRCodeUtils.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DeviceConfigurationQRCodeUtils.java
@@ -10,7 +10,7 @@ import com.sap.sse.common.Util;
*/
public class DeviceConfigurationQRCodeUtils {
- private static final String fragmentKey = "identifier";
+ public static final String fragmentKey = "identifier";
public static String composeQRContent(String deviceIdentifier, String apkUrl) {
// poor man's uri fragment encoding: ' ' as '%20'
diff --git a/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml b/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml
index 2acfbe00537..332fb33f95d 100644
--- a/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml
@@ -14,9 +14,9 @@
-
+
-
+
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml
index c02324d31f3..b3949a73922 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
- android:src="@drawable/backdrop"/>
+ android:src="@drawable/backdrop" />
+ android:src="@drawable/sap_logo" />
+ android:textSize="@dimen/textSize_40" />
+ android:src="@drawable/ic_more_vert_white_48dp" />
+ android:textSize="@dimen/textSize_40" />
+
+
+ android:background="?attr/sap_yellow_1" />
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_xlarge.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_xlarge.xml
index 992a86a970e..80c270aae47 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_xlarge.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_xlarge.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
- android:src="@drawable/backdrop"/>
+ android:src="@drawable/backdrop" />
+ android:src="@drawable/sap_logo" />
+ android:textSize="@dimen/textSize_40" />
+ android:src="@drawable/ic_settings_white_48dp" />
+ android:src="@drawable/ic_info_outline_white_48dp" />
+ android:src="@drawable/ic_refresh_white_48dp" />
+ android:textSize="@dimen/textSize_40" />
+
+
+ android:background="?attr/sap_yellow_1" />
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding.xml
new file mode 100644
index 00000000000..c1dc814abf4
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_edit.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_edit.xml
new file mode 100644
index 00000000000..3ecb52b4392
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_edit.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_normal.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_normal.xml
new file mode 100644
index 00000000000..f7fc769e37c
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_normal.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_xlarge.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_xlarge.xml
new file mode 100644
index 00000000000..9a7e775e692
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_input_xlarge.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_normal.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_normal.xml
new file mode 100644
index 00000000000..3856e077065
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_normal.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_xlarge.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_xlarge.xml
new file mode 100644
index 00000000000..bc9017f6a44
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_onboarding_scan_xlarge.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml
index 6d883f894be..4040b5df015 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml
@@ -17,9 +17,15 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal|bottom"
- android:background="?attr/sap_gray_black_30"
tools:layout="@layout/login_listviews"/>
+
+
Kurs
Startzeit Bestätigen
Startmodus Bestätigen
- Bitte wählen Sie eine Regatta aus
Willkommen beim\nSAP Sailing Race Manager
+ Bitte wählen Sie eine Regatta aus
+ Onboarding
Navigation-Drawer schließen
Navigation-Drawer öffnen
Anmelden
@@ -391,8 +392,8 @@
Soll das bisherige Kursdesign verwendet werden?
Bitte geben Sie eine gültige Zahl ein.
Bitte tragen Sie einen gültigen Pathfinder ein.
- Fehler beim Scannen des QRCodes(%s)
- Fehler beim Scannen des QRCodes(Ungültige Url)
+ Fehler beim Scannen des QRCodes (%s)
+ Ungültige Url
Kursmarkierungen: %s
Kein Kurs zum Kopieren vorhanden
Die gewählten Anweisungen zum Vorbeifahren benötigen zwei Bojen. Bitte Wählen Sie eine zweite Boje.
@@ -456,5 +457,7 @@
Zurücksetzen
Soll die Liste komplett gelöscht werden?
Soll die Liste zum letzten bekannten Stand zurückgesetzt werden?
+ Scan QR-Code
+ Manuelle Eingabe
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-sw720dp/references.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-sw720dp/references.xml
index c63fad1e780..03249a3a0ac 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values-sw720dp/references.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values-sw720dp/references.xml
@@ -7,6 +7,8 @@
- @layout/flag_list_item_xlarge
- @layout/login_backdrop_xlarge
- @layout/login_listviews_button_xlarge
+ - @layout/login_onboarding_scan_xlarge
+ - @layout/login_onboarding_input_xlarge
- @layout/photo_list_button_xlarge
- @layout/photo_list_item_xlarge
- @layout/race_finishing_button_xlarge
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/references.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/references.xml
index 1ba516f71dd..d30f9e1ba6f 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values/references.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values/references.xml
@@ -8,6 +8,8 @@
- @layout/flag_list_item_normal
- @layout/login_backdrop_normal
- @layout/login_listviews_button_normal
+ - @layout/login_onboarding_scan_normal
+ - @layout/login_onboarding_input_normal
- @layout/photo_list_button_normal
- @layout/photo_list_item_normal
- @layout/race_finished_normal
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
index 0e4bca438cd..168518c0dd2 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
@@ -296,6 +296,7 @@
Welcome to\nSAP Sailing Race Manager
Please select a regatta
+ Onboarding
Sign Me Up
dd
Abandon
@@ -414,8 +415,8 @@
Use previously published course design?
Please enter a valid number
Please enter a valid pathfinder
- Error scanning QRCode(%s)
- Error scanning QRCode(malformed url)
+ Error scanning QRCode (%s)
+ Malformed url
Marks: %s
No course available to copy
The selected passing instructions require two buoys. Please select the second buoy.
@@ -483,5 +484,7 @@
Do you want to clear the list?
Do you want to reset to the last state?
%1$d° %2$d′ %3$.3f″
+ Scan QR-Code
+ Manual Input
\ No newline at end of file
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml b/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml
index 49e16616365..0d1f96bf120 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml
@@ -11,7 +11,6 @@
android:key="@string/preference_identifier_key"
android:title="@string/device_identifier"/>
configurationLoader = dataManager.createConfigurationLoader(identifier, new LoadClient() {
@@ -454,13 +462,29 @@ public class LoginActivity extends BaseActivity
}
private void slideUpBackdrop() {
+ final View loginView = findViewById(R.id.login_listview);
+ loginView.setVisibility(View.GONE);
+ final View onboardingView = findViewById(R.id.login_onboarding);
+ onboardingView.setVisibility(View.GONE);
+
+ ViewHelper.get(backdrop, R.id.backdrop_login).setVisibility(View.GONE);
+ ViewHelper.get(backdrop, R.id.backdrop_onboarding).setVisibility(View.GONE);
+
+ if (TextUtils.isEmpty(AppPreferences.on(this).getServerBaseURL())) {
+ onboardingView.setVisibility(View.VISIBLE);
+ ViewHelper.get(backdrop, R.id.backdrop_onboarding).setVisibility(View.VISIBLE);
+ } else {
+ loginView.setVisibility(View.VISIBLE);
+ ViewHelper.get(backdrop, R.id.backdrop_login).setVisibility(View.VISIBLE);
+ }
+
// don't slide up if already up
if (backdrop.getY() != 0) {
return;
}
int upperRoom = backdrop.getHeight() + (backdrop.getHeight() / 5);
- View subTitle = ViewHelper.get(backdrop, R.id.backdrop_subtitle);
+ View subTitle = ViewHelper.get(backdrop, R.id.backdrop_login);
if (subTitle != null) {
upperRoom = backdrop.getHeight() - subTitle.getHeight() - getResources().getDimensionPixelSize(R.dimen.default_padding_half);
}
@@ -469,11 +493,14 @@ public class LoginActivity extends BaseActivity
heightAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
- View bottomView = findViewById(R.id.login_listview);
int val = (Integer) valueAnimator.getAnimatedValue();
- ViewGroup.LayoutParams layoutParams = bottomView.getLayoutParams();
- layoutParams.height = val;
- bottomView.setLayoutParams(layoutParams);
+ ViewGroup.LayoutParams lpLogin = loginView.getLayoutParams();
+ lpLogin.height = val;
+ loginView.setLayoutParams(lpLogin);
+
+ ViewGroup.LayoutParams lpOnboarding = onboardingView.getLayoutParams();
+ lpOnboarding.height = val;
+ onboardingView.setLayoutParams(lpOnboarding);
}
});
@@ -481,7 +508,8 @@ public class LoginActivity extends BaseActivity
animators.add(heightAnimation);
animators.add(frameAnimation);
animators.add(getAlphaRevAnimator(findViewById(R.id.backdrop_title)));
- animators.add(getAlphaAnimator(findViewById(R.id.backdrop_subtitle)));
+ animators.add(getAlphaAnimator(findViewById(R.id.backdrop_login)));
+ animators.add(getAlphaAnimator(findViewById(R.id.backdrop_onboarding)));
animators.add(getAlphaAnimator(findViewById(R.id.button_bar)));
AnimatorSet animatorSet = new AnimatorSet();
@@ -522,7 +550,11 @@ public class LoginActivity extends BaseActivity
@Override
public void onReceive(Context context, Intent intent) {
- resetData();
+ String action = intent.getAction();
+
+ if (AppConstants.INTENT_ACTION_RESET.equals(action)) {
+ resetData();
+ }
}
}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java
new file mode 100644
index 00000000000..00c99746a82
--- /dev/null
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java
@@ -0,0 +1,133 @@
+package com.sap.sailing.racecommittee.app.ui.fragments;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.sap.sailing.android.shared.util.ViewHelper;
+import com.sap.sailing.domain.common.impl.DeviceConfigurationQRCodeUtils;
+import com.sap.sailing.racecommittee.app.AppConstants;
+import com.sap.sailing.racecommittee.app.AppPreferences;
+import com.sap.sailing.racecommittee.app.R;
+import com.sap.sailing.racecommittee.app.utils.UrlHelper;
+import com.sap.sailing.racecommittee.app.utils.autoupdate.AutoUpdater;
+import com.sap.sse.common.Util;
+
+import java.net.URL;
+
+public class LoginOnboarding extends Fragment {
+
+ private static final int requestCodeQR = 45392;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View layout = inflater.inflate(R.layout.login_onboarding, container, false);
+
+ Button scan = ViewHelper.get(layout, R.id.scanQr);
+ if (scan != null) {
+ scan.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ Intent intent = new Intent("com.google.zxing.client.android.SCAN");
+ intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
+ startActivityForResult(intent, requestCodeQR);
+ } catch (Exception e) {
+ Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
+ Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
+ startActivity(marketIntent);
+ }
+ }
+ });
+ }
+
+ Button manual = ViewHelper.get(layout, R.id.manual_input);
+ if (manual != null) {
+ manual.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ View view = View.inflate(v.getContext(), R.layout.login_onboarding_edit, null);
+ final EditText url = (EditText) view.findViewById(R.id.url);
+ final EditText device_id = (EditText) view.findViewById(R.id.device_id);
+ device_id.setText(AppPreferences.on(v.getContext()).getDeviceIdentifier());
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext(), R.style.AppTheme_AlertDialog);
+ builder.setView(view);
+ builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (saveData(url.getText().toString() + "#" + DeviceConfigurationQRCodeUtils.fragmentKey + "=" + device_id.getText().toString())) {
+ LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(AppConstants.INTENT_ACTION_RESET));
+ }
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, null);
+ AlertDialog dialog = builder.show();
+
+ dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+ }
+ });
+ }
+
+ return layout;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode != requestCodeQR) {
+ super.onActivityResult(requestCode, resultCode, data);
+ return;
+ }
+
+ switch (resultCode) {
+ case Activity.RESULT_CANCELED:
+ break;
+
+ case Activity.RESULT_OK:
+ saveData(data.getStringExtra("SCAN_RESULT"));
+ break;
+
+ default:
+ Toast.makeText(getActivity(), getString(R.string.error_scanning_qr, resultCode), Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private boolean saveData(String content) {
+ try {
+ Util.Pair connectionConfiguration = DeviceConfigurationQRCodeUtils.splitQRContent(content);
+
+ String identifier = connectionConfiguration.getA();
+ URL apkUrl = UrlHelper.tryConvertToURL(connectionConfiguration.getB());
+
+ if (apkUrl != null) {
+ String serverUrl = UrlHelper.getServerUrl(apkUrl);
+
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ preferences.edit().putString(getString(R.string.preference_identifier_key), identifier).commit();
+ preferences.edit().putString(getString(R.string.preference_server_url_key), serverUrl).commit();
+
+ new AutoUpdater(getActivity()).checkForUpdate(false);
+ return true;
+ } else {
+ Toast.makeText(getActivity(), getString(R.string.error_scanning_qr_malformed), Toast.LENGTH_LONG).show();
+ }
+ } catch (IllegalArgumentException e) {
+ Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ return false;
+ }
+}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java
index 6ecd9721a2d..3436960e568 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java
@@ -22,6 +22,7 @@ import com.sap.sailing.domain.common.impl.DeviceConfigurationQRCodeUtils;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.BuildConfig;
import com.sap.sailing.racecommittee.app.R;
+import com.sap.sailing.racecommittee.app.utils.UrlHelper;
import com.sap.sailing.racecommittee.app.utils.autoupdate.AutoUpdater;
import com.sap.sse.common.Util;
@@ -192,10 +193,10 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
Util.Pair connectionConfiguration = DeviceConfigurationQRCodeUtils.splitQRContent(content);
String identifier = connectionConfiguration.getA();
- URL apkUrl = tryConvertToURL(connectionConfiguration.getB());
+ URL apkUrl = UrlHelper.tryConvertToURL(connectionConfiguration.getB());
if (apkUrl != null) {
- String serverUrl = getServerUrl(apkUrl);
+ String serverUrl = UrlHelper.getServerUrl(apkUrl);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
preferences.edit().putString(getString(R.string.preference_identifier_key), identifier).commit();
@@ -207,33 +208,13 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
new AutoUpdater(getActivity()).checkForUpdate(false);
} else {
- String toastText = getString(R.string.error_scanning_qr_malformed);
- Toast.makeText(getActivity(), toastText, Toast.LENGTH_LONG).show();
+ Toast.makeText(getActivity(), getString(R.string.error_scanning_qr_malformed), Toast.LENGTH_LONG).show();
}
} catch (IllegalArgumentException e) {
- String toastText = getString(R.string.error_scanning_qr);
- toastText = String.format(toastText, e.getMessage());
- Toast.makeText(getActivity(), toastText, Toast.LENGTH_LONG).show();
+ Toast.makeText(getActivity(), getString(R.string.error_scanning_qr, e.getMessage()), Toast.LENGTH_LONG).show();
}
} else {
- String toastText = getString(R.string.error_scanning_qr);
- toastText = String.format(toastText, "" + resultCode);
- Toast.makeText(getActivity(), toastText, Toast.LENGTH_LONG).show();
- }
- }
-
- protected String getServerUrl(URL apkUrl) {
- String protocol = apkUrl.getProtocol();
- String host = apkUrl.getHost();
- String port = apkUrl.getPort() == -1 ? "" : ":" + apkUrl.getPort();
- return protocol + "://" + host + port;
- }
-
- private URL tryConvertToURL(String url) {
- try {
- return new URL(url);
- } catch (MalformedURLException e) {
- return null;
+ Toast.makeText(getActivity(), getString(R.string.error_scanning_qr, resultCode), Toast.LENGTH_LONG).show();
}
}
}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/UrlHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/UrlHelper.java
index e426e976c04..b16bb1fba6f 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/UrlHelper.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/UrlHelper.java
@@ -5,6 +5,7 @@ import java.net.URL;
import java.util.List;
import android.net.Uri;
+import android.support.annotation.Nullable;
import com.sap.sse.common.Util;
@@ -19,4 +20,19 @@ public class UrlHelper {
}
return new URL(builder.build().toString());
}
+
+ public static String getServerUrl(URL url) {
+ String protocol = url.getProtocol();
+ String host = url.getHost();
+ String port = url.getPort() == -1 ? "" : ":" + url.getPort();
+ return protocol + "://" + host + port;
+ }
+
+ public static @Nullable URL tryConvertToURL(String url) {
+ try {
+ return new URL(url);
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ }
}