Merge pull request #4449 from alexzatsepin/MAPSME-2593-uber-integration

Mapsme 2593 uber integration
This commit is contained in:
ygorshenin 2016-10-12 17:38:46 +03:00 committed by GitHub
commit c0f1cea5af
41 changed files with 985 additions and 175 deletions

4
.gitignore vendored
View file

@ -133,3 +133,7 @@ android/fabric.properties
android/pushwoosh.properties
android/res/values/google-service.xml
server
*.li
*.autosave

View file

@ -93,6 +93,7 @@ LOCAL_SRC_FILES := \
com/mapswithme/maps/settings/UnitLocale.cpp \
com/mapswithme/maps/sound/tts.cpp \
com/mapswithme/maps/SponsoredHotel.cpp \
com/mapswithme/maps/uber/Uber.cpp \
com/mapswithme/maps/TrackRecorder.cpp \
com/mapswithme/maps/UserMarkHelper.cpp \
com/mapswithme/opengl/android_gl_utils.cpp \

View file

@ -513,6 +513,17 @@ void Framework::EnableDownloadOn3g()
m_work.GetDownloadingPolicy().EnableCellularDownload(true);
}
uint64_t Framework::RequestUberProducts(ms::LatLon const & from, ms::LatLon const & to,
uber::ProductsCallback const & callback)
{
return m_work.GetUberApi().GetAvailableProducts(from, to, callback);
}
uber::RideRequestLinks Framework::GetUberLinks(string const & productId, ms::LatLon const & from, ms::LatLon const & to)
{
return uber::Api::GetRideRequestLinks(productId, from, to);
}
} // namespace android
@ -1182,5 +1193,4 @@ Java_com_mapswithme_maps_Framework_nativeSetVisibleRect(JNIEnv * env, jclass, ji
{
frm()->SetVisibleViewport(m2::RectD(left, top, right, bottom));
}
} // extern "C"
} // extern "C"

View file

@ -166,6 +166,9 @@ namespace android
bool IsAutoRetryDownloadFailed();
bool IsDownloadOn3gEnabled();
void EnableDownloadOn3g();
uint64_t RequestUberProducts(ms::LatLon const & from, ms::LatLon const & to, uber::ProductsCallback const & callback);
static uber::RideRequestLinks GetUberLinks(string const & productId, ms::LatLon const & from, ms::LatLon const & to);
};
}

View file

@ -2,9 +2,7 @@
#include "../core/jni_helper.hpp"
#include "../platform/Platform.hpp"
#include "map/place_page_info.hpp"
#include "partners_api/booking_api.hpp"
#include "std/bind.hpp"

View file

@ -0,0 +1,99 @@
#include "../Framework.hpp"
#include "../../core/jni_helper.hpp"
#include "partners_api/uber_api.hpp"
namespace
{
jclass g_uberClass;
jclass g_productClass;
jclass g_routingControllerClass;
jclass g_uberInfoClass;
jmethodID g_uberInfoConstructor;
jobject g_routingControllerInstance;
jmethodID g_productConstructor;
jmethodID g_routingControllerGetMethod;
jmethodID g_uberInfoCallbackMethod;
jclass g_uberLinksClass;
jmethodID g_uberLinksConstructor;
uint64_t g_lastRequestId;
void PrepareClassRefs(JNIEnv * env)
{
if (g_uberClass)
return;
g_uberClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/uber/UberInfo");
g_productClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/uber/UberInfo$Product");
g_routingControllerClass =
jni::GetGlobalClassRef(env, "com/mapswithme/maps/routing/RoutingController");
g_productConstructor = jni::GetConstructorID(
env, g_productClass,
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
g_uberInfoClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/uber/UberInfo");
g_routingControllerGetMethod = jni::GetStaticMethodID(
env, g_routingControllerClass, "get", "()Lcom/mapswithme/maps/routing/RoutingController;");
g_routingControllerInstance =
env->CallStaticObjectMethod(g_routingControllerClass, g_routingControllerGetMethod);
g_uberInfoCallbackMethod =
jni::GetMethodID(env, g_routingControllerInstance, "onUberInfoReceived",
"(Lcom/mapswithme/maps/uber/UberInfo;)V");
g_uberInfoConstructor = jni::GetConstructorID(env, g_uberInfoClass,
"([Lcom/mapswithme/maps/uber/UberInfo$Product;)V");
g_uberLinksClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/uber/UberLinks");
g_uberLinksConstructor =
jni::GetConstructorID(env, g_uberLinksClass, "(Ljava/lang/String;Ljava/lang/String;)V");
}
} // namespace
extern "C" {
JNIEXPORT void JNICALL Java_com_mapswithme_maps_uber_Uber_nativeRequestUberProducts(
JNIEnv * env, jclass clazz, jdouble srcLat, jdouble srcLon, jdouble dstLat, jdouble dstLon)
{
PrepareClassRefs(env);
ms::LatLon const from(srcLat, srcLon);
ms::LatLon const to(dstLat, dstLon);
g_lastRequestId = g_framework->RequestUberProducts(
from, to, [](vector<uber::Product> const & products, uint64_t const requestId) {
GetPlatform().RunOnGuiThread([=]() {
if (g_lastRequestId != requestId)
return;
JNIEnv * env = jni::GetEnv();
auto uberProducts = jni::ToJavaArray(
env, g_productClass, products, [](JNIEnv * env, uber::Product const & item) {
return env->NewObject(
g_productClass, g_productConstructor, jni::ToJavaString(env, item.m_productId),
jni::ToJavaString(env, item.m_name), jni::ToJavaString(env, item.m_time),
jni::ToJavaString(env, item.m_price));
});
jobject const routingControllerInstance =
env->CallStaticObjectMethod(g_routingControllerClass, g_routingControllerGetMethod);
env->CallVoidMethod(routingControllerInstance, g_uberInfoCallbackMethod,
env->NewObject(g_uberInfoClass, g_uberInfoConstructor, uberProducts));
});
});
}
JNIEXPORT jobject JNICALL Java_com_mapswithme_maps_uber_Uber_nativeGetUberLinks(
JNIEnv * env, jclass clazz, jstring productId, jdouble srcLat, jdouble srcLon, jdouble dstLat,
jdouble dstLon)
{
PrepareClassRefs(env);
ms::LatLon const from(srcLat, srcLon);
ms::LatLon const to(dstLat, dstLon);
uber::RideRequestLinks const links =
android::Framework::GetUberLinks(jni::ToNativeString(env, productId), from, to);
return env->NewObject(g_uberLinksClass, g_uberLinksConstructor,
jni::ToJavaString(env, links.m_deepLink),
jni::ToJavaString(env, links.m_universalLink));
}
} // extern "C"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_accent_pressed_night"
<item android:drawable="@drawable/button_start_pressed_night"
android:state_pressed="true"/>
<item android:drawable="@drawable/button_accent_normal_night"
android:state_enabled="true"/>
<item android:drawable="@drawable/button_start_normal_night"
android:state_enabled="true"/>
<item android:drawable="@drawable/button_accent_disabled_night"/>
<item android:drawable="@drawable/button_start_disabled_night"/>
</selector>

View file

@ -9,9 +9,14 @@
<include layout="@layout/routing_plan"/>
<include
layout="@layout/altitude_chart_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
layout="@layout/altitude_chart_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<include
layout="@layout/uber_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Space
android:layout_width="match_parent"
@ -23,7 +28,9 @@
android:layout_height="1dp"
android:background="?dividerHorizontal"/>
<include layout="@layout/start_button"
android:layout_width="match_parent"
android:layout_height="48dp"/>
<include
layout="@layout/start_button"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="48dp"/>
</LinearLayout>

View file

@ -6,7 +6,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/altitude_chart_panel"/>
<include layout="@layout/altitude_chart_panel"
tools:visibility="gone"/>
<include layout="@layout/uber_panel"/>
<include layout="@layout/start_button"/>
<TextView
android:id="@+id/error"
android:paddingLeft="@dimen/margin_base"
android:paddingStart="@dimen/margin_base"
android:paddingRight="@dimen/margin_base"
android:paddingEnd="@dimen/margin_base"
android:paddingTop="@dimen/margin_half_plus"
android:paddingBottom="@dimen/margin_half_plus"
android:textAppearance="@style/MwmTextAppearance.Body3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>

View file

@ -55,9 +55,9 @@
android:id="@+id/progress_vehicle"
style="@style/MwmWidget.ProgressWheel.RoutingPlan"
android:layout_marginLeft="@dimen/routing_selector_wheel_margin"
android:layout_marginStart="@dimen/routing_selector_wheel_margin"
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
tools:visibility="visible" />
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"/>
<com.mapswithme.maps.widget.WheelProgressView
android:id="@+id/progress_bicycle"
@ -65,16 +65,23 @@
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
tools:visibility="visible" />
android:layout_marginRight="12dp"/>
<com.mapswithme.maps.widget.WheelProgressView
android:id="@+id/progress_pedestrian"
style="@style/MwmWidget.ProgressWheel.RoutingPlan"
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
android:layout_marginRight="@dimen/routing_selector_wheel_margin"
tools:visibility="visible" />
android:layout_marginRight="12dp"
android:layout_marginEnd="12dp"/>
<com.mapswithme.maps.widget.WheelProgressView
android:id="@+id/progress_taxi"
style="@style/MwmWidget.ProgressWheel.RoutingPlan"
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
android:layout_marginRight="@dimen/routing_selector_wheel_margin"
android:layout_marginEnd="@dimen/routing_selector_wheel_margin"/>
</LinearLayout>
@ -106,8 +113,16 @@
android:id="@+id/pedestrian"
android:layout_width="@dimen/routing_selector_size"
android:layout_height="@dimen/routing_selector_size"
android:layout_marginRight="@dimen/routing_selector_wheel_margin"
tools:button="@drawable/ic_walk"
tools:buttonTint="?iconTintLight" />
<RadioButton
android:id="@+id/taxi"
android:layout_width="@dimen/routing_selector_size"
android:layout_height="@dimen/routing_selector_size"
tools:button="@drawable/ic_route_type_taxi"
tools:buttonTint="?iconTintLight" />
</RadioGroup>
<ImageView

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/product_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/MwmTextAppearance.RoutingDetail"
tools:text="UberX"/>
<TextView
android:id="@+id/arrival_time_price"
android:layout_marginTop="@dimen/margin_quarter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/MwmTextAppearance.Body3"
android:maxLines="2"
tools:text="Ожидание 10 мин • 350-400 \u20BD"/>
</LinearLayout>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/uber_panel"
android:paddingLeft="@dimen/margin_base"
android:paddingStart="@dimen/margin_base"
android:paddingEnd="@dimen/margin_base"
android:paddingRight="@dimen/margin_base"
android:paddingTop="@dimen/margin_base"
android:paddingBottom="@dimen/margin_half"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_logo_uber"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_marginStart="@dimen/margin_double"
android:layout_marginLeft="@dimen/margin_double"
android:layout_toRightOf="@id/icon"
android:layout_toEndOf="@id/icon"
android:layout_width="wrap_content"
android:layout_height="64dp"/>
<LinearLayout
android:id="@+id/indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerHorizontal="true"
android:layout_below="@id/pager"
android:layout_marginTop="@dimen/margin_half"
tools:background="?secondary"
tools:layout_height="4dp"
tools:layout_width="16dp"/>
</RelativeLayout>

View file

@ -36,7 +36,8 @@
</style>
<style name="MwmWidget.Button.Start">
<item name="android:background">@drawable/button_start</item>
<item name="android:background">?startButtonBackground</item>
<item name="android:textColor">?accentButtonTextColor</item>
<item name="android:textSize">14sp</item>
</style>

View file

@ -47,6 +47,8 @@
<attr name="redButtonTextColor" format="color"/>
<attr name="redButtonTextColorDisabled" format="color"/>
<attr name="startButtonBackground" format="reference"/>
<attr name="circleAccent" format="reference"/>
<attr name="menuBackground" format="color"/>

View file

@ -59,6 +59,8 @@
<item name="redButtonTextColor">@color/button_red_text</item>
<item name="redButtonTextColorDisabled">@color/button_red_text_disabled</item>
<item name="startButtonBackground">@drawable/button_start</item>
<item name="circleAccent">@drawable/circle_accent</item>
<item name="menuBackground">@color/bg_menu</item>
@ -141,6 +143,8 @@
<item name="redButtonTextColor">@color/button_red_text</item>
<item name="redButtonTextColorDisabled">@color/button_red_text_disabled</item>
<item name="startButtonBackground">@drawable/button_start_night</item>
<item name="circleAccent">@drawable/circle_accent_night</item>
<item name="menuBackground">@color/bg_menu_night</item>

View file

@ -7,9 +7,6 @@ import android.support.annotation.Nullable;
import android.support.annotation.Size;
import android.support.annotation.UiThread;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import com.mapswithme.maps.api.ParsedRoutingData;
import com.mapswithme.maps.api.ParsedUrlMwmRequest;
import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut;
@ -17,6 +14,9 @@ import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.routing.RoutingInfo;
import com.mapswithme.util.Constants;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* This class wraps android::Framework.cpp class
* via static methods
@ -28,12 +28,14 @@ public class Framework
public static final int MAP_STYLE_CLEAR = 2;
@Retention(RetentionPolicy.SOURCE)
@IntDef({ROUTER_TYPE_VEHICLE, ROUTER_TYPE_PEDESTRIAN, ROUTER_TYPE_BICYCLE})
@IntDef({ROUTER_TYPE_VEHICLE, ROUTER_TYPE_PEDESTRIAN, ROUTER_TYPE_BICYCLE, ROUTER_TYPE_TAXI})
public @interface RouterType {}
public static final int ROUTER_TYPE_VEHICLE = 0;
public static final int ROUTER_TYPE_PEDESTRIAN = 1;
public static final int ROUTER_TYPE_BICYCLE = 2;
public static final int ROUTER_TYPE_TAXI = 3;
@SuppressWarnings("unused")
public interface MapObjectListener

View file

@ -28,6 +28,7 @@ import com.mapswithme.maps.api.ParsedMwmRequest;
import com.mapswithme.maps.api.ParsedRoutingData;
import com.mapswithme.maps.api.ParsedUrlMwmRequest;
import com.mapswithme.maps.api.RoutePoint;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.base.BaseMwmFragmentActivity;
import com.mapswithme.maps.base.OnBackPressListener;
import com.mapswithme.maps.bookmarks.BookmarkCategoriesActivity;
@ -745,7 +746,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
if (fragment != null)
fragment.saveAltitudeChartState(outState);
fragment.saveRoutingPanelState(outState);
}
if (mNavigationController != null)
@ -904,8 +905,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
super.onStart();
RoutingController.get().attach(this);
if (!mIsFragmentContainer)
mRoutingPlanInplaceController.setStartButton();
if (MapFragment.nativeIsEngineCreated())
LocationHelper.INSTANCE.attach(this);
@ -1405,21 +1404,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
@Override
public void onRouteBuilt(@Framework.RouterType int router)
{
if (mIsFragmentContainer)
{
RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
if (fragment != null)
fragment.showRouteAltitudeChart(router != Framework.ROUTER_TYPE_VEHICLE);
}
else
{
mRoutingPlanInplaceController.showRouteAltitudeChart(router != Framework.ROUTER_TYPE_VEHICLE);
}
}
@Override
public void updateBuildProgress(int progress, @Framework.RouterType int router)
{
@ -1435,6 +1419,22 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
@Override
public void onUberInfoReceived(@NonNull UberInfo info)
{
if (mIsFragmentContainer)
{
RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class);
if (fragment != null)
fragment.showUberInfo(info);
}
else
{
mRoutingPlanInplaceController.showUberInfo(info);
mMainMenu.showLineFrame(true);
}
}
boolean isFirstStart()
{
boolean res = mFirstStart;

View file

@ -5,25 +5,27 @@ import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.DimenRes;
import android.support.annotation.IntRange;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.uber.Uber;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.uber.UberLinks;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.downloader.MapManager;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.util.Config;
import com.mapswithme.util.StringUtils;
import com.mapswithme.util.ThemeSwitcher;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
import com.mapswithme.util.concurrency.UiThread;
import com.mapswithme.util.log.DebugLogger;
@ -63,7 +65,7 @@ public class RoutingController
void showDownloader(boolean openDownloaded);
void updateMenu();
void updatePoints();
void onRouteBuilt(@Framework.RouterType int router);
void onUberInfoReceived(@NonNull UberInfo info);
/**
* @param progress progress to be displayed.
@ -73,15 +75,16 @@ public class RoutingController
private static final RoutingController sInstance = new RoutingController();
private final Logger mLogger = new DebugLogger("RCSTATE");
@Nullable
private Container mContainer;
private Button mStartButton;
private BuildState mBuildState = BuildState.NONE;
private State mState = State.NONE;
private int mWaitingPoiPickSlot = NO_SLOT;
@Nullable
private MapObject mStartPoint;
@Nullable
private MapObject mEndPoint;
private int mLastBuildProgress;
@ -117,8 +120,6 @@ public class RoutingController
mCachedRoutingInfo = Framework.nativeGetRouteFollowingInfo();
setBuildState(BuildState.BUILT);
mLastBuildProgress = 100;
if (mContainer != null)
mContainer.onRouteBuilt(mLastRouterType);
}
processRoutingEvent();
@ -227,7 +228,6 @@ public class RoutingController
public void detach()
{
mContainer = null;
mStartButton = null;
}
public void restore()
@ -259,6 +259,8 @@ public class RoutingController
org.alohalytics.Statistics.logEvent(AlohaHelper.ROUTING_BUILD, new String[] {Statistics.EventParam.FROM, Statistics.getPointType(mStartPoint),
Statistics.EventParam.TO, Statistics.getPointType(mEndPoint)});
Framework.nativeBuildRoute(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI)
requestUberInfo();
}
private void showDisclaimer(final MapObject startPoint, final MapObject endPoint)
@ -400,25 +402,6 @@ public class RoutingController
private void updatePlan()
{
updateProgress();
updateStartButton();
}
private void updateStartButton()
{
mLogger.d("updateStartButton" + (mStartButton == null ? ": SKIP" : ""));
if (mStartButton == null)
return;
mStartButton.setEnabled(mState == State.PREPARE && mBuildState == BuildState.BUILT);
UiUtils.updateAccentButton(mStartButton);
}
void setStartButton(@Nullable Button button)
{
mLogger.d("setStartButton");
mStartButton = button;
updateStartButton();
}
private void cancelInternal()
@ -730,7 +713,7 @@ public class RoutingController
mContainer.updatePoints();
}
static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
{
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
long hours = TimeUnit.SECONDS.toHours(seconds);
@ -767,4 +750,27 @@ public class RoutingController
return true;
}
private void requestUberInfo()
{
Uber.nativeRequestUberProducts(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
}
@NonNull
UberLinks getUberLink(@NonNull String productId)
{
return Uber.nativeGetUberLinks(productId, mStartPoint.getLat(), mStartPoint.getLon(), mStartPoint.getLat(), mEndPoint.getLon());
}
/**
* Called from the native code
* @param info this object contains information about Uber products
*/
@MainThread
private void onUberInfoReceived(@NonNull UberInfo info)
{
mLogger.d("onUberInfoReceived uberInfo = " + info);
if (mContainer != null)
mContainer.onUberInfoReceived(info);
}
}

View file

@ -7,8 +7,13 @@ import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RadioButton;
@ -16,20 +21,28 @@ import android.widget.RadioGroup;
import android.widget.TextView;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.uber.UberAdapter;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.uber.UberLinks;
import com.mapswithme.maps.widget.DotPager;
import com.mapswithme.maps.widget.RotateDrawable;
import com.mapswithme.maps.widget.ToolbarController;
import com.mapswithme.maps.widget.WheelProgressView;
import com.mapswithme.util.Graphics;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
import com.mapswithme.util.statistics.AlohaHelper;
import com.mapswithme.util.statistics.Statistics;
public class RoutingPlanController extends ToolbarController
{
static final int ANIM_TOGGLE = MwmApplication.get().getResources().getInteger(R.integer.anim_slots_toggle);
private static final String STATE_ALTITUDE_CHART_SHOWN = "altitude chart shown";
private static final String STATE_ALTITUDE_CHART_SHOWN = "altitude_chart_shown";
private static final String STATE_TAXI_INFO = "taxi_info";
protected final View mFrame;
private final ImageView mToggle;
@ -38,13 +51,19 @@ public class RoutingPlanController extends ToolbarController
private final WheelProgressView mProgressVehicle;
private final WheelProgressView mProgressPedestrian;
private final WheelProgressView mProgressBicycle;
private final WheelProgressView mProgressTaxi;
private final View mAltitudeChartFrame;
private final View mUberFrame;
private final RotateDrawable mToggleImage = new RotateDrawable(R.drawable.ic_down);
private int mFrameHeight;
private int mToolbarHeight;
private boolean mOpen;
private boolean mAltitudeChartShown;
@Nullable
private UberInfo mUberInfo;
@Nullable
private UberInfo.Product mUberProduct;
private RadioButton setupRouterButton(@IdRes int buttonId, final @DrawableRes int iconRes, View.OnClickListener clickListener)
{
@ -66,7 +85,7 @@ public class RoutingPlanController extends ToolbarController
return rb;
}
public RoutingPlanController(View root, Activity activity)
RoutingPlanController(View root, Activity activity)
{
super(root, activity);
mFrame = root;
@ -108,18 +127,29 @@ public class RoutingPlanController extends ToolbarController
}
});
setupRouterButton(R.id.taxi, R.drawable.ic_taxi, new View.OnClickListener()
{
@Override
public void onClick(View v)
{
AlohaHelper.logClick(AlohaHelper.ROUTING_TAXI_SET);
Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_TAXI_SET);
RoutingController.get().setRouterType(Framework.ROUTER_TYPE_TAXI);
}
});
View progressFrame = mToolbar.findViewById(R.id.progress_frame);
mProgressVehicle = (WheelProgressView) progressFrame.findViewById(R.id.progress_vehicle);
mProgressPedestrian = (WheelProgressView) progressFrame.findViewById(R.id.progress_pedestrian);
mProgressBicycle = (WheelProgressView) progressFrame.findViewById(R.id.progress_bicycle);
mProgressTaxi = (WheelProgressView) progressFrame.findViewById(R.id.progress_taxi);
View altitudeChartFrame = mFrame.findViewById(R.id.altitude_chart_panel);
if (altitudeChartFrame == null)
altitudeChartFrame = mActivity.findViewById(R.id.altitude_chart_panel);
mAltitudeChartFrame = altitudeChartFrame;
mAltitudeChartFrame = getViewById(R.id.altitude_chart_panel);
UiUtils.hide(mAltitudeChartFrame);
mUberFrame = getViewById(R.id.uber_panel);
UiUtils.hide(mUberFrame);
mToggle.setImageDrawable(mToggleImage);
mToggle.setOnClickListener(new View.OnClickListener()
{
@ -173,14 +203,22 @@ public class RoutingPlanController extends ToolbarController
return;
}
if (!isTaxiRouteChecked())
setStartButton();
showAltitudeChartAndRoutingDetails();
}
private void showAltitudeChartAndRoutingDetails()
{
UiUtils.show(mAltitudeChartFrame);
mAltitudeChartShown = true;
if (isTaxiRouteChecked())
return;
UiUtils.hide(getViewById(R.id.error));
UiUtils.hide(mUberFrame);
showRouteAltitudeChart();
showRoutingDetails();
UiUtils.show(mAltitudeChartFrame);
}
private void showRoutingDetails()
@ -213,13 +251,11 @@ public class RoutingPlanController extends ToolbarController
return;
UiUtils.hide(mAltitudeChartFrame);
mAltitudeChartShown = false;
}
public void updateBuildProgress(int progress, @Framework.RouterType int router)
{
updateProgressLabels();
UiUtils.invisible(mProgressVehicle, mProgressPedestrian, mProgressBicycle);
UiUtils.invisible(mProgressVehicle, mProgressPedestrian, mProgressBicycle, mProgressTaxi);
WheelProgressView progressView;
if (router == Framework.ROUTER_TYPE_VEHICLE)
{
@ -231,12 +267,19 @@ public class RoutingPlanController extends ToolbarController
mRouterTypes.check(R.id.pedestrian);
progressView = mProgressPedestrian;
}
else if (router == Framework.ROUTER_TYPE_TAXI)
{
mRouterTypes.check(R.id.taxi);
progressView = mProgressTaxi;
}
else
{
mRouterTypes.check(R.id.bicycle);
progressView = mProgressBicycle;
}
updateProgressLabels();
if (!RoutingController.get().isBuilding())
return;
@ -253,7 +296,7 @@ public class RoutingPlanController extends ToolbarController
showSlots(!mOpen, true);
}
protected void showSlots(final boolean show, final boolean animate)
void showSlots(final boolean show, final boolean animate)
{
if (!checkFrameHeight())
{
@ -296,12 +339,17 @@ public class RoutingPlanController extends ToolbarController
}
}
protected boolean isVehicleRouteChecked()
private boolean isVehicleRouteChecked()
{
return mRouterTypes.getCheckedRadioButtonId() == R.id.vehicle;
}
public void disableToggle()
private boolean isTaxiRouteChecked()
{
return mRouterTypes.getCheckedRadioButtonId() == R.id.taxi;
}
void disableToggle()
{
UiUtils.hide(mToggle);
showSlots(true, false);
@ -312,15 +360,15 @@ public class RoutingPlanController extends ToolbarController
return mOpen;
}
public void showRouteAltitudeChart(boolean show)
public void showRouteAltitudeChart()
{
ImageView altitudeChart = (ImageView) mFrame.findViewById(R.id.altitude_chart);
showRouteAltitudeChartInternal(show, altitudeChart);
showRouteAltitudeChartInternal(altitudeChart);
}
protected void showRouteAltitudeChartInternal(boolean show, ImageView altitudeChart)
void showRouteAltitudeChartInternal(@NonNull ImageView altitudeChart)
{
if (!show)
if (isVehicleRouteChecked())
{
UiUtils.hide(altitudeChart);
return;
@ -336,14 +384,112 @@ public class RoutingPlanController extends ToolbarController
}
}
public void saveAltitudeChartState(@NonNull Bundle outState)
public void showUberInfo(@NonNull UberInfo info)
{
outState.putBoolean(STATE_ALTITUDE_CHART_SHOWN, mAltitudeChartShown);
final UberInfo.Product[] products = info.getProducts();
if (products == null || products.length == 0)
{
UiUtils.hide(mUberFrame);
showError(R.string.taxi_not_found);
return;
}
UiUtils.hide(getViewById(R.id.error));
mUberInfo = info;
mUberProduct = products[0];
final PagerAdapter adapter = new UberAdapter(mActivity, products);
DotPager pager = new DotPager.Builder(mActivity, (ViewPager) mUberFrame.findViewById(R.id.pager), adapter)
.setIndicatorContainer((ViewGroup) mUberFrame.findViewById(R.id.indicator))
.setPageChangedListener(new DotPager.OnPageChangedListener()
{
@Override
public void onPageChanged(int position)
{
mUberProduct = products[position];
}
}).build();
pager.show();
setStartButton();
UiUtils.hide(mAltitudeChartFrame);
UiUtils.show(mUberFrame);
}
public void restoreAltitudeChartState(@NonNull Bundle state)
private void showError(@StringRes int message)
{
TextView error = (TextView) getViewById(R.id.error);
error.setText(message);
error.setVisibility(View.VISIBLE);
getViewById(R.id.start).setVisibility(View.GONE);
}
@NonNull
private View getViewById(@IdRes int resourceId)
{
View view = mFrame.findViewById(resourceId);
if (view == null)
view = mActivity.findViewById(resourceId);
return view;
}
void saveRoutingPanelState(@NonNull Bundle outState)
{
outState.putBoolean(STATE_ALTITUDE_CHART_SHOWN, UiUtils.isVisible(mAltitudeChartFrame));
outState.putParcelable(STATE_TAXI_INFO, mUberInfo);
}
void restoreRoutingPanelState(@NonNull Bundle state)
{
if (state.getBoolean(STATE_ALTITUDE_CHART_SHOWN))
showRouteAltitudeChart(!isVehicleRouteChecked());
showRouteAltitudeChart();
UberInfo info = state.getParcelable(STATE_TAXI_INFO);
if (info != null)
showUberInfo(info);
}
private void setStartButton()
{
Button start = (Button) getViewById(R.id.start);
if (isTaxiRouteChecked())
{
start.setText(R.string.taxi_order);
start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mUberProduct != null)
{
UberLinks links = RoutingController.get().getUberLink(mUberProduct.getProductId());
Utils.launchUber(mActivity, links);
}
}
});
} else
{
start.setText(mActivity.getText(R.string.p2p_start));
start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((MwmActivity)mActivity).closeMenu(Statistics.EventName.ROUTING_START, AlohaHelper.ROUTING_START, new Runnable()
{
@Override
public void run()
{
RoutingController.get().start();
}
});
}
});
}
UiUtils.updateAccentButton(start);
UiUtils.show(start);
}
}

View file

@ -6,16 +6,17 @@ import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.R;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.base.BaseMwmFragment;
import com.mapswithme.maps.base.OnBackPressListener;
public class RoutingPlanFragment extends BaseMwmFragment
implements OnBackPressListener
{
private RoutingPlanController mPlanController;
@Override
@ -26,20 +27,9 @@ public class RoutingPlanFragment extends BaseMwmFragment
mPlanController = new RoutingPlanController(res, getActivity());
updatePoints();
Button start = (Button) res.findViewById(R.id.start);
RoutingController.get().setStartButton(start);
start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
RoutingController.get().start();
}
});
Bundle activityState = getMwmActivity().getSavedInstanceState();
if (activityState != null)
restoreAltitudeChartState(activityState);
restoreRoutingPanelState(activityState);
return res;
}
@ -50,13 +40,6 @@ public class RoutingPlanFragment extends BaseMwmFragment
mPlanController.disableToggle();
}
@Override
public void onDestroyView()
{
super.onDestroyView();
RoutingController.get().setStartButton(null);
}
public void updatePoints()
{
mPlanController.updatePoints();
@ -67,24 +50,24 @@ public class RoutingPlanFragment extends BaseMwmFragment
mPlanController.updateBuildProgress(progress, router);
}
public void showUberInfo(@NonNull UberInfo info)
{
mPlanController.showUberInfo(info);
}
@Override
public boolean onBackPressed()
{
return RoutingController.get().cancelPlanning();
}
public void showRouteAltitudeChart(boolean show)
public void restoreRoutingPanelState(@NonNull Bundle state)
{
mPlanController.showRouteAltitudeChart(show);
mPlanController.restoreRoutingPanelState(state);
}
public void restoreAltitudeChartState(@NonNull Bundle state)
public void saveRoutingPanelState(@NonNull Bundle outState)
{
mPlanController.restoreAltitudeChartState(state);
}
public void saveAltitudeChartState(@NonNull Bundle outState)
{
mPlanController.saveAltitudeChartState(outState);
mPlanController.saveRoutingPanelState(outState);
}
}

View file

@ -3,8 +3,6 @@ package com.mapswithme.maps.routing;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.mapswithme.maps.MwmActivity;
@ -12,8 +10,6 @@ import com.mapswithme.maps.R;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.statistics.AlohaHelper;
import com.mapswithme.util.statistics.Statistics;
public class RoutingPlanInplaceController extends RoutingPlanController
{
@ -56,33 +52,10 @@ public class RoutingPlanInplaceController extends RoutingPlanController
updatePoints();
}
public void setStartButton()
{
final MwmActivity activity = (MwmActivity) mActivity;
Button start = activity.getMainMenu().getRouteStartButton();
RoutingController.get().setStartButton(start);
start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
activity.closeMenu(Statistics.EventName.ROUTING_START, AlohaHelper.ROUTING_START, new Runnable()
{
@Override
public void run()
{
RoutingController.get().start();
}
});
}
});
}
public void onSaveState(@NonNull Bundle outState)
{
outState.putBoolean(STATE_OPEN, isOpen());
saveAltitudeChartState(outState);
saveRoutingPanelState(outState);
}
public void restoreState(@NonNull Bundle state)
@ -90,13 +63,13 @@ public class RoutingPlanInplaceController extends RoutingPlanController
if (state.containsKey(STATE_OPEN))
mSlotsRestoredState = state.getBoolean(STATE_OPEN);
restoreAltitudeChartState(state);
restoreRoutingPanelState(state);
}
@Override
public void showRouteAltitudeChart(boolean show)
public void showRouteAltitudeChart()
{
ImageView altitudeChart = (ImageView) mActivity.findViewById(R.id.altitude_chart);
showRouteAltitudeChartInternal(show, altitudeChart);
showRouteAltitudeChartInternal(altitudeChart);
}
}

View file

@ -0,0 +1,12 @@
package com.mapswithme.maps.uber;
import android.support.annotation.NonNull;
public class Uber
{
public static native void nativeRequestUberProducts(double srcLat, double srcLon, double dstLat, double dstLon);
@NonNull
public static native UberLinks nativeGetUberLinks(@NonNull String productId, double srcLon, double srcLat,
double dstLat, double dstLon);
}

View file

@ -0,0 +1,60 @@
package com.mapswithme.maps.uber;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mapswithme.maps.R;
import com.mapswithme.maps.routing.RoutingController;
public class UberAdapter extends PagerAdapter
{
@NonNull
private final Context mContext;
@NonNull
private final UberInfo.Product[] mProducts;
public UberAdapter(@NonNull Context context, @NonNull UberInfo.Product[] products)
{
mContext = context;
mProducts = products;
}
@Override
public int getCount()
{
return mProducts.length;
}
@Override
public boolean isViewFromObject(View view, Object object)
{
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position)
{
UberInfo.Product product = mProducts[position];
View v = LayoutInflater.from(mContext).inflate(R.layout.uber_pager_item, container, false);
TextView name = (TextView) v.findViewById(R.id.product_name);
name.setText(product.getName());
TextView timeAndPrice = (TextView) v.findViewById(R.id.arrival_time_price);
int time = Integer.parseInt(product.getTime());
CharSequence waitTime = RoutingController.formatRoutingTime(mContext, time, R.dimen.text_size_body_3);
timeAndPrice.setText(mContext.getString(R.string.taxi_wait, waitTime + "" + product.getPrice()));
container.addView(v, 0);
return v;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
container.removeView((View) object);
}
}

View file

@ -0,0 +1,159 @@
package com.mapswithme.maps.uber;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Arrays;
public class UberInfo implements Parcelable
{
public static final Parcelable.Creator<UberInfo> CREATOR = new Parcelable.Creator<UberInfo>()
{
@Override
public UberInfo createFromParcel(Parcel source)
{
return new UberInfo(source);
}
@Override
public UberInfo[] newArray(int size)
{
return new UberInfo[size];
}
};
@Nullable
private final Product[] mProducts;
private UberInfo(@Nullable Product[] products)
{
mProducts = products;
}
private UberInfo(@NonNull Parcel parcel)
{
mProducts = (Product[]) parcel.readParcelableArray(Product.class.getClassLoader());
}
@Nullable
public Product[] getProducts()
{
return mProducts;
}
@Override
public String toString()
{
return "UberInfo{" +
"mProducts=" + Arrays.toString(mProducts) +
'}';
}
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeParcelableArray(mProducts, 0);
}
public static class Product implements Parcelable
{
public static final Parcelable.Creator<Product> CREATOR = new Parcelable.Creator<Product>()
{
@Override
public Product createFromParcel(Parcel source)
{
return new Product(source);
}
@Override
public Product[] newArray(int size)
{
return new Product[size];
}
};
@NonNull
private final String mProductId;
@NonNull
private final String mName;
@NonNull
private final String mTime;
@NonNull
private final String mPrice;
private Product(@NonNull String productId, @NonNull String name, @NonNull String time, @NonNull String price)
{
mProductId = productId;
mName = name;
mTime = time;
mPrice = price;
}
private Product(@NonNull Parcel parcel)
{
mProductId = parcel.readString();
mName = parcel.readString();
mTime = parcel.readString();
mPrice = parcel.readString();
}
@NonNull
public String getProductId()
{
return mProductId;
}
@NonNull
public String getName()
{
return mName;
}
@NonNull
public String getTime()
{
return mTime;
}
@NonNull
public String getPrice()
{
return mPrice;
}
@Override
public String toString()
{
return "Product{" +
"mProductId='" + mProductId + '\'' +
", mName='" + mName + '\'' +
", mTime='" + mTime + '\'' +
", mPrice='" + mPrice + '\'' +
'}';
}
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeString(mProductId);
dest.writeString(mName);
dest.writeString(mTime);
dest.writeString(mPrice);
}
}
}

View file

@ -0,0 +1,29 @@
package com.mapswithme.maps.uber;
import android.support.annotation.NonNull;
public class UberLinks
{
@NonNull
private final String mDeepLink;
@NonNull
private final String mUniversalLink;
public UberLinks(@NonNull String deepLink, @NonNull String universalLink)
{
mDeepLink = deepLink;
mUniversalLink = universalLink;
}
@NonNull
public String getDeepLink()
{
return mDeepLink;
}
@NonNull
public String getUniversalLink()
{
return mUniversalLink;
}
}

View file

@ -0,0 +1,182 @@
package com.mapswithme.maps.widget;
import android.content.Context;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.mapswithme.maps.R;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
/**
* This widget allows the user to flip left and right through pages of data.
* Also it can be configured with indicator view that will be placed below of pages.
* The indicator will be drawn as the gray dots. A dots count will be equal page count.
* The bold dot corresponds the current page.
* <p>
* There are few dependencies that should be provided to get this
* widget work:
* <p>
* <ul>
* <li>@see {@link ViewPager}</li>
* <li>@see {@link PagerAdapter}</li>
* <li>An indicator. It's a {@link ViewGroup} which will consist dots. If the indicator
* is not needed this dependency can be missed or <code>null</code></li>
* <li>@see {@link Context}</li>
* <li>A page listener is an observable mechanism for listening page changing. It can be missed or null</li>
* </ul>
*/
public class DotPager implements ViewPager.OnPageChangeListener
{
@NonNull
private final ViewPager mPager;
@NonNull
private final PagerAdapter mAdapter;
@Nullable
private final ViewGroup mIndicator;
@NonNull
private final ImageView[] mDots;
@NonNull
private final Context mContext;
@Nullable
private final OnPageChangedListener mListener;
private DotPager(@NonNull Builder builder)
{
mContext = builder.mContext;
mPager = builder.mPager;
mAdapter = builder.mAdapter;
mIndicator = builder.mIndicatorContainer;
mListener = builder.mListener;
mDots = new ImageView[mAdapter.getCount()];
}
public void show()
{
configure();
updateIndicator();
}
private void configure()
{
configurePager();
configureIndicator();
}
private void configurePager()
{
mPager.setAdapter(mAdapter);
mPager.clearOnPageChangeListeners();
mPager.addOnPageChangeListener(this);
}
private void configureIndicator()
{
if (mIndicator == null)
return;
mIndicator.removeAllViews();
if (mAdapter.getCount() == 1)
return;
for (int i = 0; i < mDots.length; i++)
{
mDots[i] = new ImageView(mContext);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, UiUtils.dimen(mContext, R.dimen.margin_half), 0);
mIndicator.addView(mDots[i], i, layoutParams);
}
}
@Override
public void onPageSelected(int position)
{
if (mIndicator != null)
updateIndicator();
if (mListener != null)
mListener.onPageChanged(position);
}
private void updateIndicator()
{
if (mAdapter.getCount() == 1)
return;
int currentPage = mPager.getCurrentItem();
for (int i = 0; i < mAdapter.getCount(); i++)
{
boolean isCurPage = i == currentPage;
@DrawableRes int dotDrawable;
if (ThemeUtils.isNightTheme())
dotDrawable = isCurPage ? R.drawable.news_marker_active_night : R.drawable.news_marker_inactive_night;
else
dotDrawable = isCurPage ? R.drawable.news_marker_active : R.drawable.news_marker_inactive;
mDots[i].setImageResource(dotDrawable);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
//no op
}
@Override
public void onPageScrollStateChanged(int state)
{
//no op
}
public static class Builder
{
@NonNull
private final ViewPager mPager;
@NonNull
private final PagerAdapter mAdapter;
@Nullable
private ViewGroup mIndicatorContainer;
@NonNull
private final Context mContext;
@Nullable
private OnPageChangedListener mListener;
public Builder(@NonNull Context context, @NonNull ViewPager pager, @NonNull PagerAdapter adapter)
{
mContext = context;
mPager = pager;
mAdapter = adapter;
}
public Builder setIndicatorContainer(@NonNull ViewGroup indicatorContainer)
{
mIndicatorContainer = indicatorContainer;
return this;
}
public Builder setPageChangedListener(@Nullable OnPageChangedListener listener)
{
mListener = listener;
return this;
}
public DotPager build()
{
return new DotPager(this);
}
}
public interface OnPageChangedListener
{
void onPageChanged(int position);
}
}

View file

@ -13,6 +13,7 @@ import com.mapswithme.maps.downloader.UpdateInfo;
import com.mapswithme.maps.routing.RoutingController;
import com.mapswithme.util.Graphics;
import com.mapswithme.util.UiUtils;
import ru.mail.android.mytarget.core.models.Stat;
import java.util.ArrayList;
import java.util.HashMap;
@ -24,15 +25,22 @@ public class MainMenu extends BaseMenu
public enum State
{
MENU
{
@Override
boolean showToggle()
{
return false;
}
},
{
@Override
boolean showToggle()
{
return false;
}
},
NAVIGATION,
ROUTE_PREPARE;
ROUTE_PREPARE
{
@Override
boolean showToggle()
{
return false;
}
};
boolean showToggle()
{
@ -57,7 +65,6 @@ public class MainMenu extends BaseMenu
private final List<View> mCollapseViews = new ArrayList<>();
private final MenuToggle mToggle;
private Button mRouteStartButton;
// Maps Item into button view placed on mContentFrame
private final Map<Item, View> mItemViews = new HashMap<>();
@ -234,9 +241,6 @@ public class MainMenu extends BaseMenu
mNewsMarker = mButtonsFrame.findViewById(R.id.marker);
mNewsCounter = (TextView) mContentFrame.findViewById(R.id.counter);
if (mRoutePlanFrame != null)
mRouteStartButton = (Button) mRoutePlanFrame.findViewById(R.id.start);
init();
}
@ -261,8 +265,11 @@ public class MainMenu extends BaseMenu
expandContent = false;
} else
{
UiUtils.showIf(state == State.MENU, mButtonsFrame);
UiUtils.showIf(state == State.ROUTE_PREPARE, mRoutePlanFrame);
UiUtils.showIf(isRouting, mRoutePlanFrame);
if (isRouting)
mToggle.hide();
expandContent = isRouting;
}
@ -306,11 +313,6 @@ public class MainMenu extends BaseMenu
return mAnimationTrackListener;
}
public Button getRouteStartButton()
{
return mRouteStartButton;
}
public void showLineFrame(boolean show)
{
UiUtils.showIf(show, mLineFrame);

View file

@ -26,7 +26,7 @@ class MenuToggle
this(frame, heightRes, R.drawable.ic_menu_open, R.drawable.ic_menu_close);
}
MenuToggle(View frame, @DimenRes int heightRes, @DrawableRes int src, @DrawableRes int dst)
private MenuToggle(View frame, @DimenRes int heightRes, @DrawableRes int src, @DrawableRes int dst)
{
mButton = (ImageView) frame.findViewById(R.id.toggle);
mAlwaysShow = (frame.findViewById(R.id.disable_toggle) == null);
@ -67,9 +67,17 @@ class MenuToggle
void show(boolean show)
{
//TODO: refactor mAlwaysShow logic, because now we shouldn't display
// the toggle button when we are in prepare routing state (create JIRA item for that)
// A temporary solution is the hide() method.
UiUtils.showIf(mAlwaysShow || show, mButton);
}
void hide()
{
UiUtils.hide(mButton);
}
void setOpen(boolean open, boolean animate)
{
transitImage(mOpenImage, open, animate);

View file

@ -31,6 +31,7 @@ import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.activity.CustomNavigateUpListener;
import com.mapswithme.maps.uber.UberLinks;
import com.mapswithme.util.statistics.AlohaHelper;
import java.io.Closeable;
@ -399,4 +400,22 @@ public class Utils
return installationId;
}
public static void launchUber(@NonNull Activity context, @NonNull UberLinks links)
{
try
{
PackageManager pm = context.getPackageManager();
pm.getPackageInfo("com.ubercab", PackageManager.GET_ACTIVITIES);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(links.getDeepLink()));
context.startActivity(intent);
} catch (PackageManager.NameNotFoundException e)
{
// No Uber app! Open mobile website.
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(links.getUniversalLink()));
context.startActivity(i);
}
}
}

View file

@ -74,6 +74,7 @@ public class AlohaHelper
public static final String ROUTING_VEHICLE_SET = "routerSetVehicle";
public static final String ROUTING_PEDESTRIAN_SET = "routerSetPedestrian";
public static final String ROUTING_BICYCLE_SET = "routerSetBicycle";
public static final String ROUTING_TAXI_SET = "routerSetTaxi";
public static final String ROUTING_SWAP_POINTS = "routeSwapPoints";
public static final String ROUTING_TOGGLE = "routeToggle";
public static final String ROUTING_SEARCH_POINT = "routSearchPoint";

View file

@ -110,6 +110,7 @@ public enum Statistics
public static final String ROUTING_VEHICLE_SET = "Routing. Set vehicle";
public static final String ROUTING_PEDESTRIAN_SET = "Routing. Set pedestrian";
public static final String ROUTING_BICYCLE_SET = "Routing. Set bicycle";
public static final String ROUTING_TAXI_SET = "Routing. Set taxi";
public static final String ROUTING_SWAP_POINTS = "Routing. Swap points";
public static final String ROUTING_TOGGLE = "Routing. Toggle";
public static final String ROUTING_SEARCH_POINT = "Routing. Search point";