Browse Source

大炒调整

一拖四炒菜机
pry 11 months ago
parent
commit
3f308d24b2
12 changed files with 226 additions and 111 deletions
  1. +5
    -0
      app/src/main/java/com/bonait/bnframework/business/DoubleFryingpanControl.java
  2. +4
    -1
      app/src/main/java/com/bonait/bnframework/business/RobotData.java
  3. +21
    -8
      app/src/main/java/com/bonait/bnframework/dialog/DialogManager.java
  4. +75
    -33
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/DoubleFryingpanFragment.java
  5. +2
    -2
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/RobotMain.java
  6. +1
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/SheZhifragment.java
  7. +1
    -1
      app/src/main/res/drawable/spinner_text_br.xml
  8. +31
    -18
      app/src/main/res/layout/datatab/layout/activity_par_set1.xml
  9. +13
    -8
      app/src/main/res/layout/datatab/layout/activity_warehouseloc_select.xml
  10. +3
    -3
      app/src/main/res/layout/datatab/layout/select_item.xml
  11. +68
    -34
      app/src/main/res/layout/fragment_double_fryingpan.xml
  12. +2
    -2
      app/src/main/res/layout/fragment_she_zhi.xml

+ 5
- 0
app/src/main/java/com/bonait/bnframework/business/DoubleFryingpanControl.java View File

@@ -52,6 +52,11 @@ public class DoubleFryingpanControl extends ControlBase {
RobotData.RobotHome=value[0];
});

//机器人原点位
ModbusMaster.get().ReadBool(RobotAddress("M661"),1,1,value->{
RobotData.RobotReady=value[0];
});

//机器人任务反馈
ModbusMaster.get().ReadShort("GI5",1,1,value->{
RobotData.RobotTaskFeedback=value[0];


+ 4
- 1
app/src/main/java/com/bonait/bnframework/business/RobotData.java View File

@@ -29,7 +29,10 @@ public class RobotData {
*/
public static boolean[] WarehouseLocHavingBasin=new boolean[4];


/**
* 机器人准备就绪
*/
public static boolean RobotReady;

/**
* 机器人到达维护位置


+ 21
- 8
app/src/main/java/com/bonait/bnframework/dialog/DialogManager.java View File

@@ -1,9 +1,16 @@
package com.bonait.bnframework.dialog;

import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.Gravity;
import android.view.View;

import androidx.annotation.NonNull;

import com.bonait.bnframework.R;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.MessageLog;


public class DialogManager {
@@ -23,15 +30,15 @@ public class DialogManager {
}
return mInstance;
}
public Activity activityMain=null;
public DialogView initView(Context context, int layout) {
return new DialogView(context,layout, R.style.CustomDialog, Gravity.CENTER);
return new DialogView(context, layout, R.style.CustomDialog, Gravity.CENTER);
}

public DialogView initView(Context context,int layout,int gravity) {
return new DialogView(context,layout, R.style.mydialog, gravity);
public DialogView initView(Context context, int layout, int gravity,Activity activity) {
activityMain=activity;
return new DialogView(context, layout, R.style.mydialog, gravity);
}

// 显示弹框
public void show(DialogView view) {
if (view != null) {
@@ -42,10 +49,10 @@ public class DialogManager {
}

// 显示弹框
public void show(DialogView view,int closeId) {
public void show(DialogView view, int closeId) {
if (view != null) {
if (!view.isShowing()) {
if(!view.findViewById(closeId).hasOnClickListeners()){
if (!view.findViewById(closeId).hasOnClickListeners()) {
view.findViewById(closeId).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view1) {
@@ -53,7 +60,13 @@ public class DialogManager {
}
});
}
view.show();
if (activityMain!=null && !activityMain.isFinishing()) {
view.show();
}
else
{
MessageLog.ShowUserMessage( UserLogEnum.订单处理日志 ,"弹框Active获取失败");
}
}
}
}


+ 75
- 33
app/src/main/java/com/bonait/bnframework/modules/home/fragment/DoubleFryingpanFragment.java View File

@@ -9,6 +9,7 @@ import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
@@ -33,6 +34,7 @@ import com.bonait.bnframework.common.constant.MessageName;
import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.mode.BPA_GOODS;
import com.bonait.bnframework.common.db.mode.BPA_GOODSRECIPE;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.linktab.LinkMode;
@@ -136,16 +138,19 @@ public class DoubleFryingpanFragment extends BaseFragment {
tv_Status2.setText(s2);
String status = ModbusMaster.get().IsConnected?"已连接":"未连接";
mTopBar.setTitle("机器人连接状态:"+ status);

if(!IsMaintenanceMode&&RobotData.RobotReachTending){
btn_maintenance.setText("完成维护");
IsMaintenanceMode=true;
}
}
});
}
};


mDialogVisual= DialogManager.getInstance().initView(getContext(), R.layout.activity_material_view, Gravity.BOTTOM);
mParSetVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_par_set1,Gravity.BOTTOM);
mWarehouselocSelectVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_warehouseloc_select,Gravity.BOTTOM);
mDialogVisual= DialogManager.getInstance().initView(getContext(), R.layout.activity_material_view, Gravity.BOTTOM,getActivity());
mParSetVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_par_set1,Gravity.BOTTOM,getActivity());
mWarehouselocSelectVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_warehouseloc_select,Gravity.BOTTOM,getActivity());

}

@@ -192,6 +197,11 @@ public class DoubleFryingpanFragment extends BaseFragment {
return;
}

if(!RobotData.RobotReady){
AlertDialogUtils.showDialog(getContext(),"提示","机器人初始化失败");
return;
}

DoubleFryingpanControl.getInstance(). GoodDown(fry.GoodID,fry.FryingPanNum);

try {
@@ -233,7 +243,17 @@ public class DoubleFryingpanFragment extends BaseFragment {
});

DialogManager.getInstance().hide(mDialogVisual);//关闭商品选择窗口
DialogManager.getInstance().show(mParSetVisual,R.id.parset_close_dialog); //打开参数设置窗口
try {
DialogManager.getInstance().show(mParSetVisual,R.id.parset_close_dialog); //打开参数设置窗口
}
catch (RuntimeException ex)
{
MessageLog.ShowUserMessage( UserLogEnum.订单处理日志 ,"打开参数配置弹框出错:"+ex.getMessage());
}
catch(Exception ex){
MessageLog.ShowUserMessage( UserLogEnum.订单处理日志 ,"打开参数配置弹框出错111:"+ex.getMessage());
}

ParSetInit(R.id.location_selection_1,new String[] {"0", "1", "2", "3", "4","5","6"});
ParSetInit(R.id.location_selection_2,new String[] {"0", "1", "2", "3", "4","5","6"});
ParSetInit(R.id.accessories_selection_1,new String[] {"0", "1", "2", "3", "4","5"});
@@ -267,6 +287,8 @@ public class DoubleFryingpanFragment extends BaseFragment {
}
});

Warehouseloc=0;

}catch(InterruptedException ex){

}
@@ -315,17 +337,18 @@ public class DoubleFryingpanFragment extends BaseFragment {
if (msg != null) {
BPA_GOODS goods = (BPA_GOODS) msg;
fry.GoodID= goods.id;
OpenParSet();
// getActivity().runOnUiThread(new Runnable() {
// @Override
// public void run() {
// if(!getActivity().isFinishing()){
//
// }
//
// }
// });

if(!ModbusMaster.get().IsConnected){
AlertDialogUtils.showDialog(getContext(),"提示","机器人未连接");
return;
}

if(!RobotData.RobotReady){
AlertDialogUtils.showDialog(getContext(),"提示","机器人初始化失败");
return;
}

OpenParSet();
}
}
});
@@ -344,22 +367,34 @@ public class DoubleFryingpanFragment extends BaseFragment {
}
});

if(btn_warehousing==null||btn_maintenance==null)return;

//手动入库
btn_warehousing.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view){
if(!ModbusMaster.get().IsConnected){
AlertDialogUtils.showDialog(getContext(),"提示","机器人未连接");
return;
}
if(RobotData.RobotIdle){
WarehouselocInit();
mWarehouselocSelectVisual.setCanceledOnTouchOutside(false);
DialogManager.getInstance().show(mWarehouselocSelectVisual,R.id.close_dialog); //打开商品选择窗口
}
else{
AlertDialogUtils.showDialog(getContext(),"提示","机器人忙碌中,请稍后");
}
// if(!ModbusMaster.get().IsConnected){
// AlertDialogUtils.showDialog(getContext(),"提示","机器人未连接");
// return;
// }
//
// if(!RobotData.RobotReady){
// AlertDialogUtils.showDialog(getContext(),"提示","机器人初始化失败");
// return;
// }

// if(RobotData.RobotIdle){
// WarehouselocInit();
// mWarehouselocSelectVisual.setCanceledOnTouchOutside(false);
// DialogManager.getInstance().show(mWarehouselocSelectVisual,R.id.close_dialog); //打开位置选择窗口
// }
// else{
// AlertDialogUtils.showDialog(getContext(),"提示","机器人忙碌中,请稍后");
// }

WarehouselocInit();
mWarehouselocSelectVisual.setCanceledOnTouchOutside(false);
DialogManager.getInstance().show(mWarehouselocSelectVisual,R.id.parset_close_dialog); //打开位置选择窗口
}
});

@@ -371,14 +406,20 @@ public class DoubleFryingpanFragment extends BaseFragment {
AlertDialogUtils.showDialog(getContext(),"提示","机器人未连接");
return;
}
if(!IsMaintenanceMode)

if(!RobotData.RobotReady){
AlertDialogUtils.showDialog(getContext(),"提示","机器人初始化失败");
return;
}

if(!RobotData.RobotReachTending)
{
if(RobotData.RobotIdle){
AlertDialogUtils.showDialog(getContext(), "提示", "是否进入机器人维护模式?", new QMUIDialogAction.ActionListener() {
@Override
public void onClick(QMUIDialog dialog, int index) {
btn_maintenance.setEnabled(false);//禁用按钮
btn_warehousing.setText("维护模式中...");
btn_maintenance.setText("维护模式中...");
ModbusMaster.get().WriteShort("GI0",(short) (41),1,null);//写入机器人主任务,指定入库位置
new Thread(new Runnable() {
@Override
@@ -390,8 +431,8 @@ public class DoubleFryingpanFragment extends BaseFragment {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
btn_warehousing.setText("完成维护");
btn_warehousing.setEnabled(true);//取消禁用按钮
btn_maintenance.setText("完成维护");
btn_maintenance.setEnabled(true);//取消禁用按钮
}
});

@@ -399,6 +440,8 @@ public class DoubleFryingpanFragment extends BaseFragment {
}
}
}).start();

dialog.dismiss();
}
});

@@ -409,8 +452,7 @@ public class DoubleFryingpanFragment extends BaseFragment {
}
else{
ModbusMaster.get().WriteBool(DoubleFryingpanControl.getInstance().RobotAddress("M520"), true,1,null);//写入机器人主任务,指定入库位置
btn_warehousing.setText("维护");
IsMaintenanceMode=false;
btn_maintenance.setText("维护");
}

}


+ 2
- 2
app/src/main/java/com/bonait/bnframework/modules/home/fragment/RobotMain.java View File

@@ -178,8 +178,8 @@ public class RobotMain extends BaseFragment {
};


mDialogVisual= DialogManager.getInstance().initView(getContext(), R.layout.activity_material_view, Gravity.BOTTOM);
mParSetVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_par_set,Gravity.BOTTOM);
mDialogVisual= DialogManager.getInstance().initView(getContext(), R.layout.activity_material_view, Gravity.BOTTOM,getActivity());
mParSetVisual = DialogManager.getInstance().initView(getContext(),R.layout.activity_par_set,Gravity.BOTTOM,getActivity());
}

@SuppressLint("HandlerLeak")


+ 1
- 1
app/src/main/java/com/bonait/bnframework/modules/home/fragment/SheZhifragment.java View File

@@ -52,7 +52,7 @@ public class SheZhifragment extends BaseFragment {
* 初始化TopBar
*/
private void initTopBar() {
mTopBar.setTitle("订单管理");
mTopBar.setTitle("设置");
}

// @OnClick({R.id.xtcs,R.id.imagegl,R.id.shebeixinxi


+ 1
- 1
app/src/main/res/drawable/spinner_text_br.xml View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="1dp" android:color="@color/gray"/>
<stroke android:width="1dp" android:color="#c17833"/>
</shape>

+ 31
- 18
app/src/main/res/layout/datatab/layout/activity_par_set1.xml View File

@@ -27,7 +27,8 @@
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_margin="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_height="wrap_content">

<TextView
@@ -41,21 +42,24 @@
android:layout_width="match_parent"
android:spinnerMode="dropdown"
android:layout_marginLeft="10dp"
android:paddingLeft="-10dp"
android:paddingRight="-10dp"
android:paddingLeft="0dp"
tools:ignore="TouchTargetSizeCheck"
android:paddingRight="0dp"
android:dropDownWidth="match_parent"
android:background="@drawable/spinner_br"
android:dropDownVerticalOffset="0dp"
android:dropDownSelector="@color/red_primary_dark"
android:entries="@array/sp1"
android:layout_height="48dp"/>
android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_margin="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_height="wrap_content">

<TextView
@@ -69,21 +73,24 @@
android:layout_width="match_parent"
android:spinnerMode="dropdown"
android:layout_marginLeft="10dp"
android:paddingLeft="-10dp"
android:paddingRight="-10dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:dropDownWidth="match_parent"
android:background="@drawable/spinner_br"
tools:ignore="TouchTargetSizeCheck"
android:dropDownVerticalOffset="0dp"
android:dropDownSelector="@color/red_primary_dark"
android:entries="@array/sp1"
android:layout_height="48dp"/>
android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_margin="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_height="wrap_content">

<TextView
@@ -97,20 +104,23 @@
android:layout_width="match_parent"
android:spinnerMode="dropdown"
android:layout_marginLeft="10dp"
android:paddingLeft="-10dp"
android:paddingRight="-10dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:dropDownWidth="match_parent"
android:background="@drawable/spinner_br"
tools:ignore="TouchTargetSizeCheck"
android:dropDownVerticalOffset="0dp"
android:dropDownSelector="@color/red_primary_dark"
android:entries="@array/accessories_sp"
android:layout_height="48dp"/>
android:layout_height="wrap_content"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_margin="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_height="wrap_content">

<TextView
@@ -124,14 +134,15 @@
android:layout_width="match_parent"
android:spinnerMode="dropdown"
android:layout_marginLeft="10dp"
android:paddingLeft="-10dp"
android:paddingRight="-10dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:dropDownWidth="match_parent"
android:background="@drawable/spinner_br"
tools:ignore="TouchTargetSizeCheck"
android:dropDownVerticalOffset="0dp"
android:dropDownSelector="@color/red_primary_dark"
android:entries="@array/accessories_sp"
android:layout_height="48dp"/>
android:layout_height="wrap_content"/>

</LinearLayout>

@@ -147,17 +158,19 @@
android:layout_weight="1"
android:layout_marginRight="10dp"
android:background="@drawable/button4"
tools:ignore="TouchTargetSizeCheck"
android:text="确认"
android:layout_height="wrap_content"/>
android:layout_height="40dp"/>

<Button
android:id="@+id/parset_cancel_btn"
android:layout_width="0dp"
android:text="取消"
android:layout_weight="1"
tools:ignore="TouchTargetSizeCheck"
android:layout_marginLeft="10dp"
android:background="@drawable/button4"
android:layout_height="wrap_content"/>
android:layout_height="40dp"/>

</LinearLayout>



+ 13
- 8
app/src/main/res/layout/datatab/layout/activity_warehouseloc_select.xml View File

@@ -11,17 +11,21 @@
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<Button
android:id="@+id/parset_close_dialog"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="10dp"
android:textColor="@color/red_primary_dark"
android:text="×"
android:textSize="40sp"
android:layout_marginBottom="5dp"
android:background="@android:color/transparent"
android:layout_margin="5dp"/>
android:text="×"
android:textColor="@color/red_primary_dark"
android:textSize="40sp" />
</RelativeLayout>

<LinearLayout
@@ -41,14 +45,15 @@
android:layout_width="match_parent"
android:spinnerMode="dropdown"
android:layout_marginLeft="10dp"
android:paddingLeft="-10dp"
android:paddingRight="-10dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:dropDownWidth="match_parent"
android:background="@drawable/spinner_br"
tools:ignore="TouchTargetSizeCheck"
android:dropDownVerticalOffset="0dp"
android:dropDownSelector="@color/red_primary_dark"
android:entries="@array/sp1"
android:layout_height="48dp"/>
android:layout_height="wrap_content"/>

</LinearLayout>



+ 3
- 3
app/src/main/res/layout/datatab/layout/select_item.xml View File

@@ -4,10 +4,10 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:gravity="center_vertical"
android:textColor="#000000"
android:background="@drawable/spinner_text_br"
android:paddingLeft="10dp"
android:textSize="20sp"
android:text="0"
android:layout_height="48dp">
android:layout_height="wrap_content">
<!-- android:background="@drawable/spinner_text_br"-->
</TextView>

+ 68
- 34
app/src/main/res/layout/fragment_double_fryingpan.xml View File

@@ -55,9 +55,10 @@
android:layout_height="130dp">
<Button
android:id="@+id/btn_warehousing"
android:layout_width="160dp"
android:layout_height="50dp"
android:layout_width="110dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
tools:ignore="TouchTargetSizeCheck"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:background="@drawable/button4"
@@ -65,9 +66,10 @@

<Button
android:id="@+id/btn_maintenance"
android:layout_width="160dp"
android:layout_height="50dp"
android:layout_width="110dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
tools:ignore="TouchTargetSizeCheck"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:background="@drawable/button4"
@@ -92,23 +94,31 @@
android:layout_margin="10dp"
android:orientation="vertical"
android:layout_columnWeight="1">
<TextView
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="状态:"/>

<TextView
android:id="@+id/tv_Status1"
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
<LinearLayout
android:layout_width="match_parent"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="空闲中"/>
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="状态:"/>

<TextView
android:id="@+id/tv_Status1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="空闲中"/>
</LinearLayout>



<Button
android:id="@+id/main_btn1"
@@ -147,23 +157,47 @@
android:layout_margin="10dp"
android:orientation="vertical"
android:layout_columnWeight="1">
<TextView
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="状态:"/>

<TextView
android:id="@+id/tv_Status2"
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
<LinearLayout
android:layout_width="match_parent"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="空闲中"/>
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="状态:"/>

<TextView
android:id="@+id/tv_Status2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#f0a732"
android:text="空闲中"/>
</LinearLayout>

<!-- <TextView-->
<!-- android:layout_width="300dp"-->
<!-- android:layout_height="40dp"-->
<!-- android:layout_marginLeft="20dp"-->
<!-- android:textSize="20sp"-->
<!-- android:textColor="#f0a732"-->
<!-- android:text="状态:"/>-->

<!-- <TextView-->
<!-- android:id="@+id/tv_Status2"-->
<!-- android:layout_width="300dp"-->
<!-- android:layout_height="40dp"-->
<!-- android:layout_marginTop="10dp"-->
<!-- android:layout_marginLeft="20dp"-->
<!-- android:textSize="20sp"-->
<!-- android:textColor="#f0a732"-->
<!-- android:text="空闲中"/>-->

<Button
android:id="@+id/main_btn2"


+ 2
- 2
app/src/main/res/layout/fragment_she_zhi.xml View File

@@ -130,7 +130,7 @@

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_height="80dp"
android:background="@drawable/jcsjgl_bj">

<ImageView
@@ -173,7 +173,7 @@

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_height="80dp"
android:background="@drawable/log_bj">

<ImageView


Loading…
Cancel
Save