Browse Source

Exrate splash revamped

master
Preyea Regmi 5 years ago
parent
commit
2af25c21a8
  1. 5
      .idea/modules.xml
  2. 2
      app/src/main/java/com/gmeremit/online/gmeremittance_native/exchange_rate/view/SelectedRedBorderDecoration.java
  3. 85
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/adapter/PayoutModeSelectionRVAdapter.java
  4. 15
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenter.java
  5. 3
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenterInterface.java
  6. 44
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/PayoutModeSelectionItemViewHolder.java
  7. 38
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java
  8. 72
      app/src/main/res/layout/activity_splash_screen_key_1.xml
  9. 45
      app/src/main/res/layout/splash_exchange_paymentmode_rv_viewholder.xml

5
.idea/modules.xml

@ -3,14 +3,9 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" filepath="$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" />
<module fileurl="file://$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" filepath="$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/gme-android.iml" filepath="$PROJECT_DIR$/gme-android.iml" />
<module fileurl="file://$PROJECT_DIR$/gme-android.iml" filepath="$PROJECT_DIR$/gme-android.iml" />
<module fileurl="file://$PROJECT_DIR$/httpclient-release/httpclient-release.iml" filepath="$PROJECT_DIR$/httpclient-release/httpclient-release.iml" />
<module fileurl="file://$PROJECT_DIR$/httpclient-release/httpclient-release.iml" filepath="$PROJECT_DIR$/httpclient-release/httpclient-release.iml" />
<module fileurl="file://$PROJECT_DIR$/securitykeypad/securitykeypad.iml" filepath="$PROJECT_DIR$/securitykeypad/securitykeypad.iml" />
<module fileurl="file://$PROJECT_DIR$/securitykeypad/securitykeypad.iml" filepath="$PROJECT_DIR$/securitykeypad/securitykeypad.iml" />
</modules>
</component>

2
app/src/main/java/com/gmeremit/online/gmeremittance_native/exchange_rate/view/SelectedRedBorderDecoration.java

@ -69,7 +69,7 @@ public class SelectedRedBorderDecoration extends RecyclerView.ItemDecoration{
c.drawRoundRect(rectF, mCornerRadius, mCornerRadius, mBorderPaint);
// drawTickStamp(c, parent.getChildAt(i).getRight() - (9 * multi), parent.getChildAt(i).getTop() + (1 * multi));
drawTickStamp(c, parent.getChildAt(i).getRight() - (9 * multi), parent.getChildAt(i).getTop() + (1 * multi));
}
}

85
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/adapter/PayoutModeSelectionRVAdapter.java

@ -0,0 +1,85 @@
package com.gmeremit.online.gmeremittance_native.splash_screen.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.exchange_rate.model.PaymentModeMapper;
import com.gmeremit.online.gmeremittance_native.exchange_rate.model.datav2.PaymentMode;
import com.gmeremit.online.gmeremittance_native.exchange_rate.view.PaymentModeViewHolder;
import com.gmeremit.online.gmeremittance_native.exchange_rate.view.SelectedRedBorderDecoration;
import com.gmeremit.online.gmeremittance_native.splash_screen.view.PayoutModeSelectionItemViewHolder;
import java.util.ArrayList;
import java.util.List;
public class PayoutModeSelectionRVAdapter extends RecyclerView.Adapter<PayoutModeSelectionItemViewHolder> implements SelectedRedBorderDecoration.RedItemSelectionListener {
private final OnPaymentModeSelectionListener listener;
private int selectedItemPosition;
private List<PaymentMode> data;
public PayoutModeSelectionRVAdapter(OnPaymentModeSelectionListener listener) {
this.listener = listener;
this.data=new ArrayList<>();
this.selectedItemPosition=-1;
}
@NonNull
@Override
public PayoutModeSelectionItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.splash_exchange_paymentmode_rv_viewholder, viewGroup, false);
return new PayoutModeSelectionItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull PayoutModeSelectionItemViewHolder payoutModeSelectionItemViewHolder, int i) {
payoutModeSelectionItemViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setSelectedItem(payoutModeSelectionItemViewHolder.getAdapterPosition());
}
});
payoutModeSelectionItemViewHolder.setImage(PaymentModeMapper.getPaymentModeImageFromId(data.get(payoutModeSelectionItemViewHolder.getAdapterPosition()).getId()));
payoutModeSelectionItemViewHolder.setTitle(data.get(payoutModeSelectionItemViewHolder.getAdapterPosition()).getText());
}
public void setSelectedItem(int position)
{
if(position!=-1)
{
this.selectedItemPosition=position;
if(listener!=null)
{
notifyItemChanged(selectedItemPosition);
listener.onPaymentModeSelected(data.get(selectedItemPosition));
}
}
}
@Override
public int getSelectedRedItemPosition() {
return this.selectedItemPosition;
}
public void setData(List<PaymentMode> data)
{
if(data!=null&&data.size()>0)
{
this.data=data;
notifyDataSetChanged();
}
}
@Override
public int getItemCount() {
return data.size();
}
public interface OnPaymentModeSelectionListener {
void onPaymentModeSelected(PaymentMode selectedData);
}
}

15
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenter.java

@ -7,11 +7,14 @@ import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BasePresenter;
import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog;
import com.gmeremit.online.gmeremittance_native.customwidgets.exchangecountrylistingdialog.CountryFlagMapper;
import com.gmeremit.online.gmeremittance_native.exchange_rate.model.datav2.PaymentMode;
import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.PayoutMode;
import com.gmeremit.online.gmeremittance_native.splash_screen.gateway.SplashScreenGateway;
import com.gmeremit.online.gmeremittance_native.splash_screen.model.LanguageModel;
import com.gmeremit.online.gmeremittance_native.utils.security.SignatureCheck;
import com.scottyab.rootbeer.RootBeer;
import java.util.ArrayList;
import java.util.List;
public class SplashScreenPresenter extends BasePresenter implements SplashScreenPresenterInterface, SplashScreenInteractorInterface {
@ -37,6 +40,7 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
if (this.languageModels == null || this.languageModels.size() < 1) {
this.languageModels = this.gateway.getRelatedLanguageData();
this.view.updateLanguageData(languageModels);
mockPayoutMode();
String appVersion = getStringfromStringId(R.string.app_version_text)+" "+BuildConfig.VERSION_NAME;
if (!BuildConfig.BUILD_TYPE.equalsIgnoreCase("release"))
appVersion = appVersion+" (" + BuildConfig.BUILD_TYPE+")";
@ -46,6 +50,17 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
}
}
private void mockPayoutMode() {
List<PaymentMode> data =new ArrayList<>();
data.add(new PaymentMode("1","Cash Pickup",""));
data.add(new PaymentMode("2","Bank Deposit",""));
data.add(new PaymentMode("12","Home Delivery",""));
data.add(new PaymentMode("13","Wallet Deposit",""));
data.add(new PaymentMode("14","Card Payment",""));
view.updatePayoutModeData(data);
}
private boolean checkIfAppSafe() {
boolean isSafe = false;
try {

3
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenterInterface.java

@ -5,6 +5,7 @@ import android.support.annotation.DrawableRes;
import com.gmeremit.online.gmeremittance_native.base.BaseContractInterface;
import com.gmeremit.online.gmeremittance_native.base.BasePresenterInterface;
import com.gmeremit.online.gmeremittance_native.exchange_rate.model.datav2.PaymentMode;
import com.gmeremit.online.gmeremittance_native.splash_screen.model.LanguageModel;
import java.util.List;
@ -25,6 +26,8 @@ public interface SplashScreenPresenterInterface extends BasePresenterInterface {
void updateLanguageData(List<LanguageModel> languageModels);
void updatePayoutModeData(List<PaymentMode> payoutModes);
Context getContext();
void updateFlagImage(int flagFromCountryCode);

44
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/PayoutModeSelectionItemViewHolder.java

@ -0,0 +1,44 @@
package com.gmeremit.online.gmeremittance_native.splash_screen.view;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.gmeremit.online.gmeremittance_native.R;
import butterknife.BindView;
import butterknife.ButterKnife;
public class PayoutModeSelectionItemViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.paymentModeTitleTxt)
TextView paymentModeTitle;
@BindView(R.id.paymentModeLogo)
ImageView paymentModeLogo;
public PayoutModeSelectionItemViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
}
public void setImage(int resId) {
if(resId!=-1)
paymentModeLogo.setImageResource(resId);
}
public void setTitle(String title) {
paymentModeTitle.setText(title);
}
}

38
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java

@ -21,6 +21,7 @@ import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
@ -33,10 +34,12 @@ import android.widget.TextView;
import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BaseActivity;
import com.gmeremit.online.gmeremittance_native.exchange_rate.model.datav2.PaymentMode;
import com.gmeremit.online.gmeremittance_native.homeV2.view.HomeActivityV2;
import com.gmeremit.online.gmeremittance_native.loginV2.view.LoginV2Activity;
import com.gmeremit.online.gmeremittance_native.registerV2.view.RegisterV2Activity;
import com.gmeremit.online.gmeremittance_native.splash_screen.adapter.LanguageSelectionRVAdapter;
import com.gmeremit.online.gmeremittance_native.splash_screen.adapter.PayoutModeSelectionRVAdapter;
import com.gmeremit.online.gmeremittance_native.splash_screen.adapter.ViewPagerAVDSplashAdapter;
import com.gmeremit.online.gmeremittance_native.splash_screen.model.LanguageModel;
import com.gmeremit.online.gmeremittance_native.splash_screen.presenter.SplashScreenPresenter;
@ -53,7 +56,7 @@ import butterknife.BindView;
import butterknife.ButterKnife;
public class SplashScreen extends BaseActivity implements View.OnClickListener, LanguageSelectionRVAdapter.LanguageSelectionListener, SplashScreenPresenterInterface.SplashScreenContractInterfacee {
public class SplashScreen extends BaseActivity implements View.OnClickListener, LanguageSelectionRVAdapter.LanguageSelectionListener, SplashScreenPresenterInterface.SplashScreenContractInterfacee, PayoutModeSelectionRVAdapter.OnPaymentModeSelectionListener {
@BindView(R.id.view_pager)
ConstraintLayout view_pager;
@ -87,6 +90,10 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
@BindView(R.id.appVersionTxtView)
TextView appVersionTxtView;
@BindView(R.id.paymentModeRV)
RecyclerView paymentModeRV;
private int[] layouts;
private TextView[] dots;
@ -96,10 +103,15 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
LanguageModel selectedLanguage;
PayoutModeSelectionRVAdapter payoutModeSelectionRVAdapter;
private SplashScreenPresenterInterface presenter;
private ArrayList<Fragment> fragmentList;
public final String TAG=getClass().getSimpleName();
ViewPager.OnPageChangeListener viewPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
@ -143,7 +155,8 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
presenter = new SplashScreenPresenter(this);
initAntiDebugger();
languageViewTransitionManager = new LanguageViewTransitionManager(this);
initLanguageRV();
initPayoutModeRV();
// addBottomDots(0);
// view_pager.addOnPageChangeListener(viewPageChangeListener);
@ -153,10 +166,21 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
// view_pager.setAdapter(viewPagerAdapter);
// view_pager.setOffscreenPageLimit(3);
}
private void initLanguageRV()
{
languageSelectionRVAdapter = new LanguageSelectionRVAdapter();
languageSelectionRVAdapter.setLanguageSelectionListener(this);
languageRv.setAdapter(languageSelectionRVAdapter);
}
private void initPayoutModeRV()
{
payoutModeSelectionRVAdapter=new PayoutModeSelectionRVAdapter(this);
paymentModeRV.setAdapter(payoutModeSelectionRVAdapter);
}
private void setupViewPagerAdapter() {
@ -276,6 +300,11 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
languageSelectionRVAdapter.setData(languageModels);
}
@Override
public void updatePayoutModeData(List<PaymentMode> payoutModes) {
payoutModeSelectionRVAdapter.setData(payoutModes);
}
@Override
public Context getContext() {
return this;
@ -294,6 +323,11 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
appVersionTxtView.setText(appVersion);
}
@Override
public void onPaymentModeSelected(PaymentMode selectedData) {
}
/**
* Helper class to switch back and forth the language selection view.
*/

72
app/src/main/res/layout/activity_splash_screen_key_1.xml

@ -38,7 +38,7 @@
android:id="@+id/selectedLanguageIcon"
android:layout_width="@dimen/_36sdp"
android:layout_height="@dimen/_36sdp"
android:layout_marginTop="@dimen/_15sdp"
android:layout_marginTop="8dp"
android:src="@drawable/flag_default"
app:layout_constraintEnd_toStartOf="@id/selectedLanguageText"
app:layout_constraintHorizontal_chainStyle="packed"
@ -83,28 +83,63 @@
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#33000000"
android:layout_marginBottom="16dp"
android:layout_marginTop="@dimen/_18sdp"
app:layout_constraintBottom_toTopOf="@+id/btn_login"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selectedLanguageIcon">
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:id="@+id/gmeTextView12"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="start|left"
android:paddingTop="@dimen/_4sdp"
android:paddingBottom="@dimen/_4sdp"
android:text="@string/select_payment_mode_text"
android:textColor="@color/white"
android:textSize="@dimen/_11ssp"
app:layout_constraintBottom_toTopOf="@+id/paymentModeRV"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.13"
app:layout_constraintVertical_chainStyle="packed"
app:txtfontName="@string/semibold" />
<android.support.v7.widget.RecyclerView
android:id="@+id/paymentModeRV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:orientation="horizontal"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/gmeTextView12" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:padding="@dimen/_1sdp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:background="@drawable/curve_rectangle_grey_outline_white_bg"
android:orientation="horizontal"
android:padding="@dimen/_1sdp"
app:layout_constraintBottom_toTopOf="@+id/circularIndexView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.38"
app:layout_constraintVertical_chainStyle="packed">
app:layout_constraintTop_toBottomOf="@+id/paymentModeRV">
<LinearLayout
android:id="@+id/sendMoneyViewContainer"
@ -187,11 +222,12 @@
android:id="@+id/circularIndexView"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:paddingStart="@dimen/_2sdp"
android:paddingEnd="@dimen/_2sdp"
android:paddingEnd="@dimen/_2sdp"
app:layout_constraintBottom_toTopOf="@+id/circularIndexView2"
app:layout_constraintStart_toStartOf="@+id/linearLayout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
@ -201,23 +237,24 @@
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center_vertical"
android:text="Transfer fee 5000 KRW"
android:textColor="@color/white"
app:txtfontName="@string/bold"
android:textSize="@dimen/_10ssp"
app:layout_constraintBottom_toBottomOf="@+id/circularIndexView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/circularIndexView"
app:layout_constraintTop_toTopOf="@+id/circularIndexView"
android:text="Transfer fee 5000 KRW" />
app:txtfontName="@string/semibold" />
<com.gmeremit.online.gmeremittance_native.customwidgets.CircularIndexView
android:id="@+id/circularIndexView2"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:paddingStart="@dimen/_2sdp"
android:paddingEnd="@dimen/_2sdp"
app:layout_constraintBottom_toTopOf="@+id/receiveMoneyViewContainer"
app:layout_constraintStart_toStartOf="@+id/linearLayout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/circularIndexView" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
@ -229,25 +266,24 @@
android:gravity="center_vertical"
android:text="Exrate 0.093"
android:textColor="@color/white"
app:txtfontName="@string/bold"
android:textSize="@dimen/_10ssp"
app:layout_constraintBottom_toBottomOf="@+id/circularIndexView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/circularIndexView2"
app:layout_constraintTop_toTopOf="@+id/circularIndexView2" />
app:layout_constraintTop_toTopOf="@+id/circularIndexView2"
app:txtfontName="@string/semibold" />
<LinearLayout
android:id="@+id/receiveMoneyViewContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:background="@drawable/curve_rectangle_grey_outline_white_bg"
android:orientation="horizontal"
android:padding="@dimen/_1sdp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/circularIndexView2">

45
app/src/main/res/layout/splash_exchange_paymentmode_rv_viewholder.xml

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativeLayout6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:background="@drawable/ic_rounded_white">
<ImageView
android:id="@+id/paymentModeLogo"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:scaleType="centerCrop"
android:visibility="gone"
android:src="@drawable/ic_home_delivery"
app:layout_constraintBottom_toTopOf="@+id/paymentModeTitleTxt"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:id="@+id/paymentModeTitleTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="Home Delivery"
android:textColor="@color/darkgray"
android:textSize="@dimen/_11ssp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/paymentModeLogo" />
</android.support.constraint.ConstraintLayout>
Loading…
Cancel
Save