Commit a28bae52 authored by Trio Saputra's avatar Trio Saputra
parents e7f5836c 2a6a2dab
......@@ -52,6 +52,11 @@ dependencies {
implementation "com.github.bumptech.glide:glide:$glide_version"
annotationProcessor "com.github.bumptech.glide:compiler:$glide_version"
// service
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.google.code.gson:gson:2.8.6'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
......
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourcashiertest">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
......@@ -17,13 +17,25 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme2">
<activity android:name=".activities.WelcomeActivity"></activity>
<activity android:name=".activities.ForgetPassword" />
<activity android:name=".activities.RegisterActivity" />
<activity android:name=".activities.StatusPayment" />
<activity
android:name=".activities.SkActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".activities.WelcomeActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".activities.ForgetPassword"
android:screenOrientation="portrait"/>
<activity
android:name=".activities.RegisterActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".activities.StatusPayment"
android:screenOrientation="portrait"/>
<activity
android:name=".activities.SplashActivity"
android:theme="@style/AppTheme2">
android:theme="@style/AppTheme2"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
......@@ -32,17 +44,19 @@
</activity>
<activity
android:name=".activities.PaymentActivity"
android:theme="@style/AppTheme2" />
android:screenOrientation="portrait"/>
<activity
android:name=".activities.CartActivity"
android:theme="@style/AppTheme2" />
android:screenOrientation="portrait"/>
<activity
android:name=".activities.MainActivity"
android:theme="@style/AppTheme2" />
android:screenOrientation="portrait"/>
<activity
android:name=".activities.ProductActivity"
android:theme="@style/AppTheme2" />
<activity android:name=".activities.LoginActivity" />
android:screenOrientation="portrait"/>
<activity
android:name=".activities.LoginActivity"
android:screenOrientation="portrait"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.yourcashiertest.fileprovider"
......
......@@ -2,53 +2,84 @@ package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.adapters.CartAdapter;
import com.example.yourcashiertest.databinding.ActivityCartBinding;
import com.example.yourcashiertest.entities.Cart;
import com.example.yourcashiertest.utils.Convert;
import com.example.yourcashiertest.viewmodels.CartViewModel;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class CartActivity extends AppCompatActivity {
ActivityCartBinding binding;
CartAdapter adapter;
private static int SUM = 0;
public static String PRICE = "price";
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_cart);
// adapter = new CartAdapter();
// binding.rvCartList.setLayoutManager(new LinearLayoutManager(this));
// binding.rvCartList.setAdapter(adapter);
adapter = new CartAdapter();
binding.rvCartList.setLayoutManager(new LinearLayoutManager(this));
binding.rvCartList.setAdapter(adapter);
// CartViewModel cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
// cartViewModel.getCarts().observe(this, carts -> adapter.setCartList(carts));
//
// binding.setViewModelCart(cartViewModel);
CartViewModel cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
cartViewModel.getCarts().observe(this, carts -> adapter.setCartList(carts));
binding.ivBtnBack.setOnClickListener(view -> startActivity(new Intent(CartActivity.this, MainActivity.class)));
binding.btnCheckout.setOnClickListener(view -> {
startActivity(new Intent(CartActivity.this, PaymentActivity.class));
finish();
cartViewModel.getCarts().observe(this, carts -> {
int count = 0;
if (carts.size() != 0){
for (int i = 0; i < carts.size(); i++){
count += carts.get(i).getPrice();
}
}else binding.btnCheckout.setEnabled(false);
SUM = count;
binding.tvTotalPrice.setText(Convert.changeToCurrency(SUM));
binding.items.setText(carts.size() + " items");
});
}
adapter.setCartListener(new CartAdapter.CartListener() {
@Override
public void onIncrease(Cart cart) {
cart.setQty(cart.getQty() + 1);
cart.setPrice(cart.getRealPrice() * cart.getQty());
cartViewModel.updateCart(cart);
}
private String changeToCurrency(int totalPrice){
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance();
@Override
public void onDecrease(Cart cart) {
cart.setQty(cart.getQty() - 1);
cart.setPrice(cart.getRealPrice() * cart.getQty());
cartViewModel.updateCart(cart);
if (cart.getQty() <= 0){
cartViewModel.deleteCart(cart);
}
}
});
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("Rp. ");
formatSymbols.setMonetaryDecimalSeparator(',');
formatSymbols.setGroupingSeparator('.');
binding.setViewModelCart(cartViewModel);
String priceRupiah = decimalFormat.format(totalPrice);
binding.ivBtnBack.setOnClickListener(view -> startActivity(new Intent(CartActivity.this, MainActivity.class)));
binding.btnCheckout.setOnClickListener(view -> {
startActivity(new Intent(CartActivity.this, PaymentActivity.class).putExtra(PRICE, SUM));
finish();
});
}
return priceRupiah;
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
}
\ No newline at end of file
package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.models.User;
import com.example.yourcashiertest.viewmodels.UserViewModel;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import java.util.List;
public class LoginActivity extends AppCompatActivity {
TextInputEditText etUsername, etPassword;
MaterialButton btnLogin;
public static final String DATA_LOGIN = "DATA_LOGIN";
public static Boolean syarat;
// SharedPreferences sharedPreferences;
// public static final String SESS_SYARAT = "syarat";
// public static final String my_shared = "session_status";
private PrefManager prefManager;
UserViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// sharedPreferences = getSharedPreferences(my_shared, Context.MODE_PRIVATE);
// syarat = sharedPreferences.getBoolean(SESS_SYARAT, false);
prefManager = new PrefManager(this);
if (!prefManager.isFirstLogin()) {
launchMain();
finish();
}
etPassword = findViewById(R.id.etPassword);
etUsername = findViewById(R.id.etUsername);
btnLogin = findViewById(R.id.btnLogin);
viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(UserViewModel.class);
btnLogin.setOnClickListener(view -> {
if(etUsername.getText().toString().length() == 0 || etPassword.getText().toString().length() == 0){
......@@ -34,10 +57,23 @@ public class LoginActivity extends AppCompatActivity {
}else if(etPassword.getText().toString().length() < 8) {
etPassword.setError("Password length cannot be less than 8 characters");
}else{
startActivity(new Intent(LoginActivity.this, MainActivity.class)
.putExtra(DATA_LOGIN, etUsername.getText().toString()));
finish();
viewModel.setListUser();
checkLogin();
}
});
}
private void checkLogin() {
viewModel.getListUser().observe(this, users -> {
for (int i = 0; i < users.size(); i++){
if (users.get(i).getEmail().equals(etUsername.getText().toString())
&& users.get(i).getPassword().equals(etPassword.getText().toString())){
startActivity(new Intent(LoginActivity.this, MainActivity.class)
.putExtra(DATA_LOGIN, users.get(i).getFullName()));
}
}
// Toast.makeText(getApplication(), "Username or password wrong", Toast.LENGTH_LONG).show();
});
}
......@@ -48,4 +84,9 @@ public class LoginActivity extends AppCompatActivity {
public void tvSignUpHere(View view) {
startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
}
public void launchMain() {
prefManager.setFirstLogin(false);
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
}
}
\ No newline at end of file
......@@ -9,28 +9,31 @@ import androidx.lifecycle.ViewModelProvider;
import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.util.Log;
import android.widget.PopupMenu;
import android.widget.Toast;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.adapters.ProductAdapter;
import com.example.yourcashiertest.databinding.ActivityMainBinding;
import com.example.yourcashiertest.entities.Cart;
import com.example.yourcashiertest.entities.Product;
import com.example.yourcashiertest.models.CartModel;
import com.example.yourcashiertest.viewmodels.CartViewModel;
import com.example.yourcashiertest.viewmodels.ProductViewModel;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
private PrefManager prefManager;
SharedPreferences sharedPreferences;
public static final String DATA_PRODUCT = "DATA_PRODUCT";
private static final int REQUEST_PERMISSIONS = 111;
......@@ -39,18 +42,24 @@ public class MainActivity extends AppCompatActivity {
Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static boolean visibility = false;
ProductViewModel viewModel;
CartViewModel cartViewModel;
boolean added = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermissions(permissions, REQUEST_PERMISSIONS);
prefManager = new PrefManager(this);
ProductAdapter adapter = new ProductAdapter();
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
// cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
cartViewModel.getCarts().observe(this, carts -> {
if (carts.size() != 0) binding.tvCount.setText(String.valueOf(carts.size()));
else binding.tvCount.setText(String.valueOf(0));
});
String name = getIntent().getStringExtra(LoginActivity.DATA_LOGIN);
binding.tvUser.setText(name);
// settings menu
......@@ -74,6 +83,11 @@ public class MainActivity extends AppCompatActivity {
startActivity(getIntent());
overridePendingTransition(0, 0);
return true;
case R.id.item_three:
prefManager.removeLoginSession();
startActivity(new Intent(MainActivity.this, LoginActivity.class));
finish();
break;
}
return false;
});
......@@ -87,7 +101,7 @@ public class MainActivity extends AppCompatActivity {
});
binding.rvProducts.setAdapter(adapter);
ProductViewModel viewModel = new ViewModelProvider(this).get(ProductViewModel.class);
viewModel = new ViewModelProvider(this).get(ProductViewModel.class);
viewModel.getProducts().observe(this, adapter::setProducts);
adapter.setListener(new ProductAdapter.ProductListener() {
......@@ -129,22 +143,40 @@ public class MainActivity extends AppCompatActivity {
public void addToCart(Product product){
// Cart cart = new Cart(0,"", "", 0, 0);
// cart.setIdProduct(product.getId());
// cart.setImage(product.getPhoto());
// cart.setNameProduct(product.getName());
// cart.setPrice(product.getPrice());
// cart.setQty(1);
// cartViewModel.insertCart(cart);
List<CartModel> list = new ArrayList<>();
CartModel cart = new CartModel();
cart.setIdProduct(product.getId());
cart.setNameProduct(product.getName());
cart.setImage(product.getPhoto());
cart.setPrice(product.getPrice());
cart.setQty(product.getQuantity());
// cek apakah sudah ditambahkan
checkProduct(product);
if (added){
startActivity(new Intent(MainActivity.this, CartActivity.class));
finish();
}else {
product.setQuantity(product.getQuantity() - 1);
viewModel.updateProduct(product);
Cart cart = new Cart(0,"", "", 0, 0, 0);
cart.setIdProduct(product.getId());
cart.setImage(product.getPhoto());
cart.setNameProduct(product.getName());
cart.setPrice(product.getPrice());
cart.setQty(1);
cart.setRealPrice(product.getPrice());
cartViewModel.insertCart(cart);
Toast.makeText(MainActivity.this, "Produk berhasil ditambahkan ke keranjang", Toast.LENGTH_LONG).show();
}
}
public void checkProduct(Product product){
cartViewModel.getCarts().observe(this, new Observer<List<Cart>>() {
@Override
public void onChanged(List<Cart> carts) {
for(int i = 0; i < carts.size(); i++){
if (carts.get(i).getNameProduct().equals(product.getName())){
added = true;
break;
}
}
}
});
}
@Override
public void onBackPressed() {
......
package com.example.yourcashiertest.activities;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityPaymentBinding;
import com.example.yourcashiertest.utils.Convert;
import com.example.yourcashiertest.utils.ViewUtil;
import com.example.yourcashiertest.viewmodels.CartViewModel;
public class PaymentActivity extends AppCompatActivity {
ActivityPaymentBinding binding;
public static String REFUND = "refund";
public int refund;
public int amount;
CartViewModel cartViewModel;
public boolean change = false;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
binding = DataBindingUtil.setContentView(this, R.layout.activity_payment);
cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
amount = getIntent().getIntExtra(CartActivity.PRICE, 0);
binding.setAmount(Convert.changeToCurrency(amount));
binding.cvCash.setOnTouchListener((view, event) -> {
changeCvColor(event, binding.cvCash);
return true;
});
binding.cvCard.setOnTouchListener((view, event) -> {
changeCvColor(event, binding.cvCard);
return true;
});
}
public void btnPay(View view) {
startActivity(new Intent(PaymentActivity.this, StatusPayment.class));
finish();
if (TextUtils.isEmpty(binding.etAmountPaid.getText().toString())){
ViewUtil.showMessage(view, "Amount paid not empty");
}else {
int amountPaid = Integer.parseInt(binding.etAmountPaid.getText().toString());
refund = amountPaid - amount;
startActivity(new Intent(PaymentActivity.this, StatusPayment.class).putExtra(REFUND, refund));
cartViewModel.clear();
finish();
}
}
public void changeCvColor(MotionEvent event, CardView cv){
if (change) {
change = false;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
cv.setCardBackgroundColor(getResources().getColor(R.color.colorPrimary));
break;
case MotionEvent.ACTION_UP:
cv.setCardBackgroundColor(getResources().getColor(R.color.white));
}
} else {
change = true;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
cv.setCardBackgroundColor(getResources().getColor(R.color.white));
break;
case MotionEvent.ACTION_UP:
cv.setCardBackgroundColor(getResources().getColor(R.color.colorPrimary));
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
}
\ No newline at end of file
......@@ -8,14 +8,13 @@ public class PrefManager {
SharedPreferences pref;
SharedPreferences.Editor editor;
Context _context;
// shared pref mode
int PRIVATE_MODE = 0;
// Shared preferences file name
private static final String PREF_NAME = "introslider";
private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch";
private static final String PREF_NAME = "preferences";
private static final String IS_FIRST_WELCOME = "IsFirstWelcome";
private static final String IS_FIRST_LOGIN = "IsFirstLogin";
public PrefManager(Context context) {
this._context = context;
......@@ -23,13 +22,20 @@ public class PrefManager {
editor = pref.edit();
}
public void setFirstTimeLaunch(boolean isFirstTime) {
editor.putBoolean(IS_FIRST_TIME_LAUNCH, isFirstTime);
public void setFirstWelcome(boolean isFirstTime) {
editor.putBoolean(IS_FIRST_WELCOME, isFirstTime);
editor.commit();
}
public boolean isFirstTimeLaunch() {
return pref.getBoolean(IS_FIRST_TIME_LAUNCH, true);
public void setFirstLogin(boolean isFirstTime) {
editor.putBoolean(IS_FIRST_LOGIN, isFirstTime);
editor.commit();
}
public boolean isFirstLogin(){return pref.getBoolean(IS_FIRST_LOGIN, true);}
public boolean isFirstWelcome() { return pref.getBoolean(IS_FIRST_WELCOME, true); }
public void removeLoginSession(){
// loginActivity.launchMain(true);
editor.remove(IS_FIRST_LOGIN);
editor.apply();
}
}
......@@ -14,17 +14,14 @@ import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityProductBinding;
import com.example.yourcashiertest.entities.Product;
import com.example.yourcashiertest.utils.ViewUtil;
import com.example.yourcashiertest.viewmodels.ProductViewModel;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ProductActivity extends AppCompatActivity{
private static final int PICK_IMAGE = 123;
ActivityProductBinding binding;
......@@ -32,36 +29,27 @@ public class ProductActivity extends AppCompatActivity{
private static final int REQUEST_IMAGE_CAPTURE = 1;
private File file;
private ProductViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(ProductViewModel.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_product);
Product product = getIntent().getParcelableExtra(MainActivity.DATA_PRODUCT);
if (getSupportActionBar() != null) {
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
if (product != null){
isUpdate = true;
viewModel.setPhoto(product.getPhoto());
viewModel.setProduct(product);
binding.btnSubmit.setText(R.string.btn_edit);
binding.tvHeadProduct.setText("UPDATE PRODUCT");
}else {
product = new Product("", "", 0, 0, "", "");
}
binding.cvProduct.setOnClickListener(v -> selectAction(this));
Product fixProduct = product;
binding.btnSubmit.setOnClickListener(v -> {
try {
......@@ -73,38 +61,31 @@ public class ProductActivity extends AppCompatActivity{
ViewUtil.showMessage(binding.getRoot(), getString(R.string.form_error_message));
return;
}
if (file != null){
fixProduct.setPhoto(file.getAbsolutePath());
}
fixProduct.setName(binding.etProduct.getText().toString());
fixProduct.setCategory(binding.etCategory.getText().toString());
fixProduct.setDescription(binding.etDescription.getText().toString());
fixProduct.setPrice(Long.parseLong(binding.etPrice.getText().toString()));
fixProduct.setQuantity(Long.parseLong(binding.etQuantity.getText().toString()));
if (isUpdate){
viewModel.updateProduct(fixProduct);
}else {
viewModel.insertProduct(fixProduct);
}
finish();
}catch (Exception e){
e.printStackTrace();
}
});
binding.setViewModel(viewModel);
}
private void takePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = createImageFile();
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.yourcashiertest.fileprovider",
......@@ -114,18 +95,13 @@ public class ProductActivity extends AppCompatActivity{
}
}
}
private void selectAction(Context context){
final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose your profile picture");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (options[item].equals("Take Photo")) {
takePhoto();
} else if (options[item].equals("Choose from Gallery")) {
......@@ -137,14 +113,11 @@ public class ProductActivity extends AppCompatActivity{
});
builder.show();
}
private void openGallery(){
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE);
}
private File createImageFile() {
try {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
......@@ -157,16 +130,13 @@ public class ProductActivity extends AppCompatActivity{
return image;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Uri imageUri;
if (resultCode == RESULT_OK && requestCode == PICK_IMAGE){
//set image to image view
binding.ivProduct.setImageURI(data.getData());
......@@ -178,7 +148,6 @@ public class ProductActivity extends AppCompatActivity{
}
}
}
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Images.Media.DATA };
......@@ -190,17 +159,14 @@ public class ProductActivity extends AppCompatActivity{
cursor.close();
return s;
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return super.onSupportNavigateUp();
}
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
}
\ No newline at end of file
package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityRegisterBinding;
import com.example.yourcashiertest.models.User;
import com.example.yourcashiertest.viewmodels.UserViewModel;
public class RegisterActivity extends AppCompatActivity {
WebView wbCompany;
ProgressBar pbLoading;
private static final String urLCompany = "http://multidaya.id/";
ActivityRegisterBinding binding;
User user;
UserViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
binding = DataBindingUtil.setContentView(this, R.layout.activity_register);
user = new User();
viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(UserViewModel.class);
binding.btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
user.setEmail(binding.etEmail.getText().toString());
user.setFullName(binding.etUsername.getText().toString());
user.setPassword(binding.etPassword.getText().toString());
user.setPhoneNumber(binding.etPhoneNumber.getText().toString());
viewModel.registrasi(user);
Toast.makeText(getApplicationContext(), "Register berhasil", Toast.LENGTH_LONG).show();
startActivity(new Intent(getApplicationContext(), LoginActivity.class));
}
});
}
public void tvSignInHere(View view) {
startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
finish();
}
public void tvSK(View view) {
startActivity(new Intent(RegisterActivity.this, SkActivity.class));
}
}
\ No newline at end of file
package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.example.yourcashiertest.R;
public class SkActivity extends AppCompatActivity {
WebView wbCompany;
ProgressBar pbLoading;
private static final String urLCompany = "http://multidaya.id/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sk);
pbLoading = findViewById(R.id.pbLoading);
wbCompany = findViewById(R.id.wbCompany);
wbCompany.getSettings().setLoadsImagesAutomatically(true);
wbCompany.getSettings().setJavaScriptEnabled(true);
wbCompany.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wbCompany.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
wbCompany.setVisibility(View.VISIBLE);
pbLoading.setVisibility(View.GONE);
if (getSupportActionBar() != null)
getSupportActionBar().setTitle("Multidaya Dinamika");
}
});
wbCompany.loadUrl(urLCompany);
}
}
\ No newline at end of file
package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityStatusPaymentBinding;
import com.example.yourcashiertest.utils.Convert;
public class StatusPayment extends AppCompatActivity {
ActivityStatusPaymentBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_status_payment);
binding = DataBindingUtil.setContentView(this, R.layout.activity_status_payment);
int refund = getIntent().getIntExtra(PaymentActivity.REFUND, 0);
Log.d("Tag", String.valueOf(refund));
binding.setRefund(Convert.changeToCurrency(refund));
}
public void btnFinish(View view) {
startActivity(new Intent(StatusPayment.this, MainActivity.class));
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
}
\ No newline at end of file
......@@ -36,7 +36,7 @@ public class WelcomeActivity extends AppCompatActivity {
// mengecek lauch activity - sebelum memanggil setContentView()
prefManager = new PrefManager(this);
if (!prefManager.isFirstTimeLaunch()) {
if (!prefManager.isFirstWelcome()) {
launchHomeScreen();
finish();
}
......@@ -118,7 +118,7 @@ public class WelcomeActivity extends AppCompatActivity {
}
private void launchHomeScreen() {
prefManager.setFirstTimeLaunch(false);
prefManager.setFirstWelcome(false);
startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));
finish();
}
......
package com.example.yourcashiertest.adapters;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
......@@ -11,9 +10,9 @@ import androidx.recyclerview.widget.RecyclerView;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.CartItemBinding;
import com.example.yourcashiertest.entities.Cart;
import com.example.yourcashiertest.entities.Product;
import com.example.yourcashiertest.models.CartModel;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;
......@@ -22,8 +21,8 @@ public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {
private List<Cart> carts = new ArrayList<>();
public interface CartListener{
void onIncrease();
void onDecrease();
void onIncrease(Cart cart);
void onDecrease(Cart cart);
}
private CartListener listener;
......@@ -56,7 +55,8 @@ public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {
@Override
public int getItemCount() {
return carts.size();
if (carts.size() != 0)return carts.size();
else return 0;
}
public class ViewHolder extends RecyclerView.ViewHolder {
......@@ -72,6 +72,19 @@ public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {
public void bindData(Cart cart, CartListener listener) {
cartItemBinding.setCartProduct(cart);
DecimalFormat rupiah = (DecimalFormat) DecimalFormat.getCurrencyInstance();
DecimalFormatSymbols format = new DecimalFormatSymbols();
format.setCurrencySymbol("Rp. ");
format.setMonetaryDecimalSeparator(',');
format.setGroupingSeparator('.');
rupiah.setDecimalFormatSymbols(format);
cartItemBinding.setPrice(rupiah.format(cart.getPrice()));
cartItemBinding.btnAdd.setOnClickListener(view -> listener.onIncrease(cart));
cartItemBinding.btnMin.setOnClickListener(view -> listener.onDecrease(cart));
}
}
}
package com.example.yourcashiertest.clients;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static <T> T client(Class<T> service, String url) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(
GsonConverterFactory.create(
new GsonBuilder().setLenient().create()
)
)
.build();
return retrofit.create(service);
}
}
......@@ -25,4 +25,7 @@ public interface CartDao {
@Delete
public void deleteCart(Cart cart);
@Query("DELETE FROM Cart")
public void deletAll();
}
......@@ -20,11 +20,11 @@ import com.example.yourcashiertest.entities.Product;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Database(entities = {Product.class}, version = 1, exportSchema = false)
@Database(entities = {Product.class, Cart.class}, version = 3, exportSchema = false)
public abstract class LocalDatabase extends RoomDatabase {
public abstract ProductDao productDao();
// public abstract CartDao cartDao();
public abstract CartDao cartDao();
private static volatile LocalDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
......@@ -32,26 +32,20 @@ public abstract class LocalDatabase extends RoomDatabase {
public static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
// public static final Migration MIGRATION_1_2 = new Migration(1,2) {
// @Override
// public void migrate(@NonNull SupportSQLiteDatabase database) {
// database.execSQL("CREATE TABLE IF NOT EXISTS Cart (id INTEGER, idProduct INTEGER,price INTEGER, qty INTEGER,nameProduct TEXT, image TEXT)");
// }
// };
//
// public static final Migration MIGRATION_1_3 = new Migration(1,3) {
// @Override
// public void migrate(@NonNull SupportSQLiteDatabase database) {
// database.execSQL("DROP TABLE Cart");
// }
// };
//
// public static final Migration MIGRATION_1_4 = new Migration(1,4) {
// @Override
// public void migrate(@NonNull SupportSQLiteDatabase database) {
// database.execSQL("CREATE TABLE IF NOT EXISTS Cart (id INTEGER, idProduct INTEGER,price INTEGER, qty INTEGER,nameProduct TEXT, image TEXT)");
// }
// };
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS Cart (id INTEGER NOT NULL, idProduct INTEGER NOT NULL," +
"price INTEGER NOT NULL, qty INTEGER NOT NULL, nameProduct TEXT NOT NULL, image TEXT NOT NULL, PRIMARY KEY(id))");
}
};
public static final Migration MIGRATION_2_3 = new Migration(2,3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Cart ADD COLUMN realPrice INTEGER NOT NULL DEFAULT 0");
}
};
public static LocalDatabase getDatabase(Context context) {
if (INSTANCE == null) {
......@@ -59,6 +53,7 @@ public abstract class LocalDatabase extends RoomDatabase {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
LocalDatabase.class, "yourcashier_database")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
.build();
}
}
......
......@@ -35,6 +35,10 @@ public class Cart implements Parcelable {
@ColumnInfo(name = "image")
String image;
@NonNull
@ColumnInfo(name = "realPrice")
long realPrice = 0;
protected Cart(Parcel in) {
id = in.readLong();
idProduct = in.readLong();
......@@ -42,6 +46,7 @@ public class Cart implements Parcelable {
image = in.readString();
price = in.readLong();
qty = in.readLong();
price = in.readLong();
}
public static final Creator<Cart> CREATOR = new Creator<Cart>() {
......@@ -56,12 +61,13 @@ public class Cart implements Parcelable {
}
};
public Cart(long idProduct, String nameProduct, String image, long price, long qty){
public Cart(long idProduct, String nameProduct, String image, long price, long qty, long realPrice){
this.idProduct = idProduct;
this.nameProduct = nameProduct;
this.image = image;
this.price = price;
this.qty = qty;
this.realPrice = realPrice;
}
public long getId() {
......@@ -112,6 +118,14 @@ public class Cart implements Parcelable {
this.qty = qty;
}
public Long getRealPrice() {
return realPrice;
}
public void setRealPrice(Long realPrice) {
this.realPrice = realPrice;
}
@Override
public int describeContents() {
return 0;
......@@ -125,5 +139,6 @@ public class Cart implements Parcelable {
dest.writeString(image);
dest.writeLong(price);
dest.writeLong(qty);
dest.writeLong(realPrice);
}
}
package com.example.yourcashiertest.models;
public class CartModel {
long price, qty, idProduct;
String nameProduct, image;
public long getPrice() {
return price;
}
public void setPrice(long price) {
this.price = price;
}
public long getQty() {
return qty;
}
public void setQty(long qty) {
this.qty = qty;
}
public long getIdProduct() {
return idProduct;
}
public void setIdProduct(long idProduct) {
this.idProduct = idProduct;
}
public String getNameProduct() {
return nameProduct;
}
public void setNameProduct(String nameProduct) {
this.nameProduct = nameProduct;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
package com.example.yourcashiertest.models;
import java.util.List;
import com.google.gson.annotations.SerializedName;
public class ResponseUser{
@SerializedName("data")
private List<User> user;
@SerializedName("message")
private String message;
@SerializedName("status")
private boolean status;
public void setData(List<User> data){
this.user = data;
}
public List<User> getData(){
return user;
}
public void setMessage(String message){
this.message = message;
}
public String getMessage(){
return message;
}
public void setStatus(boolean status){
this.status = status;
}
public boolean isStatus(){
return status;
}
}
\ No newline at end of file
package com.example.yourcashiertest.models;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.gson.annotations.SerializedName;
public class User implements Parcelable {
@SerializedName("password")
private String password;
@SerializedName("full_name")
private String fullName;
@SerializedName("phone_number")
private String phoneNumber;
@SerializedName("email")
private String email;
public User(Parcel in) {
password = in.readString();
fullName = in.readString();
phoneNumber = in.readString();
email = in.readString();
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
public User() {
}
public void setPassword(String password) {
this.password = password;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword(){
return password;
}
public String getFullName(){
return fullName;
}
public String getPhoneNumber(){
return phoneNumber;
}
public String getEmail(){
return email;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(password);
dest.writeString(fullName);
dest.writeString(phoneNumber);
dest.writeString(email);
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@ public class CartRepository {
public CartRepository(Application application){
LocalDatabase db = LocalDatabase.getDatabase(application);
// cartDao = db.cartDao();
cartDao = db.cartDao();
carts = cartDao.getCarts();
}
......@@ -32,6 +32,10 @@ public class CartRepository {
LocalDatabase.databaseWriteExecutor.execute(() -> cartDao.deleteCart(cart));
}
public void clear(){
LocalDatabase.databaseWriteExecutor.execute(() -> cartDao.deletAll());
}
public LiveData<List<Cart>> getAllCart(){
return this.carts;
}
......
package com.example.yourcashiertest.services;
import com.example.yourcashiertest.models.ResponseUser;
import com.example.yourcashiertest.models.User;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface UserService {
@GET("v1/customer")
Call<ResponseUser> getAllUser();
@Headers("Content-Type: application/json")
@POST("v1/customer")
Call<User> registerUser(@Body User user);
}
package com.example.yourcashiertest.utils;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class Convert {
public static String changeToCurrency(long totalPrice){
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance();
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("Rp. ");
formatSymbols.setMonetaryDecimalSeparator(',');
formatSymbols.setGroupingSeparator('.');
String priceRupiah = decimalFormat.format(totalPrice);
return priceRupiah;
}
}
package com.example.yourcashiertest.viewmodels;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.example.yourcashiertest.models.CartModel;
import java.util.List;
public class CartVM extends ViewModel {
public MutableLiveData<List<CartModel>> allCart;
public MutableLiveData<List<CartModel>> getAllCart() {
return allCart;
}
public void setAllCart(List<CartModel> cart) {
this.allCart.postValue(cart);
}
}
......@@ -40,6 +40,10 @@ public class CartViewModel extends AndroidViewModel {
repository.delete(cart);
}
public void clear(){
repository.clear();
}
public MutableLiveData<Cart> getCart(){
return this.cart;
}
......
package com.example.yourcashiertest.viewmodels;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.example.yourcashiertest.clients.ApiClient;
import com.example.yourcashiertest.models.ResponseUser;
import com.example.yourcashiertest.models.User;
import com.example.yourcashiertest.services.UserService;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class UserViewModel extends ViewModel {
MutableLiveData<List<User>> listUser = new MutableLiveData<>();
public final String BASE_URL = "https://your-cashier.herokuapp.com/api/";
public MutableLiveData<List<User>> getListUser(){
return this.listUser;
}
public void registrasi(User user){
ApiClient.client(UserService.class, BASE_URL).registerUser(user)
.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
public void setListUser(){
ApiClient.client(UserService.class, BASE_URL).getAllUser().enqueue(new Callback<ResponseUser>() {
@Override
public void onResponse(Call<ResponseUser> call, Response<ResponseUser> response) {
listUser.setValue(response.body().getData());
Log.d("user", String.valueOf(response.body().getData()));
}
@Override
public void onFailure(Call<ResponseUser> call, Throwable t) {
}
});
}
}
<vector android:height="511.68176dp" android:viewportHeight="517.3097"
android:viewportWidth="567.1704" android:width="561dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#3f3d56" android:pathData="M13.551,186.032l475.239,-138.465l12.588,43.204l-475.239,138.465z"/>
<path android:fillColor="#3f3d56" android:pathData="M70.329,384.481 L0.283,144.068a7,7 0,0 1,4.763 -8.679L468.764,0.281a7.006,7.006 0,0 1,8.679 4.762l62.056,212.989 -1.92,0.56L475.522,5.603a5.009,5.009 0,0 0,-6.199 -3.402L5.605,137.309a5,5 0,0 0,-3.402 6.199l70.047,240.413Z"/>
<path android:fillColor="#E0A240" android:pathData="M436.862,219.022a6.512,6.512 0,0 1,-6.243 -4.683l-11.749,-40.323a6.507,6.507 0,0 1,4.422 -8.059l40.323,-11.749a6.507,6.507 0,0 1,8.059 4.423L483.423,198.955a6.507,6.507 0,0 1,-4.422 8.059l-40.323,11.749A6.479,6.479 0,0 1,436.862 219.022Z"/>
<path android:fillColor="#E0A240" android:pathData="M69.246,144.812a11.691,11.691 0,0 0,-0.43 -1.22,12 12,0 0,0 -22.91,6.67 11.38,11.38 0,0 0,0.29 1.26,12.019 12.019,0 0,0 11.53,8.64 11.749,11.749 0,0 0,3.35 -0.48A12.013,12.013 0,0 0,69.246 144.812ZM60.516,157.762a10.013,10.013 0,0 1,-12.4 -6.8,11.435 11.435,0 0,1 -0.28,-1.26 9.997,9.997 0,0 1,19.04 -5.54,8.338 8.338,0 0,1 0.45,1.21A10.004,10.004 0,0 1,60.516 157.762Z"/>
<path android:fillColor="#E0A240" android:pathData="M39.814,153.382a11.002,11.002 0,0 1,4.208 -12.057,11 11,0 1,0 5.818,19.967A11.002,11.002 0,0 1,39.814 153.382Z"/>
<path android:fillColor="#ccc" android:pathData="M350.676,202.942a6.042,6.042 0,0 0,-7.45 -4.2L276.836,217.312l-7.15,2h44.9l7.15,-2 24.75,-6.92A6.049,6.049 0,0 0,350.676 202.942Z"/>
<path android:fillColor="#ccc" android:pathData="M303.706,189.072a6.045,6.045 0,0 0,-7.45 -4.19l-99.62,27.86a6.068,6.068 0,0 0,-4.37 6.57h25.79l7.16,-2 74.3,-20.78A6.055,6.055 0,0 0,303.706 189.072Z"/>
<path android:fillColor="#3f3d56" android:pathData="M560.17,217.31L77.17,217.31a7.008,7.008 0,0 0,-7 7v286a7.008,7.008 0,0 0,7 7L560.17,517.31a7.008,7.008 0,0 0,7 -7v-286A7.008,7.008 0,0 0,560.17 217.31ZM565.17,510.31a5.002,5.002 0,0 1,-5 5L77.17,515.31a5.002,5.002 0,0 1,-5 -5v-286a5.002,5.002 0,0 1,5 -5L560.17,219.31a5.002,5.002 0,0 1,5 5Z"/>
<path android:fillColor="#E0A240" android:pathData="M124.166,256.312a12,12 0,1 1,12 -12A12.014,12.014 0,0 1,124.166 256.312ZM124.166,234.312a10,10 0,1 0,10 10A10.011,10.011 0,0 0,124.166 234.312Z"/>
<path android:fillColor="#E0A240" android:pathData="M105.514,244.312a11.002,11.002 0,0 1,7.413 -10.399,11 11,0 1,0 0,20.797A11.002,11.002 0,0 1,105.514 244.312Z"/>
<path android:fillColor="#E0A240" android:pathData="M172.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,172.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M196.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,196.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M220.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,220.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M257.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,257.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M281.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,281.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M305.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,305.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M342.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,342.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M366.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,366.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M390.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,390.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M427.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,427.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M451.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,451.81 386.09Z"/>
<path android:fillColor="#E0A240" android:pathData="M475.81,386.09a9.01,9.01 0,0 1,-9 -9v-27a9,9 0,0 1,18 0v27A9.01,9.01 0,0 1,475.81 386.09Z"/>
<path android:fillColor="#e6e6e6" android:pathData="M233.828,486.257L104.388,486.257a6.047,6.047 0,1 1,0 -12.095L233.828,474.162a6.047,6.047 0,1 1,0 12.095Z"/>
<path android:fillColor="#e6e6e6" android:pathData="M192.328,460.257L145.888,460.257a6.047,6.047 0,1 1,0 -12.095h46.44a6.047,6.047 0,1 1,0 12.095Z"/>
<path android:fillColor="#3f3d56" android:pathData="M71.81,277.09h493v2h-493z"/>
</vector>
This diff is collapsed.
......@@ -55,7 +55,6 @@
android:layout_height="21dp"
android:layout_marginEnd="5dp"
android:gravity="top"
tools:text="$342424"
app:layout_constraintBottom_toBottomOf="@+id/cart"
app:layout_constraintStart_toEndOf="@+id/cart"
app:layout_constraintEnd_toStartOf="@+id/amount"
......@@ -79,7 +78,6 @@
android:layout_height="20dp"
android:gravity="top"
android:textColor="#fff"
android:text=""
android:textAppearance="@style/some_id"
app:layout_constraintBottom_toBottomOf="@+id/amount"
app:layout_constraintEnd_toEndOf="@+id/amount"
......
......@@ -6,15 +6,25 @@
android:layout_height="match_parent"
android:paddingHorizontal="10dp"
tools:context=".activities.ForgetPassword">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/tvResetPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25dp"
android:layout_marginStart="10dp"
android:layout_marginTop="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textStyle="bold"
android:text="RESET PASSWORD"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilEmail"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
app:boxStrokeColor="@color/black"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvResetPassword"
android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
......@@ -29,17 +39,65 @@
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnResetPw"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilCrPw"
app:passwordToggleEnabled="true"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tilEmail"
android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etCrPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Current Password"
android:imeOptions="actionNext"
android:inputType="text"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilNewPw"
app:passwordToggleEnabled="true"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tilCrPw"
android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etNewPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="New Password"
android:inputType="text"
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnResetPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="4dp"
android:backgroundTint="@color/colorPrimary"
android:padding="@dimen/space_default"
android:text="RESET PASSWORD"
app:cornerRadius="@dimen/space_default"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tilEmail" />
app:layout_constraintTop_toBottomOf="@+id/tilNewPw"
app:layout_constraintVertical_bias="0.008" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -17,7 +17,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textStyle="bold"
android:text="Login"/>
android:text="LOGIN"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilUsername"
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.SkActivity">
<WebView
android:id="@+id/wbCompany"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
tools:context=".materials.designs.webview.CompanyActivity" />
<ProgressBar
android:id="@+id/pbLoading"
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_centerInParent="true" />
</RelativeLayout>
\ No newline at end of file
......@@ -17,12 +17,4 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar
android:id="@+id/pbLoading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivLogo"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<layout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".activities.StatusPayment">
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/tvPaymentStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="top"
android:text="@string/payment_status"
android:textAppearance="@style/payment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.072"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<data>
<variable
name="refund"
type="String" />
</data>
<ImageView
android:id="@+id/icConfirmed"
android:layout_width="150dp"
android:layout_height="130dp"
android:src="@drawable/confirmed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentStatus"
android:layout_marginTop="40dp"
tools:layout_editor_absoluteX="140dp"
tools:layout_editor_absoluteY="29dp" />
<TextView
android:id="@+id/tvPaymentSuccess"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textSize="24dp"
android:gravity="center"
android:text="@string/payment_by_cash_was_successful"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/icConfirmed" />
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".activities.StatusPayment">
<TextView
android:id="@+id/tvRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:gravity="center"
android:text="@string/refund"
android:textSize="35dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentSuccess" />
<TextView
android:id="@+id/tvPaymentStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="top"
android:text="@string/payment_status"
android:textAppearance="@style/payment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.072"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvNominalRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:gravity="center"
android:text="Rp. 44000"
android:textSize="45dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRefund" />
<ImageView
android:id="@+id/icConfirmed"
android:layout_width="150dp"
android:layout_height="130dp"
android:src="@drawable/confirmed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentStatus"
android:layout_marginTop="40dp"
tools:layout_editor_absoluteX="140dp"
tools:layout_editor_absoluteY="29dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnFinish"
android:onClick="btnFinish"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="FINISH"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvNominalRefund"
app:layout_constraintVertical_bias="1.0" />
<TextView
android:id="@+id/tvPaymentSuccess"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textSize="24dp"
android:gravity="center"
android:text="@string/payment_by_cash_was_successful"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/icConfirmed" />
<TextView
android:id="@+id/tvRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:gravity="center"
android:text="@string/refund"
android:textSize="35dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentSuccess" />
<TextView
android:id="@+id/tvNominalRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:gravity="center"
android:text="@{refund}"
android:textSize="45dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRefund" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnFinish"
android:onClick="btnFinish"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="FINISH"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvNominalRefund"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -7,14 +7,19 @@
<variable
name="cartProduct"
type="com.example.yourcashiertest.entities.Cart" />
<variable
name="qty"
type="String" />
<variable
name="price"
type="String" />
</data>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
......@@ -27,6 +32,7 @@
android:id="@+id/imageView"
android:layout_width="107dp"
android:layout_height="110dp"
app:file="@{cartProduct.image}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.003"
......@@ -42,7 +48,7 @@
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:gravity="top"
android:text="@string/burger_medi"
android:text="@{cartProduct.nameProduct}"
android:textAppearance="@style/burger_medi"
app:layout_constraintBottom_toBottomOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="parent"
......@@ -59,9 +65,7 @@
android:layout_alignParentTop="true"
android:gravity="top"
android:text=""
tools:text="$6000"
android:layout_marginStart="20dp"
android:layout_marginBottom="20dp"
tools:text="@{price}"
android:textAppearance="@style/some_id"
app:layout_constraintBottom_toBottomOf="@+id/imageView"
app:layout_constraintHorizontal_bias="0.106"
......@@ -113,8 +117,7 @@
android:id="@+id/tv_qty"
android:layout_width="10dp"
android:layout_height="wrap_content"
android:text="@{qty}"
tools:text="4"
android:text="@{cartProduct.qty + ``}"
app:layout_constraintBottom_toBottomOf="@+id/v_add"
app:layout_constraintEnd_toStartOf="@+id/btn_add"
app:layout_constraintStart_toEndOf="@+id/btn_min"
......
......@@ -13,7 +13,8 @@
<ImageView
android:layout_width="250dp"
android:layout_height="200dp" />
android:layout_height="200dp"
android:src="@drawable/yout_cashier"/>
<TextView
android:layout_width="wrap_content"
......
......@@ -6,4 +6,7 @@
<item
android:id="@+id/item_two"
android:title="Update / Delete Product"/>
<item
android:id="@+id/item_three"
android:title="Log Out"/>
</menu>
\ No newline at end of file
......@@ -27,7 +27,7 @@
<string name="payment_by_cash_was_successful">Payment by Cash was successful</string>
<string name="refund">Refund</string>
<string name="payment_status">Payment Status</string>
<string name="lupa_password">Forget Password?</string>
<string name="lupa_password">Forgot Password?</string>
<string name="dont_have_an_account">Dont have an Account?</string>
<string name="sign_up_here">Sign Up Here</string>
<string name="sign_in_here">Sign In Here</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment