[android] Added speed camera view highlight

This commit is contained in:
Dmitry Donskoy 2018-12-05 18:27:46 +03:00 committed by Aleksandr Zatsepin
parent 7a563534f0
commit 75e52e2010
11 changed files with 190 additions and 166 deletions

View file

@ -1109,25 +1109,12 @@ Java_com_mapswithme_maps_Framework_nativeSetSpeedCamManagerMode(JNIEnv * env, jc
static_cast<routing::SpeedCameraManagerMode>(mode));
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_Framework_nativeShouldPlayWarningSignal(JNIEnv * env, jclass)
{
return frm()->GetRoutingManager().GetSpeedCamManager().ShouldPlayBeepSignal();
}
JNIEXPORT jint JNICALL
Java_com_mapswithme_maps_Framework_nativeGetSpeedCamManagerMode(JNIEnv * env, jclass)
{
return static_cast<jint>(frm()->GetRoutingManager().GetSpeedCamManager().GetMode());
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_Framework_nativeIsSpeedLimitExceeded(JNIEnv * env, jclass)
{
auto const & rm = frm()->GetRoutingManager();
return rm.IsRoutingActive() ? rm.IsSpeedLimitExceeded() : false;
}
JNIEXPORT jobject JNICALL
Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jclass)
{
@ -1148,7 +1135,7 @@ Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jcl
"(Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;DIIIDDII"
"[Lcom/mapswithme/maps/routing/SingleLaneInfo;)V");
"[Lcom/mapswithme/maps/routing/SingleLaneInfo;ZZ)V");
vector<location::FollowingInfo::SingleLaneInfoClient> const & lanes = info.m_lanes;
jobjectArray jLanes = nullptr;
@ -1173,12 +1160,16 @@ Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jcl
}
}
auto const & rm = frm()->GetRoutingManager();
auto const isSpeedLimitExceeded = rm.IsRoutingActive() ? rm.IsSpeedLimitExceeded() : false;
auto const shouldPlaySignal = frm()->GetRoutingManager().GetSpeedCamManager().ShouldPlayBeepSignal();
jobject const result = env->NewObject(
klass, ctorRouteInfoID, jni::ToJavaString(env, info.m_distToTarget),
jni::ToJavaString(env, info.m_targetUnitsSuffix), jni::ToJavaString(env, info.m_distToTurn),
jni::ToJavaString(env, info.m_turnUnitsSuffix), jni::ToJavaString(env, info.m_sourceName),
jni::ToJavaString(env, info.m_displayedStreetName), info.m_completionPercent, info.m_turn, info.m_nextTurn, info.m_pedestrianTurn,
info.m_pedestrianDirectionPos.lat, info.m_pedestrianDirectionPos.lon, info.m_exitNum, info.m_time, jLanes);
info.m_pedestrianDirectionPos.lat, info.m_pedestrianDirectionPos.lon, info.m_exitNum, info.m_time, jLanes,
static_cast<jboolean>(isSpeedLimitExceeded), static_cast<jboolean>(shouldPlaySignal));
ASSERT(result, (jni::DescribeException()));
return result;
}

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_red"/>
</shape>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/dark_red" android:state_activated="true"/>
<item android:drawable="@drawable/transparent_bg"/>
</selector>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent"/>
</shape>

View file

@ -14,7 +14,7 @@
tools:ignore="RtlSymmetry">
<!-- Speed -->
<LinearLayout
android:id="@+id/speed_frame"
android:id="@+id/speed_view_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/nav_numbers_side_min_width"
@ -23,7 +23,8 @@
android:paddingRight="@dimen/nav_numbers_margin"
android:paddingTop="@dimen/margin_eighth"
android:gravity="center_horizontal"
tools:background="#20FF0000">
android:background="@drawable/speed_cams_bg"
tools:background="@drawable/speed_cams_bg">
<TextView
android:id="@+id/speed_value"
android:layout_width="wrap_content"
@ -31,7 +32,6 @@
android:singleLine="true"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="999"/>
<TextView
android:id="@+id/speed_dimen"
android:layout_width="wrap_content"
@ -148,4 +148,4 @@
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="km"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View file

@ -5,8 +5,6 @@
android:layout_width="match_parent"
android:layout_height="@dimen/nav_menu_height"
android:orientation="vertical"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingStart="@dimen/nav_numbers_margin"
android:layout_marginRight="@dimen/nav_toggle"
android:layout_marginEnd="@dimen/nav_toggle"
android:background="?clickableBackground"
@ -16,168 +14,153 @@
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/neg_margin_quarter"
android:layout_marginTop="@dimen/nav_menu_top_offset">
android:layout_height="wrap_content">
<!-- Speed -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<RelativeLayout
android:id="@+id/speed_view_container"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/speed_cams_bg"
android:minWidth="@dimen/nav_numbers_side_min_width"
android:orientation="vertical"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin"
android:paddingBottom="@dimen/margin_eighth"
android:paddingTop="@dimen/margin_eighth"
android:gravity="center_horizontal"
tools:background="#20FF0000">
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin">
<TextView
android:id="@+id/speed_value"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="999"/>
</LinearLayout>
<Space android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<!-- Speed -->
<TextView
android:id="@+id/speed_dimen"
android:layout_below="@+id/speed_value"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="km/h"
tools:background="#20FF0000"/>
</RelativeLayout>
<!-- Time -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="@dimen/nav_numbers_center_min_width"
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:minWidth="@dimen/nav_numbers_side_min_width"
android:paddingBottom="@dimen/margin_eighth"
android:paddingTop="@dimen/margin_eighth"
android:gravity="center_horizontal"
tools:background="#20FF0000">
<TextView
android:id="@+id/time_hour_value"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin">
<LinearLayout
android:id="@+id/time_values_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="999"/>
android:layout_centerHorizontal="true"
tools:background="#20FF0000">
<TextView
android:id="@+id/time_hour_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="999"/>
<TextView
android:id="@+id/time_hour_dimen"
<TextView
android:id="@+id/time_hour_dimen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_quarter"
android:layout_marginEnd="@dimen/margin_quarter"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="h"/>
<TextView
android:id="@+id/time_minute_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="99"/>
<TextView
android:id="@+id/time_minute_dimen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber"
tools:text="m"/>
</LinearLayout>
<LinearLayout
android:layout_below="@+id/time_values_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_quarter"
android:layout_marginEnd="@dimen/margin_quarter"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="h"/>
android:orientation="horizontal"
android:theme="?navigationTheme"
android:minWidth="@dimen/nav_numbers_center_min_width"
android:layout_centerHorizontal="true"
android:gravity="center"
tools:background="#20FF0000">
<ImageView
android:id="@+id/dot_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_half"
android:layout_marginEnd="@dimen/margin_half"
android:src="?newsMarker"/>
<ImageView
android:id="@+id/dot_estimate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?newsMarker"/>
</LinearLayout>
</RelativeLayout>
<TextView
android:id="@+id/time_minute_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="99"/>
<TextView
android:id="@+id/time_minute_dimen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber"
tools:text="m"/>
</LinearLayout>
<Space android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<!-- Distance -->
<LinearLayout
android:id="@+id/distance_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:minWidth="@dimen/nav_numbers_side_min_width"
android:orientation="vertical"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin"
android:paddingBottom="@dimen/margin_eighth"
android:paddingTop="@dimen/margin_eighth"
android:gravity="center_horizontal"
tools:background="#20FF0000">
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin">
<TextView
android:id="@+id/distance_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingNumber.Navigation"
tools:text="99999"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<!-- Speed -->
<TextView
android:id="@+id/speed_dimen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="@dimen/nav_numbers_side_min_width"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin"
android:gravity="center"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="km/h"
tools:background="#20FF0000"/>
<Space android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<!-- Time -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:minWidth="@dimen/nav_numbers_center_min_width"
android:theme="?navigationTheme"
android:gravity="center"
android:layout_marginLeft="@dimen/margin_eighth"
android:layout_marginStart="@dimen/margin_eighth"
tools:background="#20FF0000">
<ImageView
android:id="@+id/dot_left"
<TextView
android:id="@+id/distance_dimen"
android:layout_below="@id/distance_value"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_half"
android:layout_marginEnd="@dimen/margin_half"
android:src="?newsMarker"/>
<ImageView
android:id="@+id/dot_estimate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?newsMarker"/>
</LinearLayout>
<Space android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<!-- Distance -->
<TextView
android:id="@+id/distance_dimen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="@dimen/nav_numbers_side_min_width"
android:paddingLeft="@dimen/nav_numbers_margin"
android:paddingRight="@dimen/nav_numbers_margin"
android:gravity="center"
android:lines="1"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="km"
tools:background="#20FF0000"/>
android:lines="1"
android:includeFontPadding="false"
android:textAppearance="@style/MwmTextAppearance.RoutingDimension"
tools:text="km"
tools:background="#20FF0000"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>

View file

@ -14,6 +14,7 @@
<color name="base_accent_pressed_night">#FF3C9BBE</color>
<color name="base_red">#FFF54137</color>
<color name="dark_red">#F51E30</color>
<color name="base_yellow">#FFFFC30A</color>
<color name="base_green">#FF558B2F</color>

View file

@ -26,6 +26,7 @@ import com.mapswithme.maps.routing.RoutePointInfo;
import com.mapswithme.maps.routing.RoutingInfo;
import com.mapswithme.maps.routing.TransitRouteInfo;
import com.mapswithme.maps.search.FilterUtils;
import com.mapswithme.maps.settings.SettingsPrefsFragment;
import com.mapswithme.util.Constants;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
@ -240,6 +241,11 @@ public class Framework
nativeDisableAdProvider(type.ordinal(), Banner.Place.DEFAULT.ordinal());
}
public static void setSpeedCamerasMode(@NonNull SettingsPrefsFragment.SpeedCameraMode mode)
{
nativeSetSpeedCamManagerMode(mode.ordinal());
}
public static native void nativeShowTrackRect(long track);
public static native int nativeGetDrawScale();
@ -517,4 +523,6 @@ public class Framework
@Nullable
public static native MapObject nativeGetMapObject(
@NonNull NotificationCandidate.MapObject mapObject);
private static native void nativeSetSpeedCamManagerMode(int mode);
}

View file

@ -73,6 +73,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Vie
@NonNull
private final SearchWheel mSearchWheel;
private final View mSpeedViewContainer;
private boolean mShowTimeLeft = true;
@ -112,6 +113,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Vie
UiUtils.extendViewMarginWithStatusBar(turnFrame);
// Bottom frame
mSpeedViewContainer = mBottomFrame.findViewById(R.id.speed_view_container);
mSpeedValue = (TextView) mBottomFrame.findViewById(R.id.speed_value);
mSpeedUnits = (TextView) mBottomFrame.findViewById(R.id.speed_dimen);
mTimeHourValue = (TextView) mBottomFrame.findViewById(R.id.time_hour_value);
@ -241,24 +243,35 @@ public class NavigationController implements TrafficManager.TrafficCallback, Vie
else
updateVehicle(info);
boolean hasStreet = !TextUtils.isEmpty(info.nextStreet);
UiUtils.showIf(hasStreet, mStreetFrame);
if (!TextUtils.isEmpty(info.nextStreet))
mNextStreet.setText(info.nextStreet);
final Location last = LocationHelper.INSTANCE.getLastKnownLocation();
if (last != null)
{
Pair<String, String> speedAndUnits = StringUtils.nativeFormatSpeedAndUnits(last.getSpeed());
mSpeedValue.setText(speedAndUnits.first);
mSpeedUnits.setText(speedAndUnits.second);
}
updateStreetView(info);
updateSpeedView(info);
updateTime(info.totalTimeInSeconds);
mDistanceValue.setText(info.distToTarget);
mDistanceUnits.setText(info.targetUnits);
mRouteProgress.setProgress((int) info.completionPercent);
}
private void updateStreetView(@NonNull RoutingInfo info)
{
boolean hasStreet = !TextUtils.isEmpty(info.nextStreet);
UiUtils.showIf(hasStreet, mStreetFrame);
if (!TextUtils.isEmpty(info.nextStreet))
mNextStreet.setText(info.nextStreet);
}
private void updateSpeedView(@NonNull RoutingInfo info)
{
final Location last = LocationHelper.INSTANCE.getLastKnownLocation();
if (last == null)
return;
Pair<String, String> speedAndUnits = StringUtils.nativeFormatSpeedAndUnits(last.getSpeed());
mSpeedUnits.setText(speedAndUnits.second);
mSpeedValue.setText(speedAndUnits.first);
mSpeedViewContainer.setActivated(info.isSpeedLimitExceeded());
}
private void updateTime(int seconds)
{
if (mShowTimeLeft)

View file

@ -29,6 +29,8 @@ public class RoutingInfo
public final SingleLaneInfo[] lanes;
// For pedestrian routing.
public final PedestrianTurnDirection pedestrianTurnDirection;
private final boolean speedLimitExceeded;
private final boolean shouldPlayWarningSignal;
public final Location pedestrianNextDirection;
/**
@ -130,7 +132,8 @@ public class RoutingInfo
public RoutingInfo(String distToTarget, String units, String distTurn, String turnSuffix, String currentStreet, String nextStreet, double completionPercent,
int vehicleTurnOrdinal, int vehicleNextTurnOrdinal, int pedestrianTurnOrdinal, double pedestrianDirectionLat, double pedestrianDirectionLon, int exitNum,
int totalTime, SingleLaneInfo[] lanes)
int totalTime, SingleLaneInfo[] lanes, boolean speedLimitExceeded,
boolean shouldPlayWarningSignal)
{
this.distToTarget = distToTarget;
this.targetUnits = units;
@ -145,8 +148,20 @@ public class RoutingInfo
this.lanes = lanes;
this.exitNum = exitNum;
this.pedestrianTurnDirection = PedestrianTurnDirection.values()[pedestrianTurnOrdinal];
this.speedLimitExceeded = speedLimitExceeded;
this.shouldPlayWarningSignal = shouldPlayWarningSignal;
this.pedestrianNextDirection = new Location("");
this.pedestrianNextDirection.setLatitude(pedestrianDirectionLat);
this.pedestrianNextDirection.setLongitude(pedestrianDirectionLon);
}
public boolean isSpeedLimitExceeded()
{
return speedLimitExceeded;
}
public boolean shouldPlayWarningSignal()
{
return shouldPlayWarningSignal;
}
}

View file

@ -371,7 +371,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment
private void onSpeedCamerasPrefChanged(@NonNull SpeedCameraMode oldCamMode,
@NonNull SpeedCameraMode newCamMode)
{
Framework.setSpeedCamerasMode(newCamMode);
}
@Override
@ -979,7 +979,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment
}
}
enum SpeedCameraMode
public enum SpeedCameraMode
{
AUTO,
ALWAYS,