auick action widget (tested/buds fixed)

This commit is contained in:
Rosty 2016-12-23 19:13:14 +02:00
parent 8f6e25dda5
commit e0b192d5a2
10 changed files with 105 additions and 112 deletions

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dashboard_background" />
<corners android:bottomLeftRadius="2dp" android:bottomRightRadius="2dp"/>
</shape>

View file

@ -1,40 +1,39 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@drawable/bg_card_light" android:background="@drawable/bg_card_light"
android:layout_margin="8dp"> android:orientation="vertical"
android:clickable="true">
<net.osmand.plus.widgets.WrapContentViewPager <android.support.v4.view.ViewPager
android:layout_marginTop="2dp"
android:id="@+id/viewPager" android:id="@+id/viewPager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="200dp" />
<LinearLayout <LinearLayout
android:id="@+id/controls" android:id="@+id/controls"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:background="@color/dashboard_background" android:background="@drawable/quick_action_controls_background"
android:orientation="horizontal" android:orientation="horizontal">
android:layout_marginBottom="2dp">
<ImageButton <ImageButton
android:id="@+id/btnPrev" android:id="@+id/btnPrev"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingLeft="16dp"
android:background="?android:selectableItemBackground" android:background="?android:selectableItemBackground"
android:paddingRight="16dp"/> android:paddingLeft="16dp"
android:paddingRight="16dp" />
<LinearLayout <LinearLayout
android:id="@+id/dots" android:id="@+id/dots"
android:layout_weight="1"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center" android:gravity="center"
android:layout_height="match_parent"/> android:orientation="horizontal" />
<ImageButton <ImageButton
android:id="@+id/btnNext" android:id="@+id/btnNext"
@ -42,7 +41,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?android:selectableItemBackground" android:background="?android:selectableItemBackground"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp"/> android:paddingRight="16dp" />
</LinearLayout> </LinearLayout>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android" <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="4dp" android:layout_height="4dp"
android:layout_width="4dp" android:layout_width="4dp"
android:layout_marginRight="2dp" android:layout_marginRight="2dp"

View file

@ -1,36 +1,56 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:grid="http://schemas.android.com/apk/res-auto" xmlns:grid="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="100dp" android:layout_height="100dp"
android:gravity="center"
android:orientation="vertical"
android:background="@color/color_white"
android:foreground="?android:selectableItemBackground"
grid:layout_columnWeight="1"> grid:layout_columnWeight="1">
<ImageView <LinearLayout
android:id="@+id/imageView" android:layout_width="match_parent"
android:layout_width="24dp" android:layout_height="100dp"
android:layout_height="24dp" android:foreground="?android:selectableItemBackground"
android:layout_marginTop="24dp" android:gravity="center_horizontal"
android:layout_gravity="center_horizontal" android:orientation="vertical">
android:scaleType="centerInside"
android:src="@drawable/ic_action_flag_dark" />
<TextView <ImageView
android:id="@+id/title" android:id="@+id/imageView"
android:layout_width="wrap_content" android:layout_width="24dp"
android:layout_height="wrap_content" android:layout_height="24dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp" android:layout_marginTop="24dp"
android:layout_marginLeft="16dp" android:scaleType="centerInside" />
android:layout_marginRight="16dp"
android:maxLines="2"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="Add marker" />
</LinearLayout> <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="12dp"
android:maxLines="2"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_sub_text_size"
tools:text="Add marker" />
</LinearLayout>
<View
android:id="@+id/dividerRight"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_gravity="right"
android:background="@color/dashboard_background"
android:visibility="gone"/>
<View
android:id="@+id/dividerBot"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/dashboard_background"
android:visibility="gone"/>
</FrameLayout>

View file

@ -1,16 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout <android.support.v7.widget.GridLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:grid="http://schemas.android.com/apk/res-auto" xmlns:grid="http://schemas.android.com/apk/res-auto"
android:id="@+id/grid" android:id="@+id/grid"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp"
android:background="@color/dashboard_background"
grid:orientation="horizontal" grid:orientation="horizontal"
grid:alignmentMode="alignBounds" grid:alignmentMode="alignMargins"
grid:columnCount="3"> grid:columnCount="3"/>
</android.support.v7.widget.GridLayout>

View file

@ -99,6 +99,7 @@
<color name="icon_color">#727272</color> <color name="icon_color">#727272</color>
<color name="icon_color_light">#ccc</color> <color name="icon_color_light">#ccc</color>
<color name="icon_color_dark">#ff4f4f4f</color>
<color name="on_map_icon_color">#505050</color> <color name="on_map_icon_color">#505050</color>

View file

@ -89,6 +89,9 @@ import net.osmand.plus.mapcontextmenu.MapContextMenuFragment;
import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu; import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu;
import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenuFragment; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenuFragment;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionFactory;
import net.osmand.plus.quickaction.QuickActionsWidget;
import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper;

View file

@ -20,7 +20,7 @@ public class QuickActionFactory {
return json; return json;
} }
public List<QuickAction> parseActiveActionsList(String json) { public static List<QuickAction> parseActiveActionsList(String json) {
Type type = new TypeToken<List<QuickAction>>(){}.getType(); Type type = new TypeToken<List<QuickAction>>(){}.getType();
ArrayList<QuickAction> quickActions = new Gson().fromJson(json, type); ArrayList<QuickAction> quickActions = new Gson().fromJson(json, type);

View file

@ -109,29 +109,33 @@ public class QuickActionsWidget extends LinearLayout {
} }
}); });
dots = (RadioGroup) findViewById(R.id.radioGroup); dots = (LinearLayout) findViewById(R.id.dots);
dots.removeAllViews();
if (pageCount > 1) { if (pageCount > 1) {
for (int i = 0; i < pageCount; i++) { for (int i = 0; i < pageCount; i++) {
ImageView dot = (ImageView) getLayoutInflater() ImageView dot = (ImageView) getLayoutInflater()
.inflate(R.layout.quick_action_widget_dot, dots, false); .inflate(R.layout.quick_action_widget_dot, dots, false);
dot.setImageDrawable(getIconsCache().getIcon( dot.setImageDrawable(i == 0
R.drawable.ic_dot_position, R.color.icon_color_light)); ? getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.dashboard_blue)
: getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.icon_color_light));
dots.addView(new RadioButton(context)); dots.addView(dot);
} }
} }
controls = (LinearLayout) findViewById(R.id.controls); controls = (LinearLayout) findViewById(R.id.controls);
controls.setVisibility(pageCount > 1 ? VISIBLE : GONE); controls.setVisibility(pageCount > 1 ? VISIBLE : GONE);
updateControls(viewPager.getCurrentItem());
} }
private void updateControls(int position) { private void updateControls(int position) {
next.setEnabled(viewPager.getAdapter().getCount() > position); next.setEnabled(viewPager.getAdapter().getCount() > position + 1);
next.setImageDrawable(next.isEnabled() next.setImageDrawable(next.isEnabled()
? getIconsCache().getIcon(R.drawable.ic_arrow_forward, R.color.icon_color) ? getIconsCache().getIcon(R.drawable.ic_arrow_forward, R.color.icon_color)
: getIconsCache().getIcon(R.drawable.ic_arrow_forward, R.color.icon_color_light)); : getIconsCache().getIcon(R.drawable.ic_arrow_forward, R.color.icon_color_light));
@ -141,12 +145,10 @@ public class QuickActionsWidget extends LinearLayout {
? getIconsCache().getIcon(R.drawable.ic_arrow_back, R.color.icon_color) ? getIconsCache().getIcon(R.drawable.ic_arrow_back, R.color.icon_color)
: getIconsCache().getIcon(R.drawable.ic_arrow_back, R.color.icon_color_light)); : getIconsCache().getIcon(R.drawable.ic_arrow_back, R.color.icon_color_light));
dots.removeAllViews();
for (int i = 0; i < dots.getChildCount(); i++){ for (int i = 0; i < dots.getChildCount(); i++){
((ImageView) dots.getChildAt(i)).setImageDrawable(i == position ((ImageView) dots.getChildAt(i)).setImageDrawable(i == position
? getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.icon_color_light) ? getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.dashboard_blue)
: getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.icon_color_light)); : getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.icon_color_light));
} }
} }
@ -154,26 +156,28 @@ public class QuickActionsWidget extends LinearLayout {
private View createPageView(ViewGroup container, int position){ private View createPageView(ViewGroup container, int position){
LayoutInflater li = getLayoutInflater(); LayoutInflater li = getLayoutInflater();
GridLayout gridLayout = (GridLayout) li View page = li.inflate(R.layout.quick_action_widget_page, container, false);
.inflate(R.layout.quick_action_widget_page, container, false); GridLayout gridLayout = (GridLayout) page.findViewById(R.id.grid);
final int maxItems = position > 0 // final int maxItems = position > 0
? ELEMENT_PER_PAGE // ? ELEMENT_PER_PAGE
: (actions.size() > (ELEMENT_PER_PAGE / 2) // : (actions.size() > (ELEMENT_PER_PAGE / 2)
? ELEMENT_PER_PAGE // ? ELEMENT_PER_PAGE
: (ELEMENT_PER_PAGE / 2)); // : (ELEMENT_PER_PAGE / 2));
for (int i = position == 0 ? 0 : 1; i > ELEMENT_PER_PAGE; i++){ final int maxItems = actions.size() == 1 ? 1 : ELEMENT_PER_PAGE;
for (int i = 0; i < maxItems; i++){
View view = li.inflate(R.layout.quick_action_widget_item, gridLayout, false); View view = li.inflate(R.layout.quick_action_widget_item, gridLayout, false);
if (i * (position + 1) < actions.size()) { if (i + (position * ELEMENT_PER_PAGE) < actions.size()) {
final QuickAction action = actions.get(i * (position + 1)); final QuickAction action = actions.get(i + (position * ELEMENT_PER_PAGE));
((ImageView) view.findViewById(R.id.imageView)) ((ImageView) view.findViewById(R.id.imageView))
.setImageDrawable(getIconsCache() .setImageDrawable(getIconsCache()
.getIcon(action.getIconRes(), R.color.icon_color)); .getIcon(action.getIconRes(), R.color.icon_color_dark));
((TextView) view.findViewById(R.id.title)) ((TextView) view.findViewById(R.id.title))
.setText(action.getNameRes()); .setText(action.getNameRes());
@ -187,6 +191,9 @@ public class QuickActionsWidget extends LinearLayout {
}); });
} }
view.findViewById(R.id.dividerBot).setVisibility(i < ELEMENT_PER_PAGE / 2 ? VISIBLE : GONE);
view.findViewById(R.id.dividerRight).setVisibility(((i + 1) % 3) == 0 ? GONE : VISIBLE);
gridLayout.addView(view); gridLayout.addView(view);
} }
@ -221,7 +228,7 @@ public class QuickActionsWidget extends LinearLayout {
} }
private int countPage(){ private int countPage(){
return (int) Math.ceil((actions.size()) / 6); return (int) Math.ceil((actions.size()) / (double) 6);
} }
private LayoutInflater getLayoutInflater(){ private LayoutInflater getLayoutInflater(){

View file

@ -1,40 +0,0 @@
package net.osmand.plus.widgets;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
public class WrapContentViewPager extends ViewPager {
private int mCurrentPagePosition = 0;
public WrapContentViewPager(Context context) {
super(context);
}
public WrapContentViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
View child = getChildAt(mCurrentPagePosition);
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void reMeasureCurrentPage(int position) {
mCurrentPagePosition = position;
requestLayout();
}
}