Aplikasi Inventory Barang
1. Screenshoot Lembar UAS
2. Deskripsi Program
Aplikasi ini dibuat menggunakan android studio dan firebase untuk autentikasi login dan juga databasenya. Aplikasi ini dibuat untuk memudahkan customer dalam menghitung stok barang sehingga customer hanya akan memasukan data lewat app ini.
-Kelebihan dari Aplikasi ini adalah dapat melihat statistik dari stok barang seperti, stok di gudang, stok keseluruhan, stok keluar dan juga menampilkannya dalam piechart sehingga dapat mempermudah customer dalam melihat arus stok masuk dan keluar.
-Kekurangan dari aplikasi ini adalah customer harus memasukan data secara manual, dan belum bisa scan barcode untuk setiap barang yang ada.
-Mungkin akan sedikit berbeda dari sketch pada saat di kertas UAS, karena saya menambahkan beberapa update fitur untuk membuat aplikasi ini lebih menarik.
3. Tampilan Design Aplikasi
Tampilan Login
Tampilan Register
Tampilan Menu Awal
Tampilan Menu Product
Tampilan Menu Stock Terendah
Tampilan Menu Kelola Stock Product
Tampilan Menu Menambahkan Product
Tampilan Menu Laporan Transaksi
4. XML
activity_login.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/login_activity" tools:context=".Actitvity.LoginActivity"> </androidx.constraintlayout.widget.ConstraintLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/main_container" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <FrameLayout android:id="@+id/flcontent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/design_default_color_primary_dark" app:layout_constraintBottom_toBottomOf="parent" app:menu="@menu/navigation" /></androidx.constraintlayout.widget.ConstraintLayout>
activity_splash.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SplashActivity"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/logo" /></androidx.constraintlayout.widget.ConstraintLayout>
fragment_all_tracsaction.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout7" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.AllTransactionRecordFragment" > <ProgressBar android:id="@+id/spinner2" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_all_trsction" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginEnd="1dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
fragment_detail_product.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout6" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.DetailProductFragment"> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginEnd="32dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline8"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/dt_code" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/code" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginEnd="32dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout2"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/dt_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/name" /> </com.google.android.material.textfield.TextInputLayout> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginEnd="32dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout3"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/dt_price" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/price" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginEnd="32dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout4"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/dt_stock" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/stock" /> </com.google.android.material.textfield.TextInputLayout> <ImageView android:id="@+id/dt_image" android:layout_width="165dp" android:layout_height="140dp" android:layout_marginStart="24dp" android:src="@drawable/camera" app:layout_constraintBottom_toTopOf="@+id/guideline8" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/dt_btn_change" android:layout_width="161dp" android:layout_height="57dp" android:background="@android:color/white" android:drawableLeft="@drawable/change" android:text="Change Picture" app:layout_constraintBottom_toTopOf="@+id/guideline8" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/guideline9" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.5060827" /> <Button android:id="@+id/dt_btn_save" android:layout_width="155dp" android:layout_height="50dp" android:background="@android:color/white" android:drawableLeft="@drawable/save" android:text="Save" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/guideline9" app:layout_constraintHorizontal_bias="0.641" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout5" app:layout_constraintVertical_bias="0.168" /> <Button android:id="@+id/dt_btn_delete" android:layout_width="153dp" android:layout_height="51dp" android:background="@android:color/white" android:drawableLeft="@drawable/delete" android:text="Delete" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.36" app:layout_constraintStart_toStartOf="@+id/guideline9" app:layout_constraintTop_toBottomOf="@+id/textInputLayout5" app:layout_constraintVertical_bias="0.164" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_home.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout2" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:background="#FFFFFF" tools:context=".Fragments.HomeFragment" > <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_in" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="@color/white" android:src="@drawable/plus" android:visibility="invisible" app:elevation="6dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.954" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.684" app:pressedTranslationZ="12dp" app:rippleColor="@color/white" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_out" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="@color/white" android:src="@drawable/logout" android:visibility="invisible" app:elevation="6dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.954" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.795" app:pressedTranslationZ="12dp" app:rippleColor="@color/white" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/fab_margin" android:backgroundTint="@color/white" android:src="@drawable/menu" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.954" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.891" app:pressedTranslationZ="12dp" app:rippleColor="@color/white" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3" /> <fragment android:id="@+id/fragment" android:name="com.example.management_stock_app.Fragments.TransactionChartFragment" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/guideline" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <fragment android:id="@+id/fragment2" android:name="com.example.management_stock_app.Fragments.TransactionViewFragment" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/fragment" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_login.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/design_default_color_primary_dark" tools:context=".Fragments.LoginFragment"> <androidx.cardview.widget.CardView android:id="@+id/cardView" android:layout_width="300dp" android:layout_height="500dp" android:layout_marginBottom="110dp" android:foreground="?android:attr/selectableItemBackground" app:cardBackgroundColor="#FFE9E9" app:cardCornerRadius="15dp" app:cardElevation="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="250dp" android:layout_height="190dp" android:layout_marginTop="36dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0" app:srcCompat="@drawable/logo" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/login" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginLeft="30dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.447" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" app:layout_constraintVertical_bias="0.135"> <TextView android:layout_width="150dp" android:layout_height="50dp" android:text="Login" android:textAlignment="center" android:textSize="30sp" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="30dp" android:layout_marginEnd="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/input_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Email" android:inputType="textPersonName" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="180dp" android:layout_marginEnd="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/input_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password" android:inputType="textPassword" tools:layout_editor_absoluteX="35dp" tools:layout_editor_absoluteY="405dp" /> </com.google.android.material.textfield.TextInputLayout> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> <Button android:id="@+id/btn_login" android:layout_width="150dp" android:layout_height="40dp" android:layout_margin="10dp" android:background="@drawable/shapes" android:elevation="20dp" android:foreground="?android:attr/selectableItemBackground" android:text="Login" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintCircleRadius="15dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.061" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/cardView" app:layout_constraintVertical_bias="0.523" /> <Button android:id="@+id/btn_register" android:layout_width="150dp" android:layout_height="40dp" android:background="@drawable/shapes" android:elevation="20dp" android:foreground="?android:attr/selectableItemBackground" android:text="Sign Up" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintCircleRadius="15dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.938" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/cardView" app:layout_constraintVertical_bias="0.523" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_low_stocks.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout5" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.LowStocksFragment" > <ProgressBar android:id="@+id/stock_loading" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline6" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.2" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_lower_stock" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline6" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Lowest Stock" android:textStyle="bold" android:textSize="25dp" app:layout_constraintBottom_toTopOf="@+id/guideline6" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
fragment_product_in.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/productin" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.ProductInFragment"> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout8" android:layout_width="0dp" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout7"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/new_product_price" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Product Price" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout7" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout6"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/new_product_stock" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="number stock" android:inputType="number" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout6" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout5"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/new_product_code" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Product code" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout5" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_marginStart="24dp" android:layout_marginTop="16dp" android:layout_marginEnd="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline2"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/new_product_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Product Name" /> </com.google.android.material.textfield.TextInputLayout> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.36" /> <Button android:id="@+id/btn_choose_pic" android:layout_width="150dp" android:layout_height="55dp" android:layout_marginStart="24dp" android:background="@android:color/white" android:drawableLeft="@drawable/photo" android:text="Choose image" app:layout_constraintBottom_toTopOf="@+id/guideline2" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btn_save_product" android:layout_width="109dp" android:layout_height="52dp" android:layout_marginTop="32dp" android:background="@android:color/white" android:drawableLeft="@drawable/save" android:text="Save" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textInputLayout8" /> <ImageView android:id="@+id/product_display" android:layout_width="230dp" android:layout_height="166dp" android:src="@drawable/camera" app:layout_constraintBottom_toTopOf="@+id/btn_choose_pic" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_from_camera" android:layout_width="150dp" android:layout_height="55dp" android:layout_marginEnd="24dp" android:text="Camera" app:layout_constraintBottom_toTopOf="@+id/guideline2" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_product_out.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.ProductOutFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello_blank_fragment" /> </FrameLayout>
fragment_products.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/product_test" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.ProductsFragment"> <!-- TODO: Update blank fragment layout --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_products" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline3" /> <ProgressBar android:id="@+id/progressProduct" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginTop="244dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.1" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_new_product" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="18dp" android:layout_marginBottom="60dp" android:clickable="true" android:backgroundTint="@color/white" android:src="@drawable/plus" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <SearchView android:id="@+id/search_box" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" android:iconifiedByDefault="true" android:queryHint="Search Product" app:layout_constraintBottom_toTopOf="@+id/guideline3" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_register.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout4" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/design_default_color_primary_dark" tools:context=".Fragments.RegisterFragment"> <androidx.cardview.widget.CardView android:id="@+id/cardView" android:layout_width="370dp" android:layout_height="520dp" android:layout_marginBottom="110dp" android:foreground="?android:attr/selectableItemBackground" app:cardBackgroundColor="#FFE9E9" app:cardCornerRadius="15dp" app:cardElevation="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="250dp" android:layout_height="190dp" android:layout_marginTop="36dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0" app:srcCompat="@drawable/logo" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/login" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginLeft="30dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.447" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" app:layout_constraintVertical_bias="0.135"> <TextView android:layout_width="150dp" android:layout_height="50dp" android:text="Register" android:textAlignment="center" android:textSize="30sp" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout" android:layout_width="300dp" android:layout_height="wrap_content" android:layout_marginTop="50dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/reg_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Email" android:inputType="textPersonName" /> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:layout_width="300dp" android:layout_height="wrap_content" android:layout_marginTop="180dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/reg_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password" android:inputType="textPassword" tools:layout_editor_absoluteX="35dp" tools:layout_editor_absoluteY="405dp" /> <ProgressBar android:id="@+id/progress_register" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/input_password" /> </com.google.android.material.textfield.TextInputLayout> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> <Button android:id="@+id/btn_new_account" android:layout_width="150dp" android:layout_height="40dp" android:background="@drawable/shapes" android:elevation="20dp" android:foreground="?android:attr/selectableItemBackground" android:text="Sign Up" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintCircleRadius="15dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/cardView" app:layout_constraintVertical_bias="0.425" /></androidx.constraintlayout.widget.ConstraintLayout>
fragment_stocks.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".Fragments.StocksFragment"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="12dp" android:text="Low Stocks" android:textSize="20dp" app:layout_constraintBottom_toTopOf="@+id/rv_stocks" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_stock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.1" /> <!-- TODO: Update blank fragment layout --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_stocks" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/guideline_stock" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_transaction.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.TransactionFragment" > <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.2" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.7" /> <EditText android:id="@+id/code_product" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:ems="10" android:inputType="textPersonName" android:hint="Code" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline4" /> <Button android:id="@+id/choose_product" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:background="@android:color/white" android:drawableLeft="@drawable/tap" android:text="choose" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/code_product" app:layout_constraintTop_toTopOf="@+id/guideline4" /> <EditText android:id="@+id/name_product" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="32dp" android:ems="10" android:inputType="textPersonName" android:hint="Product Name" app:layout_constraintEnd_toEndOf="@+id/code_product" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/code_product" /> <EditText android:id="@+id/number" android:layout_width="78dp" android:layout_height="47dp" android:layout_marginTop="8dp" android:ems="10" android:inputType="number" app:layout_constraintStart_toEndOf="@+id/btn_decr" app:layout_constraintTop_toBottomOf="@+id/textView4" /> <ImageButton android:id="@+id/btn_incr" android:layout_width="45dp" android:layout_height="46dp" android:layout_marginTop="8dp" android:background="#FFFFFF" android:src="@drawable/add_button" android:text=" Increase" app:layout_constraintStart_toEndOf="@+id/number" app:layout_constraintTop_toBottomOf="@+id/textView4" /> <ImageButton android:id="@+id/btn_decr" android:layout_width="43dp" android:layout_height="46dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:background="@android:color/white" android:src="@drawable/minus_button" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView4" /> <RelativeLayout android:id="@+id/relativeLayout" android:layout_width="178dp" android:layout_height="90dp" android:layout_marginEnd="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/name_product" app:layout_constraintTop_toBottomOf="@+id/choose_product"> <TextView android:id="@+id/textview_stock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginStart="40dp" android:layout_marginTop="20dp" android:text="Current Stock" android:textSize="18dp" android:textStyle="bold" /> <TextView android:id="@+id/stock_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview_stock" android:layout_alignParentStart="true" android:layout_marginStart="85dp" android:layout_marginTop="15dp" android:text="0" android:textSize="20dp" /> </RelativeLayout> <Button android:id="@+id/btn_simpan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:background="@android:color/white" android:drawableLeft="@drawable/save" android:text=" Save" app:layout_constraintBottom_toTopOf="@+id/guideline5" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.384" app:layout_constraintStart_toEndOf="@+id/btn_cancel_transaction" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:text="Number Of Stock" android:textSize="18dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/name_product" /> <RadioGroup android:id="@+id/radioGroup" android:layout_width="179dp" android:layout_height="36dp" android:layout_marginStart="32dp" android:layout_marginTop="32dp" android:layout_marginEnd="16dp" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="@+id/btn_incr" app:layout_constraintTop_toBottomOf="@+id/relativeLayout"> <RadioButton android:id="@+id/radioIN" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="IN" /> <RadioButton android:id="@+id/radioOUT" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="OUT" /> </RadioGroup> <Button android:id="@+id/btn_cancel_transaction" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="92dp" android:layout_marginBottom="24dp" android:background="@android:color/white" android:drawableLeft="@drawable/cancel" android:text=" Cancel" app:layout_constraintBottom_toTopOf="@+id/guideline5" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_transaction_chart.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layout_Chart" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.TransactionChartFragment"> <!-- TODO: Update blank fragment layout --> <ProgressBar android:id="@+id/progressBar4" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_margin="60dp" /> <com.anychart.AnyChartView android:id="@+id/pieChart" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_marginStart="0dp" android:layout_marginTop="0dp" > </com.anychart.AnyChartView> </RelativeLayout>
fragment_transaction_view.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.TransactionViewFragment" android:id="@+id/frameLayout3"> <ProgressBar android:id="@+id/transaction_progress" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/rv_transaction" /> <TextView android:id="@+id/text_empty_transaction" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="EMPTY TRANSACTION !" android:textSize="20dp" android:textColor="@color/black" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_transaction" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
item_detail_transaction.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/linearLayout2" android:layout_width="match_parent" android:layout_height="115dp" android:layout_margin="10dp" android:orientation="vertical"> <androidx.cardview.widget.CardView android:id="@+id/cardView2" android:layout_width="0dp" android:layout_height="0dp" app:cardCornerRadius="20dp" app:cardBackgroundColor="@color/white" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" > <TextView android:id="@+id/item_trs_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginVertical="38dp" android:textStyle="bold" android:textSize="25dp" android:text="Status" /> <TextView android:id="@+id/item_trs_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" android:textStyle="bold" android:textSize="16dp" android:layout_marginLeft="110dp" android:layout_marginTop="15dp" /> <TextView android:id="@+id/item_trs_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Code" android:textStyle="bold" android:textSize="16dp" android:layout_marginLeft="110dp" android:layout_marginTop="40dp" /> <TextView android:id="@+id/item_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Date" android:textSize="16dp" android:layout_marginLeft="110dp" android:layout_marginTop="65dp"/> <TextView android:id="@+id/item_trs_change_stock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25dp" android:layout_gravity="right" android:layout_marginRight="10dp" android:layout_marginVertical="40dp" android:textColor="@color/myGreen" android:text="+0000" /> </androidx.cardview.widget.CardView></androidx.constraintlayout.widget.ConstraintLayout>
item_product.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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/linearLayout" android:layout_width="match_parent" android:layout_height="130dp" android:background="@color/cardview_light_background" android:outlineSpotShadowColor="@color/cardview_shadow_end_color" android:orientation="vertical"> <ImageView android:id="@+id/product_image" android:layout_width="113dp" android:layout_height="100dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:srcCompat="@tools:sample/avatars[3]" /> <TextView android:id="@+id/product_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="24dp" android:text="Product Name" android:textColor="#263AA8" android:textSize="18sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/product_image" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:text="code: " android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/product_image" app:layout_constraintTop_toBottomOf="@+id/product_name" /> <TextView android:id="@+id/product_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="000000" app:layout_constraintStart_toEndOf="@+id/textView3" app:layout_constraintTop_toBottomOf="@+id/product_name" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="4dp" android:text="Stok: " android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/product_image" app:layout_constraintTop_toBottomOf="@+id/textView3" /> <TextView android:id="@+id/product_stock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:text="empty" app:layout_constraintStart_toEndOf="@+id/textView5" app:layout_constraintTop_toBottomOf="@+id/product_code" /> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="4dp" android:text="Harga: " android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/product_image" app:layout_constraintTop_toBottomOf="@+id/textView5" /> <TextView android:id="@+id/product_harga" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:text="Rp 0" app:layout_constraintStart_toEndOf="@+id/textView7" app:layout_constraintTop_toBottomOf="@+id/product_stock" /> </androidx.constraintlayout.widget.ConstraintLayout>
item_single_product.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="150dp" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_margin="15dp" android:orientation="vertical"> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="match_parent" app:cardCornerRadius="25dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_marginStart="0dp" android:layout_marginTop="0dp" android:layout_marginEnd="0dp" android:layout_marginBottom="0dp" > <ImageView android:id="@+id/image_product" android:layout_width="110dp" android:layout_height="100dp" android:layout_margin="25dp" app:srcCompat="@color/rally_orange" /> <TextView android:id="@+id/text_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="16dp" android:textColor="@color/black" android:layout_marginTop="30dp" android:layout_marginStart="155dp" android:text="Product Name" /> <TextView android:id="@+id/text_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00000000" android:textSize="15dp" android:textColor="@color/black" android:layout_marginStart="155dp" android:layout_marginTop="60dp" /> <TextView android:id="@+id/text_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Price" android:textSize="15dp" android:textColor="@color/black" android:layout_marginStart="155dp" android:layout_marginTop="90dp" /> <Button android:id="@+id/button_action" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:layout_marginStart="270dp" android:background="@android:color/white" android:drawableLeft="@drawable/edit" android:text="Set" /> </androidx.cardview.widget.CardView></RelativeLayout>
item_transaction.xml
<?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" android:id="@+id/item_transaction" android:layout_width="match_parent" android:layout_height="120dp" android:layout_margin="10dp" android:padding="8dp" android:orientation="vertical"> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="110dp" android:backgroundTint="@color/colorPrimary" app:cardCornerRadius="20dp" > <TextView android:id="@+id/in_or_out" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="12dp" android:layout_marginTop="35dp" android:text="In / Out" android:textSize="25dp" android:textStyle="bold" /> <TextView android:id="@+id/trs_product_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="105dp" android:layout_marginTop="24dp" android:textStyle="bold" android:textSize="18dp" android:text="Product Name" /> <TextView android:id="@+id/trs_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Date" android:textSize="18dp" android:layout_marginStart="105dp" android:layout_marginTop="54dp" /> </androidx.cardview.widget.CardView></RelativeLayout>
5. Source Code Java
LoginActivity.java
package com.example.management_stock_app.Actitvity; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent;import android.os.Bundle; import com.example.management_stock_app.Fragments.LoginFragment;import com.example.management_stock_app.Fragments.RegisterFragment;import com.example.management_stock_app.MainActivity;import com.example.management_stock_app.R; public class LoginActivity extends AppCompatActivity implements RegisterFragment.OnFragmentInteractionListener, LoginFragment.OnFragmentInteractionListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); getSupportFragmentManager().beginTransaction() .replace(R.id.login_activity, new LoginFragment()) .commit(); } @Override public void onLoginSuccess() { startActivity(new Intent(this, MainActivity.class)); } @Override public void registrationPhase() { getSupportFragmentManager().beginTransaction() .replace(R.id.login_activity, new RegisterFragment()) .commit(); } @Override public void tourToLogin() { getSupportFragmentManager().beginTransaction() .replace(R.id.login_activity, new LoginFragment()) .commit(); }}
DetailTransactionAdapter.java
package com.example.management_stock_app.Adapters; import android.annotation.SuppressLint;import android.widget.TextView; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter;import com.chad.library.adapter.base.BaseViewHolder;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R; import java.util.List; public class DetailTransactionAdapter extends BaseQuickAdapter<Transaksi, BaseViewHolder> { public DetailTransactionAdapter(@Nullable List<Transaksi> data) { super(R.layout.item_detail_transaction, data); } @SuppressLint("SetTextI18n") @Override protected void convert(@NonNull BaseViewHolder helper, Transaksi item) { TextView sts = helper.getView(R.id.item_trs_status); TextView changes = helper.getView(R.id.item_trs_change_stock); String[] date = item.getDate().split("T", 2); sts.setText(item.getStatus()); String num = String.valueOf(item.getCurrentStock()); if (item.getStatus().equals("IN")) { sts.setTextColor(ContextCompat.getColor(mContext, R.color.myGreen)); changes.setTextColor(ContextCompat.getColor(mContext, R.color.myGreen)); changes.setText("+" + num); } else { sts.setTextColor(ContextCompat.getColor(mContext, R.color.myRed)); changes.setTextColor(ContextCompat.getColor(mContext, R.color.myRed)); changes.setText("-" + num); } helper.setText(R.id.item_trs_name, item.getName()) .setText(R.id.item_trs_code, item.getId()) .setText(R.id.item_date, date[0]); helper.addOnClickListener(R.id.cardView2); }}
LowStockAdapter.java
package com.example.management_stock_app.Adapters; import androidx.annotation.NonNull;import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseQuickAdapter;import com.chad.library.adapter.base.BaseViewHolder;import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.R; import java.util.List; public class LowStockAdapter extends BaseQuickAdapter<Barang, BaseViewHolder> { public LowStockAdapter(@Nullable List<Barang> data) { super(R.layout.item_stock, data); } @Override protected void convert(@NonNull BaseViewHolder helper, Barang item) { helper.setText(R.id.stock_name, item.getNama()) .setText(R.id.stock_code, item.getCode()) .setText(R.id.stock_number_item, String.valueOf(item.getStock())); }}
ProductAdapter.java
package com.example.management_stock_app.Adapters; import android.widget.ImageView; import androidx.annotation.NonNull;import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseItemDraggableAdapter;import com.chad.library.adapter.base.BaseQuickAdapter;import com.chad.library.adapter.base.BaseViewHolder;import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.R;import com.squareup.picasso.Picasso; import java.util.List; public class ProductAdapter extends BaseQuickAdapter<Barang, BaseViewHolder> { public ProductAdapter(@Nullable List<Barang> data) { super(R.layout.item_single_product, data); } @Override protected void convert(@NonNull BaseViewHolder helper, Barang product) { ImageView img = helper.getView(R.id.image_product); String uri = "https://static.thenounproject.com/png/583402-200.png"; if (product.getGambar().equals("kosong")) { Picasso.get().load(uri).into(img); } else { Picasso.get().load(product.getGambar()).into(img); } helper.setText(R.id.text_name, product.getNama()) .setText(R.id.text_code, product.getCode())// .setText(R.id.product_stock, String.valueOf(product.getStock())) .setText(R.id.text_price, String.valueOf(product.getHarga())) .addOnClickListener(R.id.button_action); }}
TransactionAdapter.java
package com.example.management_stock_app.Adapters; import androidx.annotation.NonNull;import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseQuickAdapter;import com.chad.library.adapter.base.BaseViewHolder;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R; import java.util.List; public class TransactionAdapter extends BaseQuickAdapter<Transaksi, BaseViewHolder> { public TransactionAdapter(@Nullable List<Transaksi> data) { super(R.layout.item_transaction ,data); } @Override protected void convert(@NonNull BaseViewHolder helper, Transaksi item) { String date = item.getDate(); String[] dateOnly = date.split("T", 2); helper.setText(R.id.trs_product_name, item.getName()) .setText(R.id.trs_date, dateOnly[0]) .setText(R.id.in_or_out, item.getStatus()); }}
AllTransactionRecordFragment.java
package com.example.management_stock_app.Adapters; import androidx.annotation.NonNull;import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseQuickAdapter;import com.chad.library.adapter.base.BaseViewHolder;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R; import java.util.List; public class TransactionAdapter extends BaseQuickAdapter<Transaksi, BaseViewHolder> { public TransactionAdapter(@Nullable List<Transaksi> data) { super(R.layout.item_transaction ,data); } @Override protected void convert(@NonNull BaseViewHolder helper, Transaksi item) { String date = item.getDate(); String[] dateOnly = date.split("T", 2); helper.setText(R.id.trs_product_name, item.getName()) .setText(R.id.trs_date, dateOnly[0]) .setText(R.id.in_or_out, item.getStatus()); }}
DetailProductFragment.java
package com.example.management_stock_app.Fragments; import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment; import android.provider.MediaStore;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast; import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.SetOptions;import com.google.firebase.storage.FileDownloadTask;import com.google.firebase.storage.FirebaseStorage;import com.google.firebase.storage.OnProgressListener;import com.google.firebase.storage.StorageReference;import com.google.firebase.storage.UploadTask;import com.squareup.picasso.Picasso; import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.UUID; import static android.app.Activity.RESULT_OK; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link DetailProductFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class DetailProductFragment extends Fragment { private final int PICK_IMAGE_REQUEST = 71; private final String TAG = "DETAIL_PRODUCT_FRAGMENT"; private OnFragmentInteractionListener mListener; private EditText code, name, price, stock; private ImageView image; private Button change, save, delete; private FirebaseAuth auth; private FirebaseFirestore firestore; private FirebaseStorage storage; private StorageReference storageReference; private Barang barang; private Uri filepath; private Bitmap bitmap; private ProgressDialog progressDialog; public DetailProductFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment auth = FirebaseAuth.getInstance(); firestore = FirebaseFirestore.getInstance(); storage = FirebaseStorage.getInstance(); storageReference = storage.getReference(); progressDialog = new ProgressDialog(getContext()); return inflater.inflate(R.layout.fragment_detail_product, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); code = view.findViewById(R.id.dt_code); name = view.findViewById(R.id.dt_name); price = view.findViewById(R.id.dt_price); stock = view.findViewById(R.id.dt_stock); image = view.findViewById(R.id.dt_image); save = view.findViewById(R.id.dt_btn_save); delete = view.findViewById(R.id.dt_btn_delete); change = view.findViewById(R.id.dt_btn_change); code.setEnabled(false); stock.setEnabled(false); if (barang != null) { code.setText(barang.getCode()); name.setText(barang.getNama()); price.setText(String.valueOf(barang.getHarga())); stock.setText(String.valueOf(barang.getStock())); Picasso.get().load(barang.getGambar()).into(image); } change.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { choosePicture(); } }); image.setClickable(true); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { choosePicture(); } }); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String nm = name.getText().toString(); String pr = price.getText().toString(); if (!nm.equals("") && !pr.equals("")) { if (Integer.parseInt(pr) > 0) { barang.setNama(nm); barang.setHarga(Integer.valueOf(pr)); //delete first deleteImage(barang.getGambar()); // then upload uploadImage(); } else { Toast.makeText(getContext(), "Price must greater than 0 (zero)", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getContext(), "Please Check your form!", Toast.LENGTH_SHORT).show(); } } }); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (barang != null) { deleteDialog(); } } }); } public void setInformation(Barang barang) { this.barang = barang; } private void choosePicture() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } private void deleteDialog() { AlertDialog.Builder alert = new AlertDialog.Builder(getContext()); alert.setTitle("Warning !"); alert.setMessage("Are you sure want to delete this product, note: delete product couldn't the transaction history!") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { deleteImage(barang.getGambar()); deleteData(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alertDialog = alert.create(); alertDialog.show(); } private void deleteData() { firestore.collection("Users").document(auth.getUid()) .collection("Barang").document(barang.getCode()) .delete().addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(getContext(), "Delete Success full!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getContext(), "Delete Failed", Toast.LENGTH_SHORT).show(); } } }); } private void deleteImage(String imageUrl) { StorageReference sr = storage.getReferenceFromUrl(imageUrl); sr.delete().addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "Success get reference"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.d(TAG, e.getMessage()); } }); } private void uploadImage() { progressDialog.setTitle("Update..."); progressDialog.show(); final StorageReference file = storageReference.child("Products/").child(auth.getUid() + "/").child(UUID.randomUUID().toString()); file.putFile(filepath) .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Log.d(TAG, "Upload complete "+taskSnapshot.getMetadata().getPath()); file.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Uri url = task.getResult(); updateData(url); } } }); } }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) { double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount(); progressDialog.setMessage("uploaded " + (int) progress + "%"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.d(TAG, e.getMessage()); progressDialog.dismiss(); } }); } private void updateData(Uri uriImage) { String urlString = uriImage.toString(); HashMap<String, Object> data = new HashMap<>(); data.put("nama", barang.getNama()); data.put("gambar", urlString); data.put("stock", barang.getStock()); data.put("harga", barang.getHarga()); firestore.collection("Users").document(auth.getUid()) .collection("Barang").document(barang.getCode()) .set(data, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { progressDialog.dismiss(); Toast.makeText(getContext(), "Data Changes Saved!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getContext(), "Failed to save data!", Toast.LENGTH_SHORT).show(); } } }); } @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { filepath = data.getData(); try { bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), filepath); image.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
HomeFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.Toast; import com.chad.library.adapter.base.BaseQuickAdapter;import com.example.management_stock_app.Actitvity.LoginActivity;import com.example.management_stock_app.Adapters.TransactionAdapter;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R;import com.google.android.material.floatingactionbutton.FloatingActionButton;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.FirebaseFirestore; import java.util.ArrayList;import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link HomeFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class HomeFragment extends Fragment implements View.OnClickListener{ Button product, stock, transaction; private Boolean isFabOpen = false; private FloatingActionButton fab,fab1,fab2; private Fragment chart; private Animation fab_open,fab_close,rotate_forward,rotate_backward; private OnFragmentInteractionListener mListener; // Firebase public HomeFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_home, container, false); //((AppCompatActivity) getActivity()).getSupportActionBar().hide(); fab = view.findViewById(R.id.fab_menu); fab1 = view.findViewById(R.id.fab_in); fab2 = view.findViewById(R.id.fab_out); fab_open = AnimationUtils.loadAnimation(getActivity(), R.anim.fab_open); fab_close = AnimationUtils.loadAnimation(getActivity(),R.anim.fab_close); rotate_forward = AnimationUtils.loadAnimation(getActivity(),R.anim.rotate_forward); rotate_backward = AnimationUtils.loadAnimation(getActivity(),R.anim.rotate_backward); fab.setOnClickListener(this); fab1.setOnClickListener(this); fab2.setOnClickListener(this); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.fab_menu: animateFAB(); break; case R.id.fab_in: mListener.buttonInput(); Log.d("tes", "Fab in"); break; case R.id.fab_out: //mListener.buttonOutput(); FirebaseAuth.getInstance().signOut(); Intent i = new Intent(getActivity(), LoginActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i); Toast.makeText(getActivity(), "Your Logout", Toast.LENGTH_SHORT).show(); Log.d("tes", "log out"); break; } } public void animateFAB(){ if(isFabOpen){ fab.startAnimation(rotate_backward); fab1.startAnimation(fab_close); fab2.startAnimation(fab_close); fab1.setClickable(false); fab2.setClickable(false); isFabOpen = false; Log.d("tes", "close"); } else { fab.startAnimation(rotate_forward); fab1.startAnimation(fab_open); fab2.startAnimation(fab_open); fab1.setClickable(true); fab2.setClickable(true); isFabOpen = true; Log.d("tes","open"); } } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); void buttonProduct(); void buttonInput(); void buttonOutput(); void buttonStocks(); void buttonTransaction(); }}
LoginFragment.java
package com.example.management_stock_app.Fragments; import android.app.ProgressDialog;import android.content.Context;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.Spinner;import android.widget.Toast; import com.example.management_stock_app.Models.User;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.AuthResult;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import com.google.firebase.firestore.DocumentReference;import com.google.firebase.firestore.FirebaseFirestore; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link LoginFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class LoginFragment extends Fragment { private static final String TAG = "LoginFragment"; private OnFragmentInteractionListener mListener; private EditText emailField, passwordField; private Button btnLogin, btnReg; private FirebaseAuth fireAuth; private FirebaseUser user; private FirebaseFirestore mfFirestore; private ProgressBar loadingBar; public LoginFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_login, container, false); //((AppCompatActivity) getActivity()).getSupportActionBar().hide(); emailField = view.findViewById(R.id.input_username); passwordField = view.findViewById(R.id.input_password); //loadingBar = view.findViewById(R.id.progressBar3); btnLogin = view.findViewById(R.id.btn_login); btnReg = view.findViewById(R.id.btn_register); fireAuth = FirebaseAuth.getInstance(); mfFirestore = FirebaseFirestore.getInstance(); //loadingBar.setVisibility(View.GONE); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email = emailField.getText().toString(); String pass = passwordField.getText().toString(); if (!email.equals("") && !pass.equals("")) { signIn(email, pass); } } }); btnReg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.registrationPhase(); } } }); return view; } private String usernameFromEmail(String email) { if (email.contains("@")) { return email.split("@")[0]; } else { return email; } } private void buttonGone() { btnReg.setVisibility(View.GONE); btnLogin.setVisibility(View.GONE); //loadingBar.setVisibility(View.VISIBLE); } private void buttonVisible() { btnReg.setVisibility(View.VISIBLE); btnLogin.setVisibility(View.VISIBLE); //loadingBar.setVisibility(View.GONE); } private void signIn(final String email, String pass) { final ProgressDialog progressDialog = new ProgressDialog(getContext()); progressDialog.setTitle("Login..."); progressDialog.show(); buttonGone(); fireAuth.signInWithEmailAndPassword(email, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d(TAG, "LoginUser:onComplete:" + task.isSuccessful()); if (task.isSuccessful()) { if (task.getResult().getUser() != null) { user = task.getResult().getUser(); mListener.onLoginSuccess(); progressDialog.dismiss(); } } else { buttonVisible(); Toast.makeText(getActivity(), "Failed Login", Toast.LENGTH_SHORT).show(); progressDialog.dismiss(); } } }); } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onLoginSuccess(); void registrationPhase(); }}
LowStocksFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.Toast; import com.chad.library.adapter.base.BaseQuickAdapter;import com.example.management_stock_app.Adapters.LowStockAdapter;import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.DocumentSnapshot;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.Query;import com.google.firebase.firestore.QuerySnapshot;import com.google.firebase.storage.FirebaseStorage; import java.util.ArrayList;import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link LowStocksFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class LowStocksFragment extends Fragment { private final String TAG = "LOW_STOCK_FRAGMENT"; private OnFragmentInteractionListener mListener; private FirebaseAuth auth; private FirebaseFirestore firestore; private RecyclerView rvLowStocks; private ProgressBar spinner; private List<Barang> lowStockList = new ArrayList<>(); private LowStockAdapter adapter; private int stockMinimum = 25; public LowStocksFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment auth = FirebaseAuth.getInstance(); firestore = FirebaseFirestore.getInstance(); return inflater.inflate(R.layout.fragment_low_stocks, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); rvLowStocks = view.findViewById(R.id.rv_lower_stock); spinner = view.findViewById(R.id.stock_loading); rvLowStocks.setVisibility(View.GONE); spinner.setVisibility(View.GONE); getLowerStock(); } public void getLowerStock() { spinner.setVisibility(View.VISIBLE); firestore.collection("Users").document(auth.getUid()) .collection("Barang").whereLessThanOrEqualTo("stock", stockMinimum) .orderBy("stock", Query.Direction.ASCENDING).limit(10) .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { for (DocumentSnapshot doc : task.getResult()) { Barang barang = new Barang( doc.getId(), doc.get("nama").toString(), doc.get("gambar").toString(), Integer.valueOf(doc.get("stock").toString()), Integer.valueOf(doc.get("harga").toString()) ); lowStockList.add(barang); } spinner.setVisibility(View.GONE); showList(); } else { spinner.setVisibility(View.GONE); Log.d(TAG, "Empty DataStore!"); } } else { spinner.setVisibility(View.GONE); Toast.makeText(getContext(), "Failed Get Data!", Toast.LENGTH_SHORT).show(); } } }); } public void showList() { adapter = new LowStockAdapter(lowStockList); adapter.openLoadAnimation(); adapter.isFirstOnly(true); adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { Barang barang = lowStockList.get(position); Toast.makeText(getContext(), "Name: " + barang.getNama(), Toast.LENGTH_SHORT).show(); } }); rvLowStocks.setAdapter(adapter); rvLowStocks.setLayoutManager(new LinearLayoutManager(getContext())); rvLowStocks.setVisibility(View.VISIBLE); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
ProductInFragment.java
package com.example.management_stock_app.Fragments; import android.Manifest;import android.app.ProgressDialog;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.net.Uri;import android.os.Build;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.annotation.RequiresApi;import androidx.fragment.app.Fragment; import android.provider.MediaStore;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast; import com.example.management_stock_app.MainActivity;import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.Models.User;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import com.google.firebase.firestore.DocumentReference;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.FirebaseFirestoreException;import com.google.firebase.firestore.SetOptions;import com.google.firebase.firestore.Transaction;import com.google.firebase.storage.FirebaseStorage;import com.google.firebase.storage.OnProgressListener;import com.google.firebase.storage.StorageReference;import com.google.firebase.storage.UploadTask; import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.UUID; import static android.app.Activity.RESULT_OK; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link ProductInFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class ProductInFragment extends Fragment { private final int PICK_IMAGE_REQUEST = 71; private final int CAMERA_REQUEST = 1888; private static final int MY_CAMERA_PERMISSION_CODE = 100; private final String TAG = "PRODUCT_IN_FRAGMENT"; private OnFragmentInteractionListener mListener; private EditText name, stock, price, code; private ImageView display; private Button btnSave, btnChoose, btnCamera; private ProgressDialog progressDialog; private Uri filepath; private Bitmap bitmap; private FirebaseUser user; private FirebaseStorage firebaseStorage; private FirebaseFirestore firestore; private StorageReference storageReference; public ProductInFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_product_in, container, false); name = view.findViewById(R.id.new_product_name); stock = view.findViewById(R.id.new_product_stock); price = view.findViewById(R.id.new_product_price); code = view.findViewById(R.id.new_product_code); display = view.findViewById(R.id.product_display); btnChoose = view.findViewById(R.id.btn_choose_pic); btnSave = view.findViewById(R.id.btn_save_product); btnCamera = view.findViewById(R.id.btn_from_camera); progressDialog = new ProgressDialog(getContext()); user = FirebaseAuth.getInstance().getCurrentUser(); firebaseStorage = FirebaseStorage.getInstance(); firestore = FirebaseFirestore.getInstance(); storageReference = firebaseStorage.getReference(); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); btnChoose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { choosePicture(); } }); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { uploadNewBarang(); } }); btnCamera.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.M) @Override public void onClick(View v) { fromCamera(); } }); } // TODO: Rename method, update argument and hook method into UI event private void choosePicture() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } @RequiresApi(api = Build.VERSION_CODES.M) private void fromCamera() { if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE); } else { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); } } private void uploadNewBarang() { final String nm = name.getText().toString(); final String cd = code.getText().toString(); String strStock = stock.getText().toString(); String strPrice = price.getText().toString(); if (!nm.equals("") && !cd.equals("") && !strPrice.equals("") && !strStock.equals("")) { final int stk = Integer.valueOf(strStock); final int hrg = Integer.valueOf(strPrice); if (filepath != null) { progressDialog.setTitle("Uploading..."); progressDialog.show(); final StorageReference file = storageReference.child("Products/").child(user.getUid() + "/").child(UUID.randomUUID().toString()); file.putFile(filepath) .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Toast.makeText(getContext(), "Upload Success!", Toast.LENGTH_SHORT).show(); file.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { Barang barang = new Barang(cd, nm, uri.toString(), stk, hrg); insertBarang(barang); } }); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(getContext(), "Upload Failed!!:" + e.getMessage(), Toast.LENGTH_SHORT).show(); progressDialog.dismiss(); } }) .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) { double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount(); progressDialog.setMessage("uploaded " + (int) progress + "%"); } }); } } else { Toast.makeText(getContext(), "Please fill The blank text field!!!", Toast.LENGTH_SHORT).show(); } } public void insertBarang(Barang barang) { HashMap<String, Object> data = new HashMap<>(); data.put("nama", barang.getNama()); data.put("gambar", barang.getGambar()); data.put("stock", barang.getStock()); data.put("harga", barang.getHarga()); firestore.collection("Users").document(user.getUid()) .collection("Barang").document(barang.getCode()) .set(data, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d(TAG, "Complete insert data barang"); progressDialog.dismiss(); } else { Log.d(TAG, "InsertData Failed"); progressDialog.dismiss(); } } }); } @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { filepath = data.getData(); try { bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), filepath); display.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } else if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK ) { filepath = data.getData(); bitmap = ((Bitmap) data.getExtras().get("data")); display.setImageBitmap(bitmap); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == MY_CAMERA_PERMISSION_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(getActivity(), "camera permission granted", Toast.LENGTH_LONG).show(); Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); } else { Toast.makeText(getActivity(), "camera permission denied", Toast.LENGTH_LONG).show(); } } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void goToProductList(); void newBarangAdded(Barang barang); }}
ProductOutFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.net.Uri;import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup; import com.example.management_stock_app.R; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link ProductOutFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class ProductOutFragment extends Fragment { private OnFragmentInteractionListener mListener; public ProductOutFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_product_out, container, false); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
ProductsFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.fragment.app.Fragment;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.SearchView;import android.widget.TextView;import android.widget.Toast; import com.chad.library.adapter.base.BaseQuickAdapter;import com.example.management_stock_app.Adapters.ProductAdapter;import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.Models.User;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.Task;import com.google.android.material.floatingactionbutton.FloatingActionButton;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser; import com.google.firebase.firestore.DocumentSnapshot;import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query;import com.google.firebase.firestore.QuerySnapshot;import com.google.firebase.storage.FirebaseStorage; import java.util.ArrayList;import java.util.List;import java.util.Locale; /** * A simple {@link Fragment} subclass. */public class ProductsFragment extends Fragment { private final String TAG = "ProductsFragment"; private OnFragmentInteractionListener mListener; private FirebaseFirestore firestore; private FirebaseUser firebaseUser; private FirebaseStorage storage; private List<Barang> barangList; private User userData; private ProductAdapter adapter; private String userEmail; private TextView testView; private RecyclerView productsView; private ProgressBar spinner; private FloatingActionButton btnAdd; private SearchView searchView; public ProductsFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_products, container, false); firestore = FirebaseFirestore.getInstance(); firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); storage = FirebaseStorage.getInstance(); userEmail = firebaseUser.getEmail(); barangList = new ArrayList<>(); searchView = view.findViewById(R.id.search_box); productsView = view.findViewById(R.id.rv_products); spinner = view.findViewById(R.id.progressProduct); btnAdd = view.findViewById(R.id.add_new_product); spinner.setVisibility(View.GONE); productsView.setVisibility(View.GONE); getDatabase(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { List<Barang> tmp = new ArrayList<>(); tmp.clear(); String text = newText.toLowerCase(Locale.getDefault()); if (text.length() == 0) { adapterData(barangList); } else { for (Barang brg : barangList) { if (brg.getNama().toLowerCase(Locale.getDefault()).contains(text)) { tmp.add(brg); } } adapterData(tmp); } return false; } }); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.gotoProductIn(); } } }); return view; } private void getDatabase() { spinner.setVisibility(View.VISIBLE); firestore.collection("Users").document(firebaseUser.getUid()) .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot myData = task.getResult(); userData = new User(myData.getId(), myData.get("name").toString(), myData.get("email").toString()); getSubCollection(userData); } else { Toast.makeText(getContext(), "Cannot get Collection", Toast.LENGTH_SHORT).show(); spinner.setVisibility(View.GONE); } } }); } private void getSubCollection(User user) { firestore.collection("Users").document(user.getId()) .collection("Barang").orderBy("nama", Query.Direction.ASCENDING) .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { for (DocumentSnapshot product: task.getResult()) { Barang barang = new Barang(product.getId(), product.get("nama").toString(), product.get("gambar").toString(), Integer.valueOf(product.get("stock").toString()), Integer.valueOf(product.get("harga").toString())); barangList.add(barang); spinner.setVisibility(View.GONE); productsView.setVisibility(View.VISIBLE); adapterData(barangList); } } else { spinner.setVisibility(View.GONE); Log.d(TAG, "Your Data Barang Is Empty"); } } else { spinner.setVisibility(View.GONE); Log.d(TAG, "Failed Please Check Your Connection"); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.d(TAG, e.getMessage()); } }); } private void deleteProduct(String code) { firestore.collection("Users").document(firebaseUser.getUid()) .collection("Barang").document(code).delete() .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(getContext(), "Delete Success!!", Toast.LENGTH_SHORT).show(); Log.d(TAG, "Success Delete Barang Item"); } else { Toast.makeText(getContext(), "Delete Failed!!", Toast.LENGTH_SHORT).show(); } } }); } private void adapterData(List<Barang> list) { adapter = new ProductAdapter(list); adapter.openLoadAnimation(); adapter.isFirstOnly(true); adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { @Override public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { if (mListener != null) { Barang selected = barangList.get(position); mListener.detailBarang(selected); } } }); productsView.setAdapter(adapter); productsView.setLayoutManager(new LinearLayoutManager(getContext())); } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { // TODO: Update argument type and name void buttonProduct(); void addNewProduct(User user); void setDataBarang(List<Barang> dataBarang, User user); void detailBarang(Barang barang); void gotoProductIn(); } }
RegisterFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.fragment.app.Fragment; import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast; import com.example.management_stock_app.Actitvity.LoginActivity;import com.example.management_stock_app.Models.User;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.AuthResult;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.DocumentReference;import com.google.firebase.firestore.FirebaseFirestore; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link RegisterFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class RegisterFragment extends Fragment { private OnFragmentInteractionListener mListener; private EditText email, password; private Button btnReg; private ProgressBar spinner; private FirebaseAuth auth; private FirebaseFirestore firestore; public RegisterFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_register, container, false); auth = FirebaseAuth.getInstance(); firestore = FirebaseFirestore.getInstance(); email = view.findViewById(R.id.reg_email); password = view.findViewById(R.id.reg_password); btnReg = view.findViewById(R.id.btn_new_account); spinner = view.findViewById(R.id.progress_register); spinner.setVisibility(View.GONE); btnReg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String userEmail = email.getText().toString(); String pass = password.getText().toString(); createNewUser(userEmail, pass); } }); return view; } // TODO: Rename method, update argument and hook method into UI event private void createNewUser(String newEmail, String pass) { spinner.setVisibility(View.VISIBLE); final String email = newEmail; auth.createUserWithEmailAndPassword(email, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { String code = task.getResult().getUser().getUid(); writeNewUser(code ,email); } else { Toast.makeText(getActivity(), "Failed Register", Toast.LENGTH_SHORT).show(); } } }); } private void writeNewUser(String code ,String email) { String username = usernameFromEmail(email); User user = new User(username, email); firestore.collection("Users").document(code).set(user) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { spinner.setVisibility(View.GONE); Toast.makeText(getActivity(), "Success create new user", Toast.LENGTH_SHORT).show(); Intent i = new Intent(getActivity(), LoginActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i); } else { spinner.setVisibility(View.GONE); Toast.makeText(getActivity(), "Failed create new user", Toast.LENGTH_SHORT).show(); } } }); } private String usernameFromEmail(String email) { if (email.contains("@")) { return email.split("@")[0]; } else { return email; } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void tourToLogin(); }}
StocksFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.net.Uri;import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup; import com.example.management_stock_app.R; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link StocksFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class StocksFragment extends Fragment { private OnFragmentInteractionListener mListener; public StocksFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_stocks, container, false); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
TransactionChartFragment.java
package com.example.management_stock_app.Fragments; import android.content.Context;import android.graphics.Color;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import androidx.lifecycle.Observer;import androidx.lifecycle.ViewModelProviders; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.Toast; import com.anychart.AnyChart;import com.anychart.AnyChartView;import com.anychart.chart.common.dataentry.DataEntry;import com.anychart.chart.common.dataentry.ValueDataEntry;import com.anychart.chart.common.listener.Event;import com.anychart.chart.common.listener.ListenersInterface;import com.anychart.charts.Pie;import com.anychart.enums.Align;import com.anychart.enums.LegendLayout; import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.DocumentSnapshot;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.QuerySnapshot; import java.util.ArrayList;import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link TransactionChartFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class TransactionChartFragment extends Fragment { private final String TAG = "TRANSACTION_CHART"; private int hand, in, out;// private PieChart chart;// private List<PieEntry> data; private AnyChartView anyChartView; private Pie pie; private ProgressBar spinner; private FirebaseFirestore firestore; private FirebaseAuth auth; private OnFragmentInteractionListener mListener; public TransactionChartFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment firestore = FirebaseFirestore.getInstance(); auth = FirebaseAuth.getInstance(); hand = 0; out = 0; in = 0; return inflater.inflate(R.layout.fragment_transaction_chart, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState);// chart = view.findViewById(R.id.stock_pie_chart); anyChartView = view.findViewById(R.id.pieChart); spinner = view.findViewById(R.id.progressBar4); anyChartView.setVisibility(View.GONE); spinner.setVisibility(View.VISIBLE); getBarangStock(); } private void chart() { spinner.setVisibility(View.GONE); pie = AnyChart.pie(); pie.setOnClickListener(new ListenersInterface.OnClickListener() { @Override public void onClick(Event event) { Toast.makeText(getContext(), event.getData().get("x"), Toast.LENGTH_SHORT).show(); } }); List<DataEntry> data = new ArrayList<>(); data.add(new ValueDataEntry("hand", hand)); data.add(new ValueDataEntry("in", in)); data.add(new ValueDataEntry("out", out)); pie.data(data); pie.title("Stock Pie Chart"); pie.labels().position("outside"); pie.legend().title().enabled(true); pie.legend().title().text("Description");// .padding(0d, 0d, 10d, 0d); pie.legend() .position("right") .itemsLayout(LegendLayout.VERTICAL_EXPANDABLE) .align(Align.CENTER); anyChartView.setChart(pie); anyChartView.setVisibility(View.VISIBLE); } // private void updateChart() {// data = new ArrayList<>();// int[] color = new int[]{Color.GRAY, Color.CYAN, Color.MAGENTA};// data.add(new PieEntry(hand, "Hand"));// data.add(new PieEntry(in, "Incoming"));// data.add(new PieEntry(out, "Outcome"));// PieDataSet pieDataSet = new PieDataSet(data, "");// pieDataSet.setColors(color);// PieData pieData = new PieData(pieDataSet);// chart.setDrawEntryLabels(false);// chart.setDrawHoleEnabled(false);// chart.setData(pieData);// chart.invalidate();// } private void getTransaction() { firestore.collection("Users").document(auth.getUid()) .collection("Transaksi") .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { int tmpIn =0, tmpOut=0; for (DocumentSnapshot doc : task.getResult()) { String stat = doc.get("status").toString(); if (stat.equals("IN")) { int stk = Integer.valueOf(doc.get("currentStock").toString()); tmpIn += stk; } else { int stk = Integer.valueOf(doc.get("currentStock").toString()); tmpOut += stk; } } in = tmpIn; out = tmpOut; chart(); } else { Log.d(TAG, "Empty data"); } } else { Log.d(TAG, "Connection Failed"); } } }); } private void getBarangStock() { FirebaseAuth auth = FirebaseAuth.getInstance(); firestore.collection("Users").document(auth.getUid()) .collection("Barang").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { int tmp = 0; for (DocumentSnapshot document : task.getResult()) { int stock = Integer.valueOf(document.get("stock").toString()); tmp += stock; } hand = tmp; getTransaction(); } else { Toast.makeText(getContext(), "Data is Empty", Toast.LENGTH_SHORT).show(); } } else { String e = task.getException().getMessage(); Log.d(TAG, e); } } }); } // TODO: Rename method, update argument and hook method into UI event @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
TransactionFragment.java
package com.example.management_stock_app.Fragments; import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import androidx.recyclerview.widget.RecyclerView; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.TextView;import android.widget.Toast; import com.example.management_stock_app.Models.Barang;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.DocumentReference;import com.google.firebase.firestore.DocumentSnapshot;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.QuerySnapshot;import com.google.gson.Gson;import com.google.gson.JsonObject;import com.google.gson.JsonParser;import com.jakewharton.threetenabp.AndroidThreeTen; import org.json.JSONArray;import org.json.JSONObject;import org.threeten.bp.LocalDateTime; import java.lang.annotation.Repeatable;import java.util.ArrayList;import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link TransactionFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class TransactionFragment extends Fragment { private final String TAG = "TRANSACTION_FRAGMENT"; private OnFragmentInteractionListener mListener; private FirebaseAuth auth; private FirebaseFirestore firestore; private Button btnSave, btnChoose, btnCancel; private ImageButton btnInc, btnDec; private EditText code, productName, number; private TextView currentStock; private RadioGroup radioGroup; private AlertDialog.Builder builder; private List<Barang> barangs = new ArrayList<>(); private String[] name; public TransactionFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment AndroidThreeTen.init(getContext()); auth = FirebaseAuth.getInstance(); firestore = FirebaseFirestore.getInstance(); return inflater.inflate(R.layout.fragment_transaction, container, false); } @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); btnInc = view.findViewById(R.id.btn_incr); btnDec = view.findViewById(R.id.btn_decr); btnSave = view.findViewById(R.id.btn_simpan); btnCancel = view.findViewById(R.id.btn_cancel_transaction); btnChoose = view.findViewById(R.id.choose_product); code = view.findViewById(R.id.code_product); productName = view.findViewById(R.id.name_product); number = view.findViewById(R.id.number); currentStock = view.findViewById(R.id.stock_number); radioGroup = view.findViewById(R.id.radioGroup); number.setText("0"); btnInc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int n = Integer.parseInt(number.getText().toString()); number.setText(String.valueOf(n + 1)); } }); btnDec.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int n = Integer.parseInt(number.getText().toString()); if (n > 0) { number.setText(String.valueOf(n - 1)); } } }); btnChoose.setClickable(false); firestore.collection("Users").document(auth.getUid()) .collection("Barang").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { for (DocumentSnapshot doc : task.getResult()) { barangs.add(new Barang( doc.getId(), doc.get("nama").toString(), doc.get("gambar").toString(), Integer.valueOf(doc.get("stock").toString()), Integer.valueOf(doc.get("harga").toString()) )); } name = new String[barangs.size()]; for (int i = 0; i < name.length; i++) { name[i] = barangs.get(i).getNama(); } builder = new AlertDialog.Builder(getContext()); builder.setTitle("Product List"); builder.setItems(name, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Barang barang = barangs.get(which); code.setText(barang.getCode()); productName.setText(barang.getNama()); currentStock.setText(String.valueOf(barang.getStock())); } }); btnChoose.setClickable(true); btnChoose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { builder.show(); } }); } else { Toast.makeText(getContext(), "Cannot Get Data!!!", Toast.LENGTH_SHORT).show(); } } else { Log.d(TAG, task.getException().getMessage()); } } }); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String date = LocalDateTime.now().toString(); String name = productName.getText().toString(); String cd = code.getText().toString(); String changeStock = number.getText().toString(); int selectedId = radioGroup.getCheckedRadioButtonId(); RadioButton radioButton = view.findViewById(selectedId); if (!date.equals("") && !name.equals("") && !cd.equals("") && !(changeStock.equals("0") || changeStock.equals("")) && radioButton != null) { String status = radioButton.getText().toString(); Transaksi transaksi = new Transaksi(cd, name, date,Integer.valueOf(changeStock), status);// System.out.println("Product Name: "+ transaksi.getName() + ", status =" + transaksi.getStatus()+"["+ transaksi.getCurrentStock() +"], Now Stock= "+ curStock); saveTransaksi(transaksi); } else { Toast.makeText(getContext(), "Please Check Your Form!", Toast.LENGTH_SHORT).show(); } } }); } private void saveTransaksi(final Transaksi transaksi) { firestore.collection("Users").document(auth.getUid()).collection("Transaksi") .add(transaksi).addOnCompleteListener(new OnCompleteListener<DocumentReference>() { @Override public void onComplete(@NonNull Task<DocumentReference> task) { if (task.isSuccessful()) { int curStock = Integer.valueOf(currentStock.getText().toString()); if (transaksi.getStatus().equals("IN")) { curStock += transaksi.getCurrentStock(); } else { curStock -= transaksi.getCurrentStock(); } updateBarangStock(transaksi.getId(), curStock); Toast.makeText(getContext(), "Transaction Saved", Toast.LENGTH_SHORT).show(); } else { String message = task.getException().getMessage(); Toast.makeText(getContext(), "Transaction Failed: " + message, Toast.LENGTH_SHORT).show(); } } }); } private void updateBarangStock(String code ,int stock) { firestore.collection("Users").document(auth.getUid()) .collection("Barang").document(code).update("stock", stock) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d(TAG, "Update Barang[Stock] Success: " + task.isSuccessful()); } else { Log.d(TAG, "Failed update Barang[Stock]: " + task.getException().getMessage()); } } }); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
TransactionViewFragment.java
package com.example.management_stock_app.Fragments; import android.annotation.SuppressLint;import android.content.Context;import android.net.Uri;import android.os.Bundle; import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView; import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast; import com.example.management_stock_app.Adapters.TransactionAdapter;import com.example.management_stock_app.Models.Transaksi;import com.example.management_stock_app.R;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.firestore.DocumentSnapshot;import com.google.firebase.firestore.FirebaseFirestore;import com.google.firebase.firestore.Query;import com.google.firebase.firestore.QuerySnapshot; import java.util.ArrayList;import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link TransactionViewFragment.OnFragmentInteractionListener} interface * to handle interaction events. */public class TransactionViewFragment extends Fragment { private final String TAG = "TRANSACTION_VIEW_FRAGMENT"; private OnFragmentInteractionListener mListener; private FirebaseAuth auth; private FirebaseFirestore firestore; private RecyclerView viewTransaksi; private TextView noDataView; private ProgressBar progressBar; private List<Transaksi> list = new ArrayList<>(); private TransactionAdapter adapter; public TransactionViewFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment auth = FirebaseAuth.getInstance(); firestore = FirebaseFirestore.getInstance(); return inflater.inflate(R.layout.fragment_transaction_view, container, false); } @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); viewTransaksi = view.findViewById(R.id.rv_transaction); noDataView = view.findViewById(R.id.text_empty_transaction); progressBar = view.findViewById(R.id.transaction_progress); viewTransaksi.setVisibility(View.GONE); noDataView.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); firestore.collection("Users").document(auth.getUid()) .collection("Transaksi").orderBy("date", Query.Direction.DESCENDING) .limit(10) .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @SuppressLint("LongLogTag") @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { if (!task.getResult().isEmpty()) { for (DocumentSnapshot doc : task.getResult()) { list.add(new Transaksi( doc.get("id").toString(), doc.get("name").toString(), doc.get("date").toString(), Integer.valueOf(doc.get("currentStock").toString()), doc.get("status").toString() )); adapter = new TransactionAdapter(list); viewTransaksi.setAdapter(adapter); viewTransaksi.setLayoutManager(new LinearLayoutManager(getContext())); progressBar.setVisibility(View.GONE); viewTransaksi.setVisibility(View.VISIBLE); } } else { progressBar.setVisibility(View.GONE); noDataView.setVisibility(View.VISIBLE); Toast.makeText(getContext(), "No Transaction", Toast.LENGTH_SHORT).show(); } } else { progressBar.setVisibility(View.GONE); Log.d(TAG, task.getException().getMessage()); } } }); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); }}
Barang.java(Model)
package com.example.management_stock_app.Models; public class Barang { private String code; private String nama; private int stock; private int harga; private String gambar; public Barang() { } public Barang(String code, String nama, String gambar, int stock, int harga) { this.code = code; this.nama = nama; this.stock = stock; this.gambar = gambar; this.harga = harga; } public int getHarga() { return harga; } public String getCode() { return code; } public String getNama() { return nama; } public int getStock() { return stock; } public String getGambar() { return gambar; } public void setCode(String code) { this.code = code; } public void setNama(String nama) { this.nama = nama; } public void setStock(int stock) { this.stock = stock; } public void setHarga(int harga) { this.harga = harga; } public void setGambar(String gambar) { this.gambar = gambar; }}
Data.java(Model)
package com.example.management_stock_app.Models; import java.util.ArrayList;import java.util.List; public class Data { private String name; private String email; private List<Barang> barangList = new ArrayList<>(); private List<Transaksi> transaksiList = new ArrayList<>(); private String tanggal; public Data() { } public Data(String name, String email, List<Barang> barangList, List<Transaksi> transaksiList, String tanggal) { this.name = name; this.email = email; this.barangList = barangList; this.transaksiList = transaksiList; this.tanggal = tanggal; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List<Barang> getBarangList() { return barangList; } public void setBarangList(List<Barang> barangList) { this.barangList = barangList; } public List<Transaksi> getTransaksiList() { return transaksiList; } public void setTransaksiList(List<Transaksi> transaksiList) { this.transaksiList = transaksiList; } public String getTanggal() { return tanggal; } public void setTanggal(String tanggal) { this.tanggal = tanggal; }}
Transaksi.java(Model)
package com.example.management_stock_app.Models; public class Transaksi { private String id; private String name; private String date; private int currentStock; private String status; public Transaksi() { } public Transaksi(String id, String name, String date, int currentStock, String status) { this.id = id; this.name = name; this.date = date; this.currentStock = currentStock; this.status = status; } public String getId() { return id; } public int getCurrentStock() { return currentStock; } public String getDate() { return date; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setDate(String date) { this.date = date; } public void setCurrentStock(int currentStock) { this.currentStock = currentStock; } public void setStatus(String status) { this.status = status; } public String getStatus() { return status; }}
User.java(Model)
package com.example.management_stock_app.Models; import android.os.Parcel;import android.os.Parcelable; public class User implements Parcelable { private String id; private String name; private String email; public User() { } public User(String name, String email) { this.name = name; this.email = email; } public User(String id, String name, String email) { this.id = id; this.name = name; this.email = email; } protected User(Parcel in) { id = in.readString(); name = 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 String getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(id); dest.writeString(name); dest.writeString(email); }}
6. Test Running
Sekian Update Saya Kali Ini Wassallam :)









Tidak ada komentar:
Posting Komentar