Kamis, 09 Januari 2020

TUGAS UAS MOBILE PROGRAMING STMIK ERESHA 06TPLP001

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