From 9223752da4753017b0308e8c32e240e847d5a332 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Fri, 7 Jun 2019 12:00:45 +0545 Subject: [PATCH 01/23] [#1] adds id pass field to db --- .../java/np/com/naxa/staffattendance/TeamRemoteSource.java | 4 ++-- .../com/naxa/staffattendance/database/DatabaseHelper.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/TeamRemoteSource.java b/app/src/main/java/np/com/naxa/staffattendance/TeamRemoteSource.java index e99e7a7..81d4c5b 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/TeamRemoteSource.java +++ b/app/src/main/java/np/com/naxa/staffattendance/TeamRemoteSource.java @@ -157,8 +157,8 @@ public ArrayList call(ArrayList myTeamResponses) teamMemberResposne.setTeamID(myTeamResponse.getId()); teamMemberResposne.setTeamName(myTeamResponse.getName()); - StaffDao.getInstance().saveStaff(teamMemberResposne); - + long status = StaffDao.getInstance().saveStaff(teamMemberResposne); + Timber.d("Staff insert status %s", status); }) .toList()); diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java index 5004799..8af24ff 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java @@ -19,7 +19,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { public static final String LOG = "DatabaseHelper"; // Database Version - public static final int DATABASE_VERSION = 5; + public static final int DATABASE_VERSION = 6; // Database Name public static final String DATABASE_NAME = "staffManager2"; @@ -76,6 +76,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { KEY_STAFF_TEAM_ID + " TEXT," +//todo if team will have more attr than name and id, make new team table KEY_STAFF_TEAM_NAME + " TEXT," + KEY_STAFF_FULL_NAME + " TEXT," + + KEY_ID_PASS + " TEXT," + KEY_STAFF_TYPE + " INTEGER," + KEY_CREATED_BY + " INTEGER," + KEY_CREATED_AT + " DATETIME," + @@ -87,7 +88,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { TABLE_ATTENDANCE + "(" + KEY_ID + " INTEGER ," + - KEY_ID_PASS + "TEXT UNIQUE," + + KEY_ID_PASS + " TEXT," + KEY_STAFFS_IDS + " TEXT," + KEY_ATTENDACE_DATE + " DATETIME PRIMARY KEY, " + KEY_STAFF_TEAM_ID + " TEXT," + @@ -102,7 +103,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { TABLE_NEW_STAFF + "(" + KEY_ID + " INTEGER PRIMARY KEY," + - KEY_ID_PASS + "TEXT UNIQUE," + + KEY_ID_PASS + " TEXT," + KEY_STAFF_DESIGNATION + " INTEGER," + KEY_STAFF_FIRST_NAME + " TEXT," + KEY_STAFF_LAST_NAME + " TEXT," + From 2c429ba7f874e65d74522e89b3b11432b5f22deb Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 08:30:41 +0545 Subject: [PATCH 02/23] [#2] removes butterknife [#3] adds ktx plugin --- app/build.gradle | 9 +- app/src/main/AndroidManifest.xml | 2 + .../AttendanceFormEditActivity.java | 127 ------------------ .../AttedanceDashboardAcitivty.kt | 13 ++ .../newstaff/NewStaffCall.java | 6 - .../layout/activity_dashboard_attedance.xml | 9 ++ .../main/res/layout/grid_item_calendra.xml | 26 ++++ build.gradle | 8 +- gradle.properties | 4 + 9 files changed, 66 insertions(+), 138 deletions(-) delete mode 100644 app/src/main/java/np/com/naxa/staffattendance/AttendanceFormEditActivity.java create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt create mode 100644 app/src/main/res/layout/activity_dashboard_attedance.xml create mode 100644 app/src/main/res/layout/grid_item_calendra.xml diff --git a/app/build.gradle b/app/build.gradle index b107151..980493b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,13 +8,18 @@ buildscript { } } apply plugin: 'com.android.application' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-android' apply plugin: 'io.fabric' repositories { maven { url 'https://maven.fabric.io/public' } + mavenCentral() } + + android { compileSdkVersion 28 defaultConfig { @@ -51,8 +56,6 @@ dependencies { implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:support-vector-drawable:28.0.0' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' - implementation 'com.jakewharton:butterknife:8.8.1' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' @@ -76,5 +79,7 @@ dependencies { implementation('com.crashlytics.sdk.android:crashlytics:2.9.3@aar') { transitive = true; } + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 263144e..2e9e980 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,8 @@ android:name=".attendence.AttendanceViewPagerActivity" /> + + diff --git a/app/src/main/java/np/com/naxa/staffattendance/AttendanceFormEditActivity.java b/app/src/main/java/np/com/naxa/staffattendance/AttendanceFormEditActivity.java deleted file mode 100644 index d30736c..0000000 --- a/app/src/main/java/np/com/naxa/staffattendance/AttendanceFormEditActivity.java +++ /dev/null @@ -1,127 +0,0 @@ -package np.com.naxa.staffattendance; - -import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; -import np.com.naxa.staffattendance.pojo.AttendancePojo; - -public class AttendanceFormEditActivity extends AppCompatActivity { - - private List movieList = new ArrayList<>(); - private AttandanceStaffRecyclerAdapter mAdapter; - - - @BindView(R.id.staff_list_recycler_view) - RecyclerView staffListRecyclerView; - @BindView(R.id.fab_update_staff_attendance) - FloatingActionButton fabUpdateStaffAttendance; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_attendance_form_edit); - ButterKnife.bind(this); - - getAndSetDateToView(); - - initToolbar(); - - initRecyclerView(); - - } - - private void initToolbar() { - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setTitle(getAndSetDateToView()); - setSupportActionBar(toolbar); - final ActionBar actionBar = getSupportActionBar(); - - if (actionBar != null) { -// actionBar.setHomeAsUpIndicator(R.color.colorAccent); - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - public String getAndSetDateToView() { - - final Calendar c = Calendar.getInstance(); - int yy = c.get(Calendar.YEAR); - int mm = c.get(Calendar.MONTH); - int dd = c.get(Calendar.DAY_OF_MONTH); - - // set current date into textview - return (new StringBuilder() - // Month is 0 based, just add 1 - .append(yy).append(" ").append("-").append(mm + 1).append("-") - .append(dd)).toString(); - } - - public void initRecyclerView() { - mAdapter = new AttandanceStaffRecyclerAdapter(movieList); - RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); - staffListRecyclerView.setLayoutManager(mLayoutManager); - staffListRecyclerView.setItemAnimator(new DefaultItemAnimator()); - staffListRecyclerView.setAdapter(mAdapter); - - prepareMovieData(); - } - - - private void prepareMovieData() { - AttendancePojo attendancePOJO = new AttendancePojo("2018-4-1", "1", "Ram", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "2", "Shyam", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "3", "Hari", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "4", "Sumit", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "5", "Samir", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "6", "Nishon", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "7", "Aashis", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "8", "Shree 1", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "9", "Shree 2", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "10", "Madan", "Hari"); - movieList.add(attendancePOJO); - - attendancePOJO = new AttendancePojo("2018-4-1", "11", "Krishna", "Hari"); - movieList.add(attendancePOJO); - - - mAdapter.notifyDataSetChanged(); - } - - - @OnClick(R.id.fab_update_staff_attendance) - public void onViewClicked() { -// Intent intent = new Intent(AttendanceFormEditActivity.this, MainActivity.class); -// startActivity(intent); - } -} diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt new file mode 100644 index 0000000..5c08d79 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt @@ -0,0 +1,13 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import np.com.naxa.staffattendance.R + +class AttedanceDashboardAcitivty : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_dashboard_attedance); + } +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffCall.java b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffCall.java index 9220898..ada7cc0 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffCall.java +++ b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffCall.java @@ -2,25 +2,19 @@ import android.content.Context; -import android.net.Uri; -import android.support.v4.content.FileProvider; import java.io.File; -import np.com.naxa.staffattendance.AttendanceFormEditActivity; import np.com.naxa.staffattendance.application.StaffAttendance; import np.com.naxa.staffattendance.data.APIClient; import np.com.naxa.staffattendance.data.ApiInterface; import np.com.naxa.staffattendance.database.NewStaffDao; import np.com.naxa.staffattendance.database.TeamDao; import np.com.naxa.staffattendance.pojo.NewStaffPojo; -import np.com.naxa.staffattendance.utlils.ToastUtils; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; -import retrofit2.Response; import rx.Observable; -import rx.Scheduler; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; diff --git a/app/src/main/res/layout/activity_dashboard_attedance.xml b/app/src/main/res/layout/activity_dashboard_attedance.xml new file mode 100644 index 0000000..37fbcaf --- /dev/null +++ b/app/src/main/res/layout/activity_dashboard_attedance.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_calendra.xml b/app/src/main/res/layout/grid_item_calendra.xml new file mode 100644 index 0000000..99662e4 --- /dev/null +++ b/app/src/main/res/layout/grid_item_calendra.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 27ef210..94fdc3e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,16 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - + ext.kotlin_version = '1.3.40' + repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' - + classpath 'com.android.tools.build:gradle:3.4.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle.properties b/gradle.properties index 3530b01..e96a96d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,7 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +android.useAndroidX=false +# Jetifier will convert support libraries of all your dependencies to AndroidX automatically, +# if you don't set it true then your project will have both support +android.enableJetifier=false \ No newline at end of file From e9d777ce89bd042997d32f0c31f2589d982f8f57 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 14:01:31 +0545 Subject: [PATCH 03/23] Adds calendra list --- app/src/main/AndroidManifest.xml | 4 +- .../AttandanceStaffRecyclerAdapter.java | 55 ----------- .../AttedanceDashboardAcitivty.kt | 13 --- .../attedancedashboard/AttendanceDay.kt | 3 + .../AttendancesDashboardActivity.kt | 41 ++++++++ .../BaseRecyclerViewAdapter.java | 54 +++++++++++ .../attedancedashboard/CalendraVH.kt | 33 +++++++ .../ItemOffsetDecoration.kt | 19 ++++ .../attedancedashboard/ListAdapter.kt | 28 ++++++ .../attedancedashboard/base/BaseViewHolder.kt | 9 ++ .../staffattendance/utlils/DateConvertor.java | 69 ++++++++++++++ app/src/main/res/drawable/ic_add_24dp.xml | 9 ++ .../main/res/drawable/toolbar_gradient.xml | 2 +- .../layout/activity_dashboard_attedance.xml | 38 +++++++- app/src/main/res/layout/flexible_toolbar.xml | 4 +- app/src/main/res/layout/grid_item_add.xml | 81 ++++++++++++++++ .../main/res/layout/grid_item_calendra.xml | 93 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 18 files changed, 463 insertions(+), 93 deletions(-) delete mode 100644 app/src/main/java/np/com/naxa/staffattendance/AttandanceStaffRecyclerAdapter.java delete mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/BaseRecyclerViewAdapter.java create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ItemOffsetDecoration.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt create mode 100644 app/src/main/res/drawable/ic_add_24dp.xml create mode 100644 app/src/main/res/layout/grid_item_add.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e9e980..2fa3ec8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,7 +28,9 @@ android:name=".attendence.AttendanceViewPagerActivity" /> - + { - - private List staffList; - - public class MyViewHolder extends RecyclerView.ViewHolder { - CheckBox staffName ; - - public MyViewHolder(View view) { - super(view); - staffName = (CheckBox) view.findViewById(R.id.staff_recycler_list_item_check_box); - } - } - - - public AttandanceStaffRecyclerAdapter(List staffList) { - this.staffList = staffList; - } - - @Override - public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recyclerview_staff_list_item, parent, false); - - return new MyViewHolder(itemView); - } - - - - @Override - public void onBindViewHolder(MyViewHolder holder, int position) { - AttendancePojo attendancePOJO = staffList.get(position); - holder.staffName.setText(attendancePOJO.getStaffName()); - } - - @Override - public int getItemCount() { - return staffList.size(); - } -} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt deleted file mode 100644 index 5c08d79..0000000 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceDashboardAcitivty.kt +++ /dev/null @@ -1,13 +0,0 @@ -package np.com.naxa.staffattendance.attedancedashboard - -import android.os.Bundle -import android.support.v7.app.AppCompatActivity -import np.com.naxa.staffattendance.R - -class AttedanceDashboardAcitivty : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_dashboard_attedance); - } -} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt new file mode 100644 index 0000000..d389517 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt @@ -0,0 +1,3 @@ +package np.com.naxa.staffattendance.attedancedashboard + +data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String,val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String) \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt new file mode 100644 index 0000000..880fb32 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -0,0 +1,41 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.DefaultItemAnimator +import android.support.v7.widget.GridLayoutManager +import android.support.v7.widget.LinearLayoutManager +import kotlinx.android.synthetic.main.activity_dashboard_attedance.* +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.utlils.DateConvertor + +class AttendancesDashboardActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + var list = arrayListOf() + setContentView(R.layout.activity_dashboard_attedance); + for (x in -6 until 0 step 1) { + var date = DateConvertor.getPastDate(x) + var yearMonthDay = DateConvertor.getYearMonthDay(date); + list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], dayOfMonth = yearMonthDay[1],date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "")) + } + + + + setupListAdapter(list); + } + + private fun setupListAdapter(days: List) { + + val manager = LinearLayoutManager(this) + recycler_view.setLayoutManager(manager) + recycler_view.setItemAnimator(DefaultItemAnimator()) + recycler_view.apply { + layoutManager = GridLayoutManager(this@AttendancesDashboardActivity, 2) + adapter = ListAdapter(days) + } + recycler_view.addItemDecoration(ItemOffsetDecoration(this,R.dimen.spacing_small)) + + } +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/BaseRecyclerViewAdapter.java b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/BaseRecyclerViewAdapter.java new file mode 100644 index 0000000..97a55da --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/BaseRecyclerViewAdapter.java @@ -0,0 +1,54 @@ +package np.com.naxa.staffattendance.attedancedashboard; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +import np.com.naxa.staffattendance.application.StaffAttendance; +import timber.log.Timber; + + +//import com.rillmark.royalworldcup.MainApplication; + +public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter { + private List l; + private int layout; + + protected BaseRecyclerViewAdapter(List l, int layout) { + this.l = l; + this.layout = layout; + Timber.d("listSize = %s", l.size()); + } + + @NonNull + @Override + public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(StaffAttendance.getStaffAttendance()).inflate(layout, parent, false); + return attachViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull VH holder, int position) { + viewBinded(holder, l.get(position)); + } + + public List getData() { + return this.l; + } + + @Override + public int getItemCount() { + return l.size(); + } + + public abstract void viewBinded(VH vh, L l); + + public abstract VH attachViewHolder(View view); + + + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt new file mode 100644 index 0000000..be67bed --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt @@ -0,0 +1,33 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import np.com.naxa.staffattendance.R + + + +class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : + RecyclerView.ViewHolder(inflater.inflate(R.layout.grid_item_calendra, parent, false)) { + private var tvDay: TextView? = null + private var tvDate: TextView? = null + private var tvMonthYear: TextView? = null + + + init { + tvDay = itemView.findViewById(R.id.tv_day) + tvDate = itemView.findViewById(R.id.tv_date) + tvMonthYear = itemView.findViewById(R.id.tv_month_year) + } + + fun bind(day: AttendanceDay) { + tvDay?.text = day.dayOfWeek + tvDate?.text = day.dayOfMonth + tvMonthYear?.text = day.date + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ItemOffsetDecoration.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ItemOffsetDecoration.kt new file mode 100644 index 0000000..2f891af --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ItemOffsetDecoration.kt @@ -0,0 +1,19 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.content.Context +import android.graphics.Rect +import android.support.annotation.DimenRes +import android.support.v7.widget.RecyclerView +import android.view.View + + +class ItemOffsetDecoration(private val mItemOffset: Int) : RecyclerView.ItemDecoration() { + + constructor(context: Context, @DimenRes itemOffsetId: Int) : this(context.getResources().getDimensionPixelSize(itemOffsetId)) {} + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, + state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset) + } +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt new file mode 100644 index 0000000..6847d38 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt @@ -0,0 +1,28 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup + +class ListAdapter(private val list: List) + : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CalendarVH { + val inflater = LayoutInflater.from(parent.context) + + return CalendarVH(inflater, parent) + } + + override fun onBindViewHolder(holder: CalendarVH, position: Int) { + val movie: AttendanceDay = list[position] + holder.bind(movie) + } + + + override fun getItemViewType(position: Int): Int { + return position; + } + + override fun getItemCount(): Int = list.size +} + diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt new file mode 100644 index 0000000..4c04581 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt @@ -0,0 +1,9 @@ +package np.com.naxa.staffattendance.attedancedashboard.base + +import android.support.v7.widget.RecyclerView +import android.view.View + +abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + abstract fun bind(item: T) +} + diff --git a/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java b/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java index 76eef2d..911daf4 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java +++ b/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java @@ -1,19 +1,42 @@ package np.com.naxa.staffattendance.utlils; +import android.annotation.SuppressLint; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.Locale; +import java.util.TimeZone; public class DateConvertor { + @SuppressLint("UseSparseArrays") + private static HashMap month = new HashMap<>(); + public static String getCurrentDate() { Date cDate = new Date(); return formatDate(cDate); } + + static { + month.put(0, "January"); + month.put(1, "February"); + month.put(2, "March"); + month.put(3, "April"); + month.put(4, "May"); + month.put(5, "June"); + month.put(6, "July"); + month.put(7, "August"); + month.put(8, "September"); + month.put(9, "October"); + month.put(10, "November"); + month.put(11, "December"); + } + public static String formatDate(Date date) { return new SimpleDateFormat("yyyy-MM-dd", Locale.US).format(date); } @@ -48,4 +71,50 @@ public static Date getPastDate(int days) { Date pastDate = cal.getTime(); return pastDate; } + + public static String[] getYearMonthDay(Date date) { + + Calendar cal = Calendar.getInstance(TimeZone.getDefault()); + cal.setTime(date); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH); + int day = cal.get(Calendar.DAY_OF_MONTH); + + return new String[]{ + getDayOfMonth(month) + ", " + year, String.valueOf(day), getDayOfWeek(cal.get(Calendar.DAY_OF_WEEK)) + }; + } + + + private static String getDayOfMonth(int value) { + return month.get(value); + } + + private static String getDayOfWeek(int value) { + String day = ""; + switch (value) { + case 1: + day = "Sunday"; + break; + case 2: + day = "Monday"; + break; + case 3: + day = "Tuesday"; + break; + case 4: + day = "Wednesday"; + break; + case 5: + day = "Thursday"; + break; + case 6: + day = "Friday"; + break; + case 7: + day = "Saturday"; + break; + } + return day; + } } diff --git a/app/src/main/res/drawable/ic_add_24dp.xml b/app/src/main/res/drawable/ic_add_24dp.xml new file mode 100644 index 0000000..0258249 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/toolbar_gradient.xml b/app/src/main/res/drawable/toolbar_gradient.xml index 7ae76f6..cc24ab9 100644 --- a/app/src/main/res/drawable/toolbar_gradient.xml +++ b/app/src/main/res/drawable/toolbar_gradient.xml @@ -2,7 +2,7 @@ android:shape="rectangle"> diff --git a/app/src/main/res/layout/activity_dashboard_attedance.xml b/app/src/main/res/layout/activity_dashboard_attedance.xml index 37fbcaf..cc86ea6 100644 --- a/app/src/main/res/layout/activity_dashboard_attedance.xml +++ b/app/src/main/res/layout/activity_dashboard_attedance.xml @@ -1,9 +1,43 @@ - + + - \ No newline at end of file + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/flexible_toolbar.xml b/app/src/main/res/layout/flexible_toolbar.xml index 3800dc5..2233d50 100644 --- a/app/src/main/res/layout/flexible_toolbar.xml +++ b/app/src/main/res/layout/flexible_toolbar.xml @@ -9,7 +9,7 @@ + /> \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_add.xml b/app/src/main/res/layout/grid_item_add.xml new file mode 100644 index 0000000..8909e49 --- /dev/null +++ b/app/src/main/res/layout/grid_item_add.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/grid_item_calendra.xml b/app/src/main/res/layout/grid_item_calendra.xml index 99662e4..e1bb622 100644 --- a/app/src/main/res/layout/grid_item_calendra.xml +++ b/app/src/main/res/layout/grid_item_calendra.xml @@ -1,26 +1,81 @@ - + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:cardCornerRadius="20dp" + app:cardElevation="0dp"> + + + + + + + + + + + + + + + - + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_toEndOf="@id/center" + android:layout_toRightOf="@id/center" + android:text="11 Present" + android:textColor="@color/green" /> + - \ No newline at end of file + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b54fadb..bd0de61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ Vibrate Device is offline + Dashboard From d67dd336caecabf31d0c368c9122f885203f0e22 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 14:33:07 +0545 Subject: [PATCH 04/23] [#5] adds multi view for dashboad list --- .../attedancedashboard/AddItemButton.kt | 5 ++ .../attedancedashboard/AttendanceDay.kt | 4 +- .../AttendancesDashboardActivity.kt | 5 +- .../attedancedashboard/ListAdapter.kt | 49 +++++++++++--- .../attedancedashboard/base/AddItemVH.kt | 23 +++++++ .../base/{BaseViewHolder.kt => base.kt} | 6 +- app/src/main/res/drawable/border.xml | 5 ++ app/src/main/res/drawable/ic_add_24dp.xml | 2 +- app/src/main/res/layout/grid_item_add.xml | 66 ++----------------- 9 files changed, 90 insertions(+), 75 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AddItemButton.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt rename app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/{BaseViewHolder.kt => base.kt} (52%) create mode 100644 app/src/main/res/drawable/border.xml diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AddItemButton.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AddItemButton.kt new file mode 100644 index 0000000..9e77972 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AddItemButton.kt @@ -0,0 +1,5 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import np.com.naxa.staffattendance.attedancedashboard.base.IRow + +data class AddItemButton(val uuid: String) : IRow diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt index d389517..76b93cb 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt @@ -1,3 +1,5 @@ package np.com.naxa.staffattendance.attedancedashboard -data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String,val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String) \ No newline at end of file +import np.com.naxa.staffattendance.attedancedashboard.base.IRow + +data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String,val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String) : IRow \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 880fb32..5556f27 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -13,8 +13,9 @@ class AttendancesDashboardActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - var list = arrayListOf() + var list = arrayListOf() setContentView(R.layout.activity_dashboard_attedance); + list.add(AddItemButton("add_attedance")) for (x in -6 until 0 step 1) { var date = DateConvertor.getPastDate(x) var yearMonthDay = DateConvertor.getYearMonthDay(date); @@ -26,7 +27,7 @@ class AttendancesDashboardActivity : AppCompatActivity() { setupListAdapter(list); } - private fun setupListAdapter(days: List) { + private fun setupListAdapter(days: List) { val manager = LinearLayoutManager(this) recycler_view.setLayoutManager(manager) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt index 6847d38..6fe25e2 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt @@ -3,26 +3,59 @@ package np.com.naxa.staffattendance.attedancedashboard import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup +import np.com.naxa.staffattendance.attedancedashboard.base.AddItemVH +import np.com.naxa.staffattendance.utlils.ToastUtils -class ListAdapter(private val list: List) - : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CalendarVH { +class ListAdapter(private val list: List) + : RecyclerView.Adapter() { + + private val TYPE_CONTENT = 0; + private val TYPE_ADD_CONTENT = 1; + + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder.itemViewType) { + TYPE_ADD_CONTENT -> onBindAddItem(holder as AddItemVH, list[position] as AddItemButton) + TYPE_CONTENT -> onBindContent(holder as CalendarVH, list[position] as AttendanceDay) + else -> throw IllegalArgumentException() + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) + when(viewType){ + TYPE_ADD_CONTENT -> return AddItemVH(inflater,parent) + TYPE_CONTENT -> return CalendarVH(inflater,parent) + else -> throw IllegalArgumentException() + } - return CalendarVH(inflater, parent) } - override fun onBindViewHolder(holder: CalendarVH, position: Int) { - val movie: AttendanceDay = list[position] - holder.bind(movie) + + private fun onBindAddItem(holder: AddItemVH, row: AddItemButton) { + holder.itemView.setOnClickListener { + + } } + private fun onBindContent(holder: CalendarVH, row: AttendanceDay) { + holder.bind(row); + } override fun getItemViewType(position: Int): Int { - return position; + return when (list[position]) { + is AttendanceDay -> TYPE_CONTENT + is AddItemButton -> TYPE_ADD_CONTENT + else -> throw IllegalArgumentException() + } } override fun getItemCount(): Int = list.size } + + + + diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt new file mode 100644 index 0000000..d42a52f --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt @@ -0,0 +1,23 @@ +package np.com.naxa.staffattendance.attedancedashboard.base + + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.TextView +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.attedancedashboard.AddItemButton +import np.com.naxa.staffattendance.attedancedashboard.AttendanceDay + + +class AddItemVH(inflater: LayoutInflater, parent: ViewGroup) : + RecyclerView.ViewHolder(inflater.inflate(R.layout.grid_item_add, parent, false)) { + + + fun bind(day: AddItemButton) { + + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/base.kt similarity index 52% rename from app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt rename to app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/base.kt index 4c04581..a84baa7 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/BaseViewHolder.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/base.kt @@ -2,8 +2,8 @@ package np.com.naxa.staffattendance.attedancedashboard.base import android.support.v7.widget.RecyclerView import android.view.View +import android.widget.TextView +import np.com.naxa.staffattendance.R -abstract class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - abstract fun bind(item: T) -} +interface IRow diff --git a/app/src/main/res/drawable/border.xml b/app/src/main/res/drawable/border.xml new file mode 100644 index 0000000..a347198 --- /dev/null +++ b/app/src/main/res/drawable/border.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_24dp.xml b/app/src/main/res/drawable/ic_add_24dp.xml index 0258249..d669972 100644 --- a/app/src/main/res/drawable/ic_add_24dp.xml +++ b/app/src/main/res/drawable/ic_add_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/layout/grid_item_add.xml b/app/src/main/res/layout/grid_item_add.xml index 8909e49..9eb5cdf 100644 --- a/app/src/main/res/layout/grid_item_add.xml +++ b/app/src/main/res/layout/grid_item_add.xml @@ -4,78 +4,24 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@drawable/border" app:cardCornerRadius="20dp" - app:cardElevation="0dp"> + app:cardElevation="1dp"> - - - - - - - - - - - - - - From 3e2ef262dcb1408f8d680b26aff16efa302ca8b8 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 14:47:00 +0545 Subject: [PATCH 05/23] [#5] adds header --- .../AttendancesDashboardActivity.kt | 2 ++ .../attedancedashboard/HeaderVH.kt | 24 +++++++++++++++++++ .../attedancedashboard/ListAdapter.kt | 19 +++++++++++---- app/src/main/res/layout/header.xml | 16 +++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/HeaderVH.kt create mode 100644 app/src/main/res/layout/header.xml diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 5556f27..4ed7520 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -15,6 +15,8 @@ class AttendancesDashboardActivity : AppCompatActivity() { super.onCreate(savedInstanceState) var list = arrayListOf() setContentView(R.layout.activity_dashboard_attedance); + list.add("Attendance") + list.add("") list.add(AddItemButton("add_attedance")) for (x in -6 until 0 step 1) { var date = DateConvertor.getPastDate(x) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/HeaderVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/HeaderVH.kt new file mode 100644 index 0000000..c93f699 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/HeaderVH.kt @@ -0,0 +1,24 @@ +package np.com.naxa.staffattendance.attedancedashboard + + + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.TextView +import np.com.naxa.staffattendance.R + + +class HeaderVH(inflater: LayoutInflater, parent: ViewGroup) : + RecyclerView.ViewHolder(inflater.inflate(R.layout.header, parent, false)) { + private var tvHeaderTitle: TextView? = null + + init { + tvHeaderTitle = itemView.findViewById(R.id.tv_header_title) + } + + fun bind(title: String) { + tvHeaderTitle?.text = title + } + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt index 6fe25e2..ac04741 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt @@ -12,22 +12,31 @@ class ListAdapter(private val list: List) private val TYPE_CONTENT = 0; private val TYPE_ADD_CONTENT = 1; + private val TYPE_HEADER = 2; override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder.itemViewType) { TYPE_ADD_CONTENT -> onBindAddItem(holder as AddItemVH, list[position] as AddItemButton) TYPE_CONTENT -> onBindContent(holder as CalendarVH, list[position] as AttendanceDay) - else -> throw IllegalArgumentException() + TYPE_HEADER -> onBindHeader(holder as HeaderVH, list[position] as String) + + else -> throw IllegalArgumentException() } } + private fun onBindHeader(headerVH: HeaderVH, s: String) { + headerVH.bind(s); + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - when(viewType){ - TYPE_ADD_CONTENT -> return AddItemVH(inflater,parent) - TYPE_CONTENT -> return CalendarVH(inflater,parent) + when (viewType) { + TYPE_ADD_CONTENT -> return AddItemVH(inflater, parent) + TYPE_CONTENT -> return CalendarVH(inflater, parent) + TYPE_HEADER -> return HeaderVH(inflater, parent) else -> throw IllegalArgumentException() } @@ -48,6 +57,8 @@ class ListAdapter(private val list: List) return when (list[position]) { is AttendanceDay -> TYPE_CONTENT is AddItemButton -> TYPE_ADD_CONTENT + is String -> TYPE_HEADER + else -> throw IllegalArgumentException() } } diff --git a/app/src/main/res/layout/header.xml b/app/src/main/res/layout/header.xml new file mode 100644 index 0000000..c08bfd1 --- /dev/null +++ b/app/src/main/res/layout/header.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file From 92302d63c865c7c57caaef15a63d1171ffdf31e7 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 15:02:01 +0545 Subject: [PATCH 06/23] [#5] adds members card --- .../AttendancesDashboardActivity.kt | 17 +++++-- .../attedancedashboard/ListAdapter.kt | 8 +++ .../attedancedashboard/TeamStats.kt | 3 ++ .../attedancedashboard/TeamStatsVH.kt | 30 +++++++++++ app/src/main/res/layout/grid_item_stats.xml | 50 +++++++++++++++++++ 5 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStats.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStatsVH.kt create mode 100644 app/src/main/res/layout/grid_item_stats.xml diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 4ed7520..5442826 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -15,13 +15,22 @@ class AttendancesDashboardActivity : AppCompatActivity() { super.onCreate(savedInstanceState) var list = arrayListOf() setContentView(R.layout.activity_dashboard_attedance); + + list.add("Team") + list.add("") + + list.add(AddItemButton("add_team_member")) + list.add(TeamStats("FieldSight", "16")) + + + list.add("Attendance") list.add("") list.add(AddItemButton("add_attedance")) for (x in -6 until 0 step 1) { - var date = DateConvertor.getPastDate(x) - var yearMonthDay = DateConvertor.getYearMonthDay(date); - list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], dayOfMonth = yearMonthDay[1],date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "")) + val date = DateConvertor.getPastDate(x) + val yearMonthDay = DateConvertor.getYearMonthDay(date); + list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], dayOfMonth = yearMonthDay[1], date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "")) } @@ -38,7 +47,7 @@ class AttendancesDashboardActivity : AppCompatActivity() { layoutManager = GridLayoutManager(this@AttendancesDashboardActivity, 2) adapter = ListAdapter(days) } - recycler_view.addItemDecoration(ItemOffsetDecoration(this,R.dimen.spacing_small)) + recycler_view.addItemDecoration(ItemOffsetDecoration(this, R.dimen.spacing_small)) } } \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt index ac04741..ef97901 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt @@ -13,6 +13,7 @@ class ListAdapter(private val list: List) private val TYPE_CONTENT = 0; private val TYPE_ADD_CONTENT = 1; private val TYPE_HEADER = 2; + private val TYPE_STATS = 3; override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { @@ -20,11 +21,16 @@ class ListAdapter(private val list: List) TYPE_ADD_CONTENT -> onBindAddItem(holder as AddItemVH, list[position] as AddItemButton) TYPE_CONTENT -> onBindContent(holder as CalendarVH, list[position] as AttendanceDay) TYPE_HEADER -> onBindHeader(holder as HeaderVH, list[position] as String) + TYPE_STATS -> onBindTeamStats(holder as TeamStatsVH, list[position] as TeamStats) else -> throw IllegalArgumentException() } } + private fun onBindTeamStats(teamStatsVH: TeamStatsVH, teamStats: TeamStats) { + teamStatsVH.bind(teamStats) + } + private fun onBindHeader(headerVH: HeaderVH, s: String) { headerVH.bind(s); @@ -37,6 +43,7 @@ class ListAdapter(private val list: List) TYPE_ADD_CONTENT -> return AddItemVH(inflater, parent) TYPE_CONTENT -> return CalendarVH(inflater, parent) TYPE_HEADER -> return HeaderVH(inflater, parent) + TYPE_STATS -> return TeamStatsVH(inflater, parent) else -> throw IllegalArgumentException() } @@ -58,6 +65,7 @@ class ListAdapter(private val list: List) is AttendanceDay -> TYPE_CONTENT is AddItemButton -> TYPE_ADD_CONTENT is String -> TYPE_HEADER + is TeamStats -> TYPE_STATS else -> throw IllegalArgumentException() } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStats.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStats.kt new file mode 100644 index 0000000..dd03e0d --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStats.kt @@ -0,0 +1,3 @@ +package np.com.naxa.staffattendance.attedancedashboard + +data class TeamStats(val teamName: String, val teamMembersCount: String) \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStatsVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStatsVH.kt new file mode 100644 index 0000000..b7933ef --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/TeamStatsVH.kt @@ -0,0 +1,30 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import np.com.naxa.staffattendance.R + + +class TeamStatsVH(inflater: LayoutInflater, parent: ViewGroup) : + RecyclerView.ViewHolder(inflater.inflate(R.layout.grid_item_stats, parent, false)) { + + private var tvTeamName: TextView? = null + private var tvTeamMemberCount: TextView? = null + + + init { + tvTeamName = itemView.findViewById(R.id.tv_team_name) + tvTeamMemberCount = itemView.findViewById(R.id.tv_members_count) + + } + + fun bind(day: TeamStats) { + tvTeamName?.text = day.teamName + tvTeamMemberCount?.text = day.teamMembersCount + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_stats.xml b/app/src/main/res/layout/grid_item_stats.xml new file mode 100644 index 0000000..b21b80f --- /dev/null +++ b/app/src/main/res/layout/grid_item_stats.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + From 4f2f416df0f2eb4fd4ba0dbe5d99d78338e49e98 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 19:47:11 +0545 Subject: [PATCH 07/23] [#5] adds splash screen --- app/build.gradle | 3 - app/src/main/AndroidManifest.xml | 18 ++-- .../AttendancesDashboardActivity.kt | 21 +++-- .../attedancedashboard/CalendraVH.kt | 17 ++++ .../splash/SplashScreenActivity.kt | 79 ++++++++++++++++++ app/src/main/res/drawable/logo.png | Bin 0 -> 7429 bytes .../res/layout/activity_splash_screen2.xml | 31 +++++++ .../main/res/layout/grid_item_calendra.xml | 24 +++--- app/src/main/res/layout/grid_item_stats.xml | 4 +- app/src/main/res/values/strings.xml | 1 + 10 files changed, 169 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt create mode 100644 app/src/main/res/drawable/logo.png create mode 100644 app/src/main/res/layout/activity_splash_screen2.xml diff --git a/app/build.gradle b/app/build.gradle index 980493b..b78eeec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,6 @@ repositories { } - - android { compileSdkVersion 28 defaultConfig { @@ -82,4 +80,3 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2fa3ec8..0ae7366 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,9 +12,8 @@ android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> - + + @@ -22,15 +21,16 @@ + android:name=".login.LoginActivity" + android:exported="true"> + android:name=".newstaff.NewStaffActivity" + android:windowSoftInputMode="adjustResize" /> + + android:name=".attedancedashboard.AttendancesDashboardActivity" + android:exported="true" /> () + val list = arrayListOf() setContentView(R.layout.activity_dashboard_attedance); list.add("Team") list.add("") - list.add(AddItemButton("add_team_member")) - list.add(TeamStats("FieldSight", "16")) + list.add(TeamStats("FieldSight", "16")) + list.add(AddItemButton("add_team_member")) list.add("Attendance") list.add("") - list.add(AddItemButton("add_attedance")) - for (x in -6 until 0 step 1) { + + for (x in -6 until 1 step 1) { val date = DateConvertor.getPastDate(x) val yearMonthDay = DateConvertor.getYearMonthDay(date); list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], dayOfMonth = yearMonthDay[1], date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "")) @@ -50,4 +52,13 @@ class AttendancesDashboardActivity : AppCompatActivity() { recycler_view.addItemDecoration(ItemOffsetDecoration(this, R.dimen.spacing_small)) } + + companion object { + + fun newIntent(context: Context): Intent { + val intent = Intent(context, AttendancesDashboardActivity::class.java) + + return intent + } + } } \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt index be67bed..84e20fb 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt @@ -14,20 +14,37 @@ class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : private var tvDay: TextView? = null private var tvDate: TextView? = null private var tvMonthYear: TextView? = null + private var tvAbsentMessage: TextView? = null + private var tvPresentMessage: TextView? = null init { tvDay = itemView.findViewById(R.id.tv_day) tvDate = itemView.findViewById(R.id.tv_date) tvMonthYear = itemView.findViewById(R.id.tv_month_year) + tvAbsentMessage = itemView.findViewById(R.id.tv_absent_message) + tvPresentMessage = itemView.findViewById(R.id.tv_present_message) } fun bind(day: AttendanceDay) { tvDay?.text = day.dayOfWeek tvDate?.text = day.dayOfMonth tvMonthYear?.text = day.date +// } + fun setAbsentPresentMessage(day: AttendanceDay){ + if(isNullOrEmpty(day.absentNoOfStaff)){ + + } + } + + + fun isNullOrEmpty(str: String?): Boolean { + if (str != null && !str.isEmpty()) + return false + return true + } } \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt new file mode 100644 index 0000000..80e2e1d --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt @@ -0,0 +1,79 @@ +package np.com.naxa.staffattendance.splash + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.support.v7.app.AppCompatActivity +import android.transition.Fade +import android.view.View +import android.view.Window +import android.view.WindowManager +import kotlinx.android.synthetic.main.activity_splash_screen2.* +import np.com.naxa.staffattendance.attedancedashboard.AttendancesDashboardActivity +import np.com.naxa.staffattendance.attendence.AttendanceViewPagerActivity +import np.com.naxa.staffattendance.data.TokenMananger +import np.com.naxa.staffattendance.login.LoginActivity + + +class SplashScreenActivity : AppCompatActivity() { + + + private var hanlder = Handler(); + private var runnable = Runnable { + startActivity(AttendancesDashboardActivity.newIntent(this)) + + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + makeActivityFullScreen() + with(window) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) + exitTransition = Fade() + } + } + + setContentView(np.com.naxa.staffattendance.R.layout.activity_splash_screen2) + crossfade(); + + } + + private fun crossfade() { + + + splash_logo.alpha = 1f + splash_logo.visibility = View.VISIBLE + splash_logo.animate() + .alpha(0f) + .setStartDelay(2000L) + .setDuration(1000L) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + + if (TokenMananger.doesTokenExist()) { + startActivity(AttendancesDashboardActivity.newIntent(this@SplashScreenActivity)) + }else{ + LoginActivity.start(this@SplashScreenActivity); + } + overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out); + + } + }) + } + + + override fun onPause() { + super.onPause() + hanlder.removeCallbacks(runnable); + } + + private fun makeActivityFullScreen() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN) + } + +} diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f80218fb7169278c48cbb3c1e6c5536138e44b GIT binary patch literal 7429 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_splash_screen2.xml b/app/src/main/res/layout/activity_splash_screen2.xml new file mode 100644 index 0000000..d01fab0 --- /dev/null +++ b/app/src/main/res/layout/activity_splash_screen2.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_calendra.xml b/app/src/main/res/layout/grid_item_calendra.xml index e1bb622..bbd4d88 100644 --- a/app/src/main/res/layout/grid_item_calendra.xml +++ b/app/src/main/res/layout/grid_item_calendra.xml @@ -44,36 +44,40 @@ android:layout_height="wrap_content" android:orientation="horizontal"> + + + android:text="11 Present" + android:textColor="@color/green" /> - + android:text="1 Absent" + android:textColor="@color/red" /> + + diff --git a/app/src/main/res/layout/grid_item_stats.xml b/app/src/main/res/layout/grid_item_stats.xml index b21b80f..e5a8e18 100644 --- a/app/src/main/res/layout/grid_item_stats.xml +++ b/app/src/main/res/layout/grid_item_stats.xml @@ -15,7 +15,7 @@ Vibrate Device is offline Dashboard + Members From 630acf4409a77167c71ca2eeed196fc6d1ce939a Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 20:50:53 +0545 Subject: [PATCH 08/23] Adds back press --- .../AttendancesDashboardActivity.kt | 37 ++++++++++++++++++- .../staffattendance/login/LoginActivity.java | 9 ++--- .../splash/SplashScreenActivity.kt | 1 + .../main/res/drawable/ic_settings_24dp.xml | 5 +++ .../layout/activity_dashboard_attedance.xml | 3 ++ .../main/res/layout/activity_login_page.xml | 27 ++++++++------ app/src/main/res/menu/menu_dashboard.xml | 12 ++++++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 app/src/main/res/drawable/ic_settings_24dp.xml create mode 100644 app/src/main/res/menu/menu_dashboard.xml diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 6f3f3ae..bf2cde4 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -3,16 +3,25 @@ package np.com.naxa.staffattendance.attedancedashboard import android.content.Context import android.content.Intent import android.os.Bundle +import android.os.Handler import android.support.v7.app.AppCompatActivity import android.support.v7.widget.DefaultItemAnimator import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.LinearLayoutManager +import android.view.Menu +import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R import np.com.naxa.staffattendance.utlils.DateConvertor +import np.com.naxa.staffattendance.utlils.ToastUtils +import java.util.concurrent.TimeUnit class AttendancesDashboardActivity : AppCompatActivity() { + private var exitOnBackPress: Boolean = false; + private val backPressHandler = Handler() + private val runnable = { exitOnBackPress = false } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val list = arrayListOf() @@ -36,10 +45,36 @@ class AttendancesDashboardActivity : AppCompatActivity() { } - + setSupportActionBar(toolbar); + supportActionBar?.setTitle("") setupListAdapter(list); } + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.menu_dashboard,menu); + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when(item?.itemId){ + R.id.main_dashboard_setting -> { + + } + } + return super.onOptionsItemSelected(item) + } + + + override fun onBackPressed() { + if (exitOnBackPress) { + finish() + return + } + + exitOnBackPress = true + ToastUtils.showShort(getString(R.string.msg_backpress_to_exit)) + backPressHandler.postDelayed(runnable, TimeUnit.SECONDS.toMillis(2)) + } private fun setupListAdapter(days: List) { val manager = LinearLayoutManager(this) diff --git a/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java b/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java index 9d5959e..d2d8151 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java +++ b/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java @@ -21,6 +21,7 @@ import np.com.naxa.staffattendance.FormCall; import np.com.naxa.staffattendance.R; import np.com.naxa.staffattendance.SharedPreferenceUtils; +import np.com.naxa.staffattendance.attedancedashboard.AttendancesDashboardActivity; import np.com.naxa.staffattendance.attendence.AttendanceViewPagerActivity; import np.com.naxa.staffattendance.attendence.MyTeamRepository; import np.com.naxa.staffattendance.data.APIClient; @@ -52,7 +53,6 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_page); - getWindow().setBackgroundDrawableResource(R.drawable.login_background); if (TokenMananger.doesTokenExist()) { AttendanceViewPagerActivity.start(this, false); finish(); @@ -218,11 +218,8 @@ private void fetchMyTeam() { @Override public void onCompleted() { dialog.dismiss(); - - AttendanceViewPagerActivity.start(LoginActivity.this, false); - finish(); - - + Intent intent = AttendancesDashboardActivity.Companion.newIntent(LoginActivity.this); + startActivity(intent); } @Override diff --git a/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt index 80e2e1d..be1d96b 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt @@ -59,6 +59,7 @@ class SplashScreenActivity : AppCompatActivity() { LoginActivity.start(this@SplashScreenActivity); } overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out); + finish() } }) diff --git a/app/src/main/res/drawable/ic_settings_24dp.xml b/app/src/main/res/drawable/ic_settings_24dp.xml new file mode 100644 index 0000000..1397d37 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_dashboard_attedance.xml b/app/src/main/res/layout/activity_dashboard_attedance.xml index cc86ea6..7270b2c 100644 --- a/app/src/main/res/layout/activity_dashboard_attedance.xml +++ b/app/src/main/res/layout/activity_dashboard_attedance.xml @@ -25,11 +25,14 @@ android:text="@string/dashboard" /> + + diff --git a/app/src/main/res/layout/activity_login_page.xml b/app/src/main/res/layout/activity_login_page.xml index 26f6a39..44e35b9 100644 --- a/app/src/main/res/layout/activity_login_page.xml +++ b/app/src/main/res/layout/activity_login_page.xml @@ -1,9 +1,10 @@ + + android:layout_height="match_parent"> + android:layout_marginTop="230dp" + android:layout_marginBottom="8dp"> + app:passwordToggleEnabled="true"> - diff --git a/app/src/main/res/menu/menu_dashboard.xml b/app/src/main/res/menu/menu_dashboard.xml new file mode 100644 index 0000000..a00ecdc --- /dev/null +++ b/app/src/main/res/menu/menu_dashboard.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2955608..22b01c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,6 +91,7 @@ Device is offline Dashboard Members + Press back button again to exit From ae6057dd26ea123691dabe1c5408f516d7da844e Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Sun, 23 Jun 2019 21:12:10 +0545 Subject: [PATCH 09/23] [#5] adds staff create form --- .../attedancedashboard/ListAdapter.kt | 13 +++++-------- .../attedancedashboard/base/AddItemVH.kt | 13 ++++++++++++- .../np/com/naxa/staffattendance/common/Constant.kt | 6 ++++++ app/src/main/res/layout/grid_item_add.xml | 1 + 4 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt index ef97901..73baf9c 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/ListAdapter.kt @@ -4,16 +4,15 @@ import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup import np.com.naxa.staffattendance.attedancedashboard.base.AddItemVH -import np.com.naxa.staffattendance.utlils.ToastUtils class ListAdapter(private val list: List) : RecyclerView.Adapter() { - private val TYPE_CONTENT = 0; - private val TYPE_ADD_CONTENT = 1; - private val TYPE_HEADER = 2; - private val TYPE_STATS = 3; + private val TYPE_CONTENT = 0 + private val TYPE_ADD_CONTENT = 1 + private val TYPE_HEADER = 2 + private val TYPE_STATS = 3 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { @@ -51,9 +50,7 @@ class ListAdapter(private val list: List) private fun onBindAddItem(holder: AddItemVH, row: AddItemButton) { - holder.itemView.setOnClickListener { - - } + holder.bind(row); } private fun onBindContent(holder: CalendarVH, row: AttendanceDay) { diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt index d42a52f..3ec80d2 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/base/AddItemVH.kt @@ -3,20 +3,31 @@ package np.com.naxa.staffattendance.attedancedashboard.base import android.support.v7.widget.RecyclerView import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import android.widget.TextView import np.com.naxa.staffattendance.R import np.com.naxa.staffattendance.attedancedashboard.AddItemButton import np.com.naxa.staffattendance.attedancedashboard.AttendanceDay +import np.com.naxa.staffattendance.common.UIConstants +import np.com.naxa.staffattendance.newstaff.NewStaffActivity +import np.com.naxa.staffattendance.utlils.ToastUtils class AddItemVH(inflater: LayoutInflater, parent: ViewGroup) : RecyclerView.ViewHolder(inflater.inflate(R.layout.grid_item_add, parent, false)) { - fun bind(day: AddItemButton) { + fun bind(addItem: AddItemButton) { + itemView.setOnClickListener { + when(addItem.uuid){ + UIConstants.UUID_GRID_ITEM_TEAM_MEMBER ->{ + NewStaffActivity.start(itemView.context,true); + } + } + } } diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt new file mode 100644 index 0000000..816ff23 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt @@ -0,0 +1,6 @@ +package np.com.naxa.staffattendance.common + +object UIConstants { + const val UUID_GRID_ITEM_TEAM_MEMBER = "add_team_member" + +} \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_add.xml b/app/src/main/res/layout/grid_item_add.xml index 9eb5cdf..40871e2 100644 --- a/app/src/main/res/layout/grid_item_add.xml +++ b/app/src/main/res/layout/grid_item_add.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@drawable/border" app:cardCornerRadius="20dp" app:cardElevation="1dp"> From a48f9c756d41aaaa088883c02719c8223639dc36 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 10:45:23 +0545 Subject: [PATCH 10/23] [#5] adds team name in dashboard --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 1 + .../staffattendance/StaffListAdapter.java | 4 +- .../attedancedashboard/AttendanceDay.kt | 2 +- .../AttendancesDashboardActivity.kt | 45 +++++--- .../attedancedashboard/CalendraVH.kt | 15 ++- .../attendence/v2/AttedanceActivity.kt | 102 ++++++++++++++++++ .../staffattendance/common/BaseActivity.kt | 15 +++ .../naxa/staffattendance/common/Constant.kt | 5 + .../staffattendance/database/TeamDao.java | 1 + .../splash/SplashScreenActivity.kt | 9 +- .../staffattendance/utlils/DateConvertor.java | 32 ++++++ app/src/main/res/drawable/ic_arrow_24dp.xml | 5 + app/src/main/res/drawable/ic_toolbar_back.xml | 5 + .../main/res/layout/activity_attedance.xml | 6 ++ .../layout/activity_dashboard_attedance.xml | 1 + app/src/main/res/layout/grid_item_add.xml | 3 +- .../main/res/layout/grid_item_calendra.xml | 5 +- app/src/main/res/layout/grid_item_stats.xml | 3 +- app/src/main/res/layout/staff_list_row.xml | 67 ++++++------ app/src/main/res/values/dimens.xml | 2 +- 21 files changed, 261 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt create mode 100644 app/src/main/res/drawable/ic_arrow_24dp.xml create mode 100644 app/src/main/res/drawable/ic_toolbar_back.xml create mode 100644 app/src/main/res/layout/activity_attedance.xml diff --git a/app/build.gradle b/app/build.gradle index b78eeec..d266a98 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ dependencies { implementation 'com.facebook.stetho:stetho-okhttp3:1.4.2' implementation 'com.jakewharton.timber:timber:4.7.0' debugImplementation 'com.readystatesoftware.chuck:library:1.1.0' - debugImplementation 'com.amitshekhar.android:debug-db:1.0.3' + debugImplementation 'com.amitshekhar.android:debug-db:1.0.6' releaseImplementation 'com.readystatesoftware.chuck:library-no-op:1.1.0' //helper libs` diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0ae7366..e574e7e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,7 @@ + selectedStaffHashMap = new HashMap<>(); - StaffListAdapter(Context mContext, List staffList, boolean enablePersonSelection, List attedanceIds, OnStaffItemClickListener listener) { + public StaffListAdapter(Context mContext, List staffList, boolean enablePersonSelection, List attedanceIds, OnStaffItemClickListener listener) { this.mContext = mContext; this.staffList = staffList; this.filetredsitelist = staffList; @@ -67,7 +67,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int pos staffVH.rootLayout.setEnabled(enablePersonSelection); staffVH.staffName.setText(staff.getFirstName()); - staffVH.staffType.setText(staff.getTeamName()); + staffVH.iconText.setVisibility(View.VISIBLE); staffVH.imgProfile.setImageResource(R.drawable.circle_blue); staffVH.iconText.setText(staff.getFirstName().substring(0, 1)); diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt index 76b93cb..cea0fa7 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt @@ -2,4 +2,4 @@ package np.com.naxa.staffattendance.attedancedashboard import np.com.naxa.staffattendance.attedancedashboard.base.IRow -data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String,val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String) : IRow \ No newline at end of file +data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String, val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String, val fullDate: String) : IRow \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index bf2cde4..bacd524 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -12,6 +12,8 @@ import android.view.Menu import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.database.StaffDao +import np.com.naxa.staffattendance.database.TeamDao import np.com.naxa.staffattendance.utlils.DateConvertor import np.com.naxa.staffattendance.utlils.ToastUtils import java.util.concurrent.TimeUnit @@ -24,39 +26,49 @@ class AttendancesDashboardActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContentView(R.layout.activity_dashboard_attedance); + + setSupportActionBar(toolbar) + supportActionBar?.title = "" + setupListAdapter(generateGridItems()); + } + + private fun generateGridItems(): ArrayList { + val teamId = TeamDao().oneTeamIdForDemo val list = arrayListOf() - setContentView(R.layout.activity_dashboard_attedance); + val staffs = StaffDao().getStaffByTeamId(teamId) list.add("Team") list.add("") - - - list.add(TeamStats("FieldSight", "16")) + if(staffs.size > 0){ + val teamName = staffs[0].teamName + val teamMembersCount = staffs.count().toString() + list.add(TeamStats(teamName,teamMembersCount)) + } list.add(AddItemButton("add_team_member")) - - list.add("Attendance") list.add("") - for (x in -6 until 1 step 1) { val date = DateConvertor.getPastDate(x) val yearMonthDay = DateConvertor.getYearMonthDay(date); - list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], dayOfMonth = yearMonthDay[1], date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "")) + list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], + dayOfMonth = yearMonthDay[1], + date = yearMonthDay[0], + absentNoOfStaff = "", + presentNoOfStaff = "", + fullDate = DateConvertor.formatDate(DateConvertor.getDateForPosition(x)))); } - - setSupportActionBar(toolbar); - supportActionBar?.setTitle("") - setupListAdapter(list); + return list; } override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.menu_dashboard,menu); + menuInflater.inflate(R.menu.menu_dashboard, menu); return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when(item?.itemId){ + when (item?.itemId) { R.id.main_dashboard_setting -> { } @@ -75,6 +87,7 @@ class AttendancesDashboardActivity : AppCompatActivity() { ToastUtils.showShort(getString(R.string.msg_backpress_to_exit)) backPressHandler.postDelayed(runnable, TimeUnit.SECONDS.toMillis(2)) } + private fun setupListAdapter(days: List) { val manager = LinearLayoutManager(this) @@ -89,10 +102,8 @@ class AttendancesDashboardActivity : AppCompatActivity() { } companion object { - - fun newIntent(context: Context): Intent { + fun newIntent(context: Context): Intent { val intent = Intent(context, AttendancesDashboardActivity::class.java) - return intent } } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt index 84e20fb..10fce1c 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt @@ -6,7 +6,8 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import np.com.naxa.staffattendance.R - +import np.com.naxa.staffattendance.attendence.v2.AttedanceActivity +import np.com.naxa.staffattendance.database.TeamDao class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : @@ -16,6 +17,7 @@ class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : private var tvMonthYear: TextView? = null private var tvAbsentMessage: TextView? = null private var tvPresentMessage: TextView? = null + private var rootLayout: View? = null init { @@ -24,19 +26,22 @@ class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : tvMonthYear = itemView.findViewById(R.id.tv_month_year) tvAbsentMessage = itemView.findViewById(R.id.tv_absent_message) tvPresentMessage = itemView.findViewById(R.id.tv_present_message) + rootLayout = itemView.findViewById(R.id.root_layout) } fun bind(day: AttendanceDay) { tvDay?.text = day.dayOfWeek tvDate?.text = day.dayOfMonth tvMonthYear?.text = day.date -// - + rootLayout?.setOnClickListener { + var intent = AttedanceActivity.newIntent(itemView.context, date = day.fullDate, teamId = TeamDao.getInstance().oneTeamIdForDemo) + itemView.context.startActivity(intent); + } } - fun setAbsentPresentMessage(day: AttendanceDay){ - if(isNullOrEmpty(day.absentNoOfStaff)){ + fun setAbsentPresentMessage(day: AttendanceDay) { + if (isNullOrEmpty(day.absentNoOfStaff)) { } } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt new file mode 100644 index 0000000..4af7ddb --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -0,0 +1,102 @@ +package np.com.naxa.staffattendance.attendence.v2 + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.DefaultItemAnimator +import android.support.v7.widget.LinearLayoutManager +import android.view.View +import kotlinx.android.synthetic.main.activity_dashboard_attedance.* +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.StaffListAdapter +import np.com.naxa.staffattendance.attedancedashboard.ItemOffsetDecoration +import np.com.naxa.staffattendance.attendence.TeamMemberResposne +import np.com.naxa.staffattendance.common.BaseActivity +import np.com.naxa.staffattendance.common.IntentConstants +import np.com.naxa.staffattendance.database.AttendanceDao +import np.com.naxa.staffattendance.database.StaffDao +import np.com.naxa.staffattendance.database.TeamDao +import np.com.naxa.staffattendance.utlils.DateConvertor +import java.sql.Date + +class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListener { + override fun onStaffClick(pos: Int, staff: TeamMemberResposne?) { + } + + override fun onStaffLongClick(pos: Int) { + } + + private var loadedDate: String? = null; + private lateinit var stafflistAdapter: StaffListAdapter + private var teamDao: TeamDao? = null + private var enablePersonSelection = true; + private var attedanceIds: List? = emptyList() + private lateinit var teamId: String + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_dashboard_attedance) + loadedDate = intent.getStringExtra(IntentConstants.ATTENDANCE_DATE); + teamId = intent.getStringExtra(IntentConstants.TEAM_ID); + +// val dailyAttendance = AttendanceDao().getAttedanceByDate(teamId, loadedDate) +// setAttendanceIds(dailyAttendance.presentStaffIds,dailyAttendance.getAttendanceDate(false)) + + setupToolbar(title = "Team Name") + setupRecyclerView() + + } + + private fun setupToolbar(title: String) { + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowTitleEnabled(false) + supportActionBar?.title = "" + supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_toolbar_back) + tv_screen_name.text = title + + } + + + + private fun setupRecyclerView() { + val teamDao = TeamDao(); + val mLayoutManager = LinearLayoutManager(getApplicationContext()) + val teamId = teamDao.oneTeamIdForDemo + + val staffs = StaffDao().getStaffByTeamId(teamId) + stafflistAdapter = StaffListAdapter(this, staffs, enablePersonSelection, attedanceIds, this) + recycler_view.layoutManager = mLayoutManager + recycler_view.itemAnimator = DefaultItemAnimator() + recycler_view.adapter = stafflistAdapter + recycler_view.addItemDecoration(ItemOffsetDecoration(this, R.dimen.spacing_small)) + } + + fun setAttendanceIds(attendanceIds: List?, attendanceDate: String) { + this.attedanceIds = attendanceIds + val isAttedanceEmpty = attendanceIds?.isEmpty() + val isAttedanceDateToday = DateConvertor.getCurrentDate().equals(attendanceDate, ignoreCase = true) + if (isAttedanceEmpty!! && isAttedanceDateToday) { + enablePersonSelection = true + } + + val isAttendenceNotEmpty = !isAttedanceEmpty + + if (isAttedanceDateToday && isAttendenceNotEmpty) { + enablePersonSelection = false + } + } + + + companion object { + fun newIntent(context: Context, date: String,teamId: String): Intent { + val intent = Intent(context, AttedanceActivity::class.java) + intent.putExtra(IntentConstants.ATTENDANCE_DATE, date); + intent.putExtra(IntentConstants.TEAM_ID, teamId); + return intent + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt new file mode 100644 index 0000000..f1cbe7c --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt @@ -0,0 +1,15 @@ +package np.com.naxa.staffattendance.common + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import kotlinx.android.synthetic.main.activity_dashboard_attedance.* + +open class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + + + +} diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt index 816ff23..14b7099 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt @@ -2,5 +2,10 @@ package np.com.naxa.staffattendance.common object UIConstants { const val UUID_GRID_ITEM_TEAM_MEMBER = "add_team_member" +} + +object IntentConstants { + const val ATTENDANCE_DATE = "attendance_date" + const val TEAM_ID = "team_id" } \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/TeamDao.java b/app/src/main/java/np/com/naxa/staffattendance/database/TeamDao.java index beb93dd..8701288 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/TeamDao.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/TeamDao.java @@ -33,6 +33,7 @@ public Cursor getCursor(String selection, String[] selectionArgs) { return getCursor(false, selection, selectionArgs); } + public String getTeamNameById(String id) { String teamName = ""; Cursor cursor = null; diff --git a/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt index be1d96b..20f695e 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/splash/SplashScreenActivity.kt @@ -12,7 +12,6 @@ import android.view.Window import android.view.WindowManager import kotlinx.android.synthetic.main.activity_splash_screen2.* import np.com.naxa.staffattendance.attedancedashboard.AttendancesDashboardActivity -import np.com.naxa.staffattendance.attendence.AttendanceViewPagerActivity import np.com.naxa.staffattendance.data.TokenMananger import np.com.naxa.staffattendance.login.LoginActivity @@ -48,17 +47,17 @@ class SplashScreenActivity : AppCompatActivity() { splash_logo.visibility = View.VISIBLE splash_logo.animate() .alpha(0f) - .setStartDelay(2000L) - .setDuration(1000L) + .setStartDelay(1000L) + .setDuration(500L) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { if (TokenMananger.doesTokenExist()) { startActivity(AttendancesDashboardActivity.newIntent(this@SplashScreenActivity)) }else{ - LoginActivity.start(this@SplashScreenActivity); + LoginActivity.start(this@SplashScreenActivity) } - overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out); + overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out) finish() } diff --git a/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java b/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java index 911daf4..8130ab6 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java +++ b/app/src/main/java/np/com/naxa/staffattendance/utlils/DateConvertor.java @@ -117,4 +117,36 @@ private static String getDayOfWeek(int value) { } return day; } + + + public static Date getDateForPosition(int pos) { + Date date; + + switch (pos) { + case 0: + date = DateConvertor.getPastDate(-6); + break; + case 1: + date = DateConvertor.getPastDate(-5); + break; + case 2: + date = DateConvertor.getPastDate(-4); + break; + case 3: + date = DateConvertor.getPastDate(-3); + break; + case 4: + date = DateConvertor.getPastDate(-2); + break; + case 5: + date = DateConvertor.getPastDate(-1); + break; + default: + date = new Date(); + break; + } + + + return date; + } } diff --git a/app/src/main/res/drawable/ic_arrow_24dp.xml b/app/src/main/res/drawable/ic_arrow_24dp.xml new file mode 100644 index 0000000..6400429 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_toolbar_back.xml b/app/src/main/res/drawable/ic_toolbar_back.xml new file mode 100644 index 0000000..b79d00f --- /dev/null +++ b/app/src/main/res/drawable/ic_toolbar_back.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_attedance.xml b/app/src/main/res/layout/activity_attedance.xml new file mode 100644 index 0000000..d8fb324 --- /dev/null +++ b/app/src/main/res/layout/activity_attedance.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dashboard_attedance.xml b/app/src/main/res/layout/activity_dashboard_attedance.xml index 7270b2c..0f3932c 100644 --- a/app/src/main/res/layout/activity_dashboard_attedance.xml +++ b/app/src/main/res/layout/activity_dashboard_attedance.xml @@ -16,6 +16,7 @@ android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout/grid_item_calendra.xml b/app/src/main/res/layout/grid_item_calendra.xml index bbd4d88..218bb8c 100644 --- a/app/src/main/res/layout/grid_item_calendra.xml +++ b/app/src/main/res/layout/grid_item_calendra.xml @@ -3,11 +3,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:clickable="true" + android:focusable="true" android:layout_height="wrap_content" - app:cardCornerRadius="20dp" + app:cardCornerRadius="@dimen/cardview_default_radius" app:cardElevation="0dp"> - + app:cardElevation="0dp" +> - - - + /> + android:text="9:00" /> - + + + android:layout_below="@id/staff_list_row_name" + android:layout_toEndOf="@id/seperator" + android:layout_toRightOf="@id/seperator" + android:text="16:00" /> + + - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 917a1a0..e7a3667 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -28,7 +28,7 @@ 32dp 64dp 5dp - 5dp + 20dp 40dp 22sp 48dp From 85bc510cb24619da949a979978c994388f3e9569 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 10:53:00 +0545 Subject: [PATCH 11/23] [#5] adds teamId and name to day obj --- .../attedancedashboard/AttendanceDay.kt | 9 ++++++++- .../AttendancesDashboardActivity.kt | 19 +++++++++++-------- .../attedancedashboard/CalendraVH.kt | 2 +- .../attendence/v2/AttedanceActivity.kt | 7 +++++-- .../naxa/staffattendance/common/Constant.kt | 1 + app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt index cea0fa7..7eec6f6 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendanceDay.kt @@ -2,4 +2,11 @@ package np.com.naxa.staffattendance.attedancedashboard import np.com.naxa.staffattendance.attedancedashboard.base.IRow -data class AttendanceDay(val dayOfWeek: String, val dayOfMonth: String, val date: String, val absentNoOfStaff: String, val presentNoOfStaff: String, val fullDate: String) : IRow \ No newline at end of file +data class AttendanceDay(val dayOfWeek: String, + val dayOfMonth: String, + val date: String, + val absentNoOfStaff: String, + val presentNoOfStaff: String, + val teamId: String, + val teamName: String, + val fullDate: String) : IRow \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index bacd524..f2754b1 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -12,6 +12,7 @@ import android.view.Menu import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.common.UIConstants import np.com.naxa.staffattendance.database.StaffDao import np.com.naxa.staffattendance.database.TeamDao import np.com.naxa.staffattendance.utlils.DateConvertor @@ -26,7 +27,7 @@ class AttendancesDashboardActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_dashboard_attedance); + setContentView(R.layout.activity_dashboard_attedance); setSupportActionBar(toolbar) supportActionBar?.title = "" @@ -36,17 +37,17 @@ class AttendancesDashboardActivity : AppCompatActivity() { private fun generateGridItems(): ArrayList { val teamId = TeamDao().oneTeamIdForDemo val list = arrayListOf() - + var teamName: String = "" val staffs = StaffDao().getStaffByTeamId(teamId) - list.add("Team") + list.add(getString(R.string.title_team)) list.add("") - if(staffs.size > 0){ - val teamName = staffs[0].teamName + if (staffs.size > 0) { + teamName = staffs[0].teamName val teamMembersCount = staffs.count().toString() - list.add(TeamStats(teamName,teamMembersCount)) + list.add(TeamStats(teamName, teamMembersCount)) } - list.add(AddItemButton("add_team_member")) - list.add("Attendance") + list.add(AddItemButton(UIConstants.UUID_GRID_ITEM_TEAM_MEMBER)) + list.add(getString(R.string.title_attedance)) list.add("") for (x in -6 until 1 step 1) { val date = DateConvertor.getPastDate(x) @@ -56,6 +57,8 @@ class AttendancesDashboardActivity : AppCompatActivity() { date = yearMonthDay[0], absentNoOfStaff = "", presentNoOfStaff = "", + teamId = teamId, + teamName = teamName, fullDate = DateConvertor.formatDate(DateConvertor.getDateForPosition(x)))); } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt index 10fce1c..013f86d 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/CalendraVH.kt @@ -34,7 +34,7 @@ class CalendarVH(inflater: LayoutInflater, parent: ViewGroup) : tvDate?.text = day.dayOfMonth tvMonthYear?.text = day.date rootLayout?.setOnClickListener { - var intent = AttedanceActivity.newIntent(itemView.context, date = day.fullDate, teamId = TeamDao.getInstance().oneTeamIdForDemo) + var intent = AttedanceActivity.newIntent(itemView.context, date = day.fullDate, teamId = day.teamId, teamName = day.teamName) itemView.context.startActivity(intent); } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt index 4af7ddb..b0d5143 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -33,6 +33,7 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe private var enablePersonSelection = true; private var attedanceIds: List? = emptyList() private lateinit var teamId: String + private lateinit var teamName: String override fun onCreate(savedInstanceState: Bundle?) { @@ -40,11 +41,12 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe setContentView(R.layout.activity_dashboard_attedance) loadedDate = intent.getStringExtra(IntentConstants.ATTENDANCE_DATE); teamId = intent.getStringExtra(IntentConstants.TEAM_ID); + teamName = intent.getStringExtra(IntentConstants.TEAM_NAME); // val dailyAttendance = AttendanceDao().getAttedanceByDate(teamId, loadedDate) // setAttendanceIds(dailyAttendance.presentStaffIds,dailyAttendance.getAttendanceDate(false)) - setupToolbar(title = "Team Name") + setupToolbar(title = teamName) setupRecyclerView() } @@ -91,10 +93,11 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe companion object { - fun newIntent(context: Context, date: String,teamId: String): Intent { + fun newIntent(context: Context, date: String,teamId: String,teamName: String): Intent { val intent = Intent(context, AttedanceActivity::class.java) intent.putExtra(IntentConstants.ATTENDANCE_DATE, date); intent.putExtra(IntentConstants.TEAM_ID, teamId); + intent.putExtra(IntentConstants.TEAM_NAME, teamName); return intent } } diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt index 14b7099..13d6113 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt @@ -8,4 +8,5 @@ object UIConstants { object IntentConstants { const val ATTENDANCE_DATE = "attendance_date" const val TEAM_ID = "team_id" + const val TEAM_NAME = "team_name" } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 22b01c0..e7091aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -92,6 +92,8 @@ Dashboard Members Press back button again to exit + Team + Attendance From bd0b5ef0ff90cd13c7f9bf7688ea5d0aeccc10e3 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 13:19:10 +0545 Subject: [PATCH 12/23] [#5] adds attedance bottom view --- app/build.gradle | 3 + .../AttedanceBottomFragment.kt | 47 ++++++++++++++ .../attendence/TeamMemberResposne.java | 4 +- .../attendence/v2/AttedanceActivity.kt | 20 ++++-- .../naxa/staffattendance/common/Constant.kt | 2 + app/src/main/res/drawable/bg_progress.xml | 30 +++++++++ .../layout/fragment_take_attedance_dialog.xml | 62 +++++++++++++++++++ .../main/res/layout/grid_item_calendra.xml | 2 +- app/src/main/res/layout/staff_list_row.xml | 2 +- app/src/main/res/values/arrays.xml | 9 +++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles.xml | 1 + 12 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt create mode 100644 app/src/main/res/drawable/bg_progress.xml create mode 100644 app/src/main/res/layout/fragment_take_attedance_dialog.xml create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/build.gradle b/app/build.gradle index d266a98..fccb04f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,9 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:1.0.2' + //UI + implementation 'com.params.stepview:stepview:1.0.2' + //debug libs implementation 'com.facebook.stetho:stetho:1.4.2' implementation 'com.facebook.stetho:stetho-okhttp3:1.4.2' diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt new file mode 100644 index 0000000..798880b --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt @@ -0,0 +1,47 @@ +package np.com.naxa.staffattendance.attedancedashboard + +import android.content.Context +import android.os.Bundle +import android.support.annotation.Nullable +import android.view.ViewGroup +import android.view.LayoutInflater +import android.support.design.widget.BottomSheetDialogFragment +import android.view.View +import kotlinx.android.synthetic.main.fragment_take_attedance_dialog.view.* +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.attendence.TeamMemberResposne +import np.com.naxa.staffattendance.common.IntentConstants + + +class AttedanceBottomFragment : BottomSheetDialogFragment() { + + var staff: TeamMemberResposne? = null; + + override fun onAttach(context: Context?) { + super.onAttach(context) + arguments?.getSerializable(IntentConstants.EXTRA_OBJECT)?.let { + staff = it as TeamMemberResposne + } + } + + @Nullable + override fun onCreateView(inflater: LayoutInflater, + @Nullable container: ViewGroup?, + @Nullable savedInstanceState: Bundle?): View? { + + + + val view = inflater.inflate(R.layout.fragment_take_attedance_dialog, container, + false) + + view.tv_take_attedance_frag_staff_name.text = staff?.firstName; + return view; + } + + companion object { + + fun newInstance(): AttedanceBottomFragment { + return AttedanceBottomFragment() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java index 5aa6fd2..667e873 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java @@ -3,7 +3,9 @@ import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -public class TeamMemberResposne { +import java.io.Serializable; + +public class TeamMemberResposne implements Serializable { private String teamID; private String teamName; diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt index b0d5143..b23180a 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -1,27 +1,36 @@ package np.com.naxa.staffattendance.attendence.v2 +import android.app.AlertDialog import android.content.Context +import android.content.DialogInterface import android.content.Intent import android.os.Bundle -import android.support.v7.app.AppCompatActivity import android.support.v7.widget.DefaultItemAnimator import android.support.v7.widget.LinearLayoutManager -import android.view.View import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R import np.com.naxa.staffattendance.StaffListAdapter +import np.com.naxa.staffattendance.attedancedashboard.AttedanceBottomFragment import np.com.naxa.staffattendance.attedancedashboard.ItemOffsetDecoration + import np.com.naxa.staffattendance.attendence.TeamMemberResposne import np.com.naxa.staffattendance.common.BaseActivity import np.com.naxa.staffattendance.common.IntentConstants -import np.com.naxa.staffattendance.database.AttendanceDao import np.com.naxa.staffattendance.database.StaffDao import np.com.naxa.staffattendance.database.TeamDao import np.com.naxa.staffattendance.utlils.DateConvertor -import java.sql.Date + class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListener { override fun onStaffClick(pos: Int, staff: TeamMemberResposne?) { + val attedanceBottomFragment = AttedanceBottomFragment.newInstance() + attedanceBottomFragment.arguments = Bundle().apply { + putSerializable(IntentConstants.EXTRA_OBJECT,staff); + } + + attedanceBottomFragment.show(supportFragmentManager, + "add_photo_dialog_fragment") + } override fun onStaffLongClick(pos: Int) { @@ -62,7 +71,6 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe } - private fun setupRecyclerView() { val teamDao = TeamDao(); val mLayoutManager = LinearLayoutManager(getApplicationContext()) @@ -93,7 +101,7 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe companion object { - fun newIntent(context: Context, date: String,teamId: String,teamName: String): Intent { + fun newIntent(context: Context, date: String, teamId: String, teamName: String): Intent { val intent = Intent(context, AttedanceActivity::class.java) intent.putExtra(IntentConstants.ATTENDANCE_DATE, date); intent.putExtra(IntentConstants.TEAM_ID, teamId); diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt index 13d6113..16de819 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt @@ -6,7 +6,9 @@ object UIConstants { object IntentConstants { + const val ATTENDANCE_DATE = "attendance_date" + const val EXTRA_OBJECT = "extra_object" const val TEAM_ID = "team_id" const val TEAM_NAME = "team_name" } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..b02e6fe --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_take_attedance_dialog.xml b/app/src/main/res/layout/fragment_take_attedance_dialog.xml new file mode 100644 index 0000000..7268bad --- /dev/null +++ b/app/src/main/res/layout/fragment_take_attedance_dialog.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item_calendra.xml b/app/src/main/res/layout/grid_item_calendra.xml index 218bb8c..033b588 100644 --- a/app/src/main/res/layout/grid_item_calendra.xml +++ b/app/src/main/res/layout/grid_item_calendra.xml @@ -6,7 +6,7 @@ android:clickable="true" android:focusable="true" android:layout_height="wrap_content" - app:cardCornerRadius="@dimen/cardview_default_radius" + app:cardCornerRadius="@dimen/card_recycler_corner_radius" app:cardElevation="0dp"> + + + + Scan Card + Scan Fingerprint + Finish + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e7091aa..2f36e91 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Press back button again to exit Team Attendance + Cancel + NEXT diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1e4e82d..df0820c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -26,4 +26,5 @@ + From a63f65cf7371ef41e47658cfe8270e18e5257586 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 14:31:08 +0545 Subject: [PATCH 13/23] [#5] adds message --- .../AttedanceBottomFragment.kt | 45 +++++++++++++++++-- .../layout/fragment_take_attedance_dialog.xml | 20 +++++++-- app/src/main/res/values/arrays.xml | 8 +++- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt index 798880b..cd8997d 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttedanceBottomFragment.kt @@ -11,17 +11,23 @@ import kotlinx.android.synthetic.main.fragment_take_attedance_dialog.view.* import np.com.naxa.staffattendance.R import np.com.naxa.staffattendance.attendence.TeamMemberResposne import np.com.naxa.staffattendance.common.IntentConstants +import java.util.* +import kotlin.concurrent.fixedRateTimer class AttedanceBottomFragment : BottomSheetDialogFragment() { - var staff: TeamMemberResposne? = null; + private lateinit var demoTimer: Timer + var staff: TeamMemberResposne? = null + var statusDesc: Array? = null + override fun onAttach(context: Context?) { super.onAttach(context) arguments?.getSerializable(IntentConstants.EXTRA_OBJECT)?.let { staff = it as TeamMemberResposne } + } @Nullable @@ -30,14 +36,45 @@ class AttedanceBottomFragment : BottomSheetDialogFragment() { @Nullable savedInstanceState: Bundle?): View? { - - val view = inflater.inflate(R.layout.fragment_take_attedance_dialog, container, + val view = inflater.inflate(R.layout.fragment_take_attedance_dialog, container, false) - view.tv_take_attedance_frag_staff_name.text = staff?.firstName; + view.tv_take_attedance_frag_staff_name.text = staff?.firstName + demoTimer = fixedRateTimer("timer", false, 2000, 2000) { + requireActivity().runOnUiThread { + goToNextStep(view) + } + } + statusDesc = resources.getStringArray(R.array.attedance_status_desc); + loadFirstMessage(view) return view; } + override fun onDestroy() { + super.onDestroy() + demoTimer.cancel() + } + + private fun goToNextStep(view: View) { + val currentCount: Int = view.statusViewScroller.statusView.currentCount + if (currentCount < 4) { + setMessage(currentCount - 1, view) + view.statusViewScroller.statusView.currentCount = currentCount + 1 + + } else { + dismiss() + } + + } + + private fun loadFirstMessage(view: View) { + setMessage(0, view) + } + + private fun setMessage(currentCount: Int, view: View) { + view.tv_take_attedance_frag_desc.text = statusDesc?.get(currentCount) + } + companion object { fun newInstance(): AttedanceBottomFragment { diff --git a/app/src/main/res/layout/fragment_take_attedance_dialog.xml b/app/src/main/res/layout/fragment_take_attedance_dialog.xml index 7268bad..c5e78ef 100644 --- a/app/src/main/res/layout/fragment_take_attedance_dialog.xml +++ b/app/src/main/res/layout/fragment_take_attedance_dialog.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" + xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:padding="@dimen/spacing_large"> @@ -22,11 +23,22 @@ android:layout_margin="@dimen/spacing_large" app:cardCornerRadius="@dimen/card_recycler_corner_radius"> - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index dceb525..88a8fdf 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,9 +1,15 @@ - + Scan Card Scan Fingerprint Finish + + + We are ready to scan your card + Card verified! Let\'s scan your fingerprint + We have recorded your attendance + \ No newline at end of file From f44585683628ea2827b399f37bc98c3973f754cd Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 15:07:25 +0545 Subject: [PATCH 14/23] [#5] Adds settings screen --- app/src/main/AndroidManifest.xml | 5 +- .../AttendancesDashboardActivity.kt | 4 +- .../attendence/v2/AttedanceActivity.kt | 10 +- .../naxa/staffattendance/common/Constant.kt | 6 +- .../staffattendance/login/LoginActivity.java | 11 +- .../settings/AppInfoFragment.kt | 96 ++++++++++++++++++ .../settings/SettingsActivity.kt | 46 +++++++++ .../main/res/layout/activity_login_page.xml | 6 +- app/src/main/res/layout/activity_settings.xml | 49 +++++++++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2288 -> 3706 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1204 -> 1895 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3034 -> 4932 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 5878 -> 9945 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 8054 -> 13857 bytes .../main/res/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3706 bytes .../main/res/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1895 bytes .../main/res/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4932 bytes .../res/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9945 bytes .../res/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 13857 bytes app/src/main/res/values/strings.xml | 3 +- app/src/main/res/web_hi_res_512.png | Bin 0 -> 103774 bytes .../res/xml/staff_attendance_preferences.xml | 15 +++ 22 files changed, 238 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/np/com/naxa/staffattendance/settings/AppInfoFragment.kt create mode 100644 app/src/main/java/np/com/naxa/staffattendance/settings/SettingsActivity.kt create mode 100644 app/src/main/res/layout/activity_settings.xml create mode 100644 app/src/main/res/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/web_hi_res_512.png create mode 100644 app/src/main/res/xml/staff_attendance_preferences.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e574e7e..8fad6b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> - + @@ -22,7 +22,7 @@ + android:exported="true" /> @@ -32,6 +32,7 @@ android:name=".attedancedashboard.AttendancesDashboardActivity" android:exported="true" /> + { - + val toSettings = SettingsActivity.newIntent(this@AttendancesDashboardActivity) + startActivity(toSettings) } } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt index b23180a..7e7a0e0 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.os.Bundle import android.support.v7.widget.DefaultItemAnimator import android.support.v7.widget.LinearLayoutManager +import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R import np.com.naxa.staffattendance.StaffListAdapter @@ -25,7 +26,7 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe override fun onStaffClick(pos: Int, staff: TeamMemberResposne?) { val attedanceBottomFragment = AttedanceBottomFragment.newInstance() attedanceBottomFragment.arguments = Bundle().apply { - putSerializable(IntentConstants.EXTRA_OBJECT,staff); + putSerializable(IntentConstants.EXTRA_OBJECT, staff); } attedanceBottomFragment.show(supportFragmentManager, @@ -70,6 +71,13 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe } + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item?.itemId) { + android.R.id.home -> onBackPressed(); + } + return super.onOptionsItemSelected(item) + } + private fun setupRecyclerView() { val teamDao = TeamDao(); diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt index 16de819..32d8ddc 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/common/Constant.kt @@ -11,4 +11,8 @@ object IntentConstants { const val EXTRA_OBJECT = "extra_object" const val TEAM_ID = "team_id" const val TEAM_NAME = "team_name" -} \ No newline at end of file +} + + +val KEY_LOGOUT = "logout" +val KEY_APP_UPDATE = "app_update" \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java b/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java index d2d8151..63d3aa9 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java +++ b/app/src/main/java/np/com/naxa/staffattendance/login/LoginActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.TextInputLayout; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.WindowManager; @@ -42,7 +43,7 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList private static final String TAG = "LoginActivity"; - private EditText tvUserName, tvPassword; + private TextInputLayout tvUserName, tvPassword; private Button btnLogin; private TokenMananger tokenMananger; private MyTeamRepository myTeamRepository; @@ -82,7 +83,7 @@ public void onClick(View view) { case R.id.btn_login: dialog = DialogFactory.createProgressDialogHorizontal(this, getString(R.string.msg_please_wait)); if (validate()) { - loginToServer(tvUserName.getText().toString(), tvPassword.getText().toString()); + loginToServer(tvUserName.getEditText().getText().toString(), tvPassword.getEditText().getText().toString()); } else { ToastUtils.showShort("Enter valid credentials.."); } @@ -272,8 +273,8 @@ private boolean validate() { boolean valid = true; boolean ck = false; - String email = tvUserName.getText().toString(); - String password = tvPassword.getText().toString(); + String email = tvUserName.getEditText().getText().toString(); + String password = tvPassword.getEditText().getText().toString(); if (email.isEmpty()) { tvUserName.requestFocus(); @@ -283,7 +284,7 @@ private boolean validate() { ck = true; } - if (password.isEmpty() || password.length() < 4) { + if (password.isEmpty() ) { if (ck) { tvPassword.requestFocus(); } diff --git a/app/src/main/java/np/com/naxa/staffattendance/settings/AppInfoFragment.kt b/app/src/main/java/np/com/naxa/staffattendance/settings/AppInfoFragment.kt new file mode 100644 index 0000000..ef8b155 --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/settings/AppInfoFragment.kt @@ -0,0 +1,96 @@ +package np.com.naxa.staffattendance.settings + + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.preference.Preference +import android.preference.PreferenceFragment +import np.com.naxa.staffattendance.BuildConfig +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.SharedPreferenceUtils +import np.com.naxa.staffattendance.common.KEY_APP_UPDATE +import np.com.naxa.staffattendance.common.KEY_LOGOUT +import np.com.naxa.staffattendance.data.TokenMananger +import np.com.naxa.staffattendance.database.DatabaseHelper +import np.com.naxa.staffattendance.login.LoginActivity +import np.com.naxa.staffattendance.utlils.DialogFactory +import java.util.* + + +class SettingsFragment : PreferenceFragment(), Preference.OnPreferenceClickListener { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + init() + initNavigationPrefs() + } + + private fun initNavigationPrefs() { + + + } + + private fun init() { + addPreferencesFromResource(R.xml.staff_attendance_preferences) + val formattedAppName = getString(R.string.app_name) + " " + BuildConfig.VERSION_NAME + findPreference(KEY_APP_UPDATE).title = formattedAppName + + findPreference(KEY_APP_UPDATE).onPreferenceClickListener = this + findPreference(KEY_LOGOUT).onPreferenceClickListener = this + } + + + override fun onPreferenceClick(preference: Preference): Boolean { + when (preference.key) { + KEY_APP_UPDATE -> { + try { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse("market://details?id" + BuildConfig.APPLICATION_ID) + startActivity(intent) + } catch (anfe: android.content.ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}"))) + } + } + KEY_LOGOUT -> logoutConfirmDialog() + } + return false + } + + private fun logoutConfirmDialog() { + val a = DatabaseHelper.getDatabaseHelper().getNewStaffCount(DatabaseHelper.getDatabaseHelper().writableDatabase) + val b = DatabaseHelper.getDatabaseHelper().getFinalizedCount(DatabaseHelper.getDatabaseHelper().writableDatabase) + + if (a + b > 0) run { + var msg = "If you logout all your account data including" + if (a > 0) msg += String.format(Locale.US, "%d un-synced staff(s)", a) + if (b > 0) msg += String.format(Locale.US, "\n %d finalized attendance(s)", b) + msg += "\nwill be deleted." + val btnText = "Delete and logout"; + + DialogFactory.createActionDialog(activity, "Caution", msg) + .setPositiveButton(btnText) { dialogInterface, i -> + dialogInterface.dismiss() + clearCache() + } + .setNegativeButton("Dismiss") { dialogInterface, i -> dialogInterface.dismiss() } + .create() + .show() + } else { + clearCache() + } + + + } + + fun clearCache() { + + TokenMananger.clearToken() + SharedPreferenceUtils.purge(activity) + DatabaseHelper.getDatabaseHelper().delteAllRows(DatabaseHelper.getDatabaseHelper().writableDatabase) + LoginActivity.start(activity) + activity.finish() + } + +} \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/settings/SettingsActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/settings/SettingsActivity.kt new file mode 100644 index 0000000..3b5bf9a --- /dev/null +++ b/app/src/main/java/np/com/naxa/staffattendance/settings/SettingsActivity.kt @@ -0,0 +1,46 @@ +package np.com.naxa.staffattendance.settings + +import android.content.Context +import android.content.Intent +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.view.MenuItem +import kotlinx.android.synthetic.main.activity_dashboard_attedance.* +import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.attedancedashboard.AttendancesDashboardActivity + +class SettingsActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_settings) + + setupToolbar(title = getString(R.string.title_activity_settings)) + } + + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item?.itemId) { + android.R.id.home -> onBackPressed(); + } + return super.onOptionsItemSelected(item) + } + + private fun setupToolbar(title: String) { + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowTitleEnabled(false) + supportActionBar?.title = "" + supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_toolbar_back) + tv_screen_name.text = title + + } + + + companion object { + fun newIntent(context: Context): Intent { + val intent = Intent(context, SettingsActivity::class.java) + return intent + } + } +} diff --git a/app/src/main/res/layout/activity_login_page.xml b/app/src/main/res/layout/activity_login_page.xml index 44e35b9..d7d71b4 100644 --- a/app/src/main/res/layout/activity_login_page.xml +++ b/app/src/main/res/layout/activity_login_page.xml @@ -14,6 +14,7 @@ android:paddingRight="@dimen/spacing_large"> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 0e29dba78af5ce9f8b31af5725f4d406a3f6072b..14fd04de5a5acdf5dec3eafc1870da065deb5fd5 100644 GIT binary patch literal 3706 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 11d6ff5f7ca37cc9c7642a3d3e0e28151cd7e7e6..cb05f91ddfd9a83e125791c6eb19611c2081b139 100644 GIT binary patch literal 4932 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 X$;(*JNl}~=00000NkvXXu0mjfFQcu? diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 976c1c9d7fc1ddc6bbc7e01d9b6fae8dfeeaf441..1fd199d5389510eddaaee8568728f888defa02e4 100644 GIT binary patch literal 9945 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 R3AC)CDaon6tp%G${14SL!PNi& literal 5878 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index ddacc562d981104506d6eaffe1431e3f7cf4b04a..fb6618eec0ae67132443d9ccd81d04fa8b774339 100644 GIT binary patch literal 13857 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 Uyx89c?$bePPqg60O6CFo3ud??Q~&?~ diff --git a/app/src/main/res/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..14fd04de5a5acdf5dec3eafc1870da065deb5fd5 GIT binary patch literal 3706 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cb05f91ddfd9a83e125791c6eb19611c2081b139 GIT binary patch literal 4932 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 R3AC)CDaon6tp%G${14SL!PNi& literal 0 HcmV?d00001 diff --git a/app/src/main/res/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6618eec0ae67132443d9ccd81d04fa8b774339 GIT binary patch literal 13857 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 - FS Staff Attendance + Attendance Select an option @@ -96,6 +96,7 @@ Attendance Cancel NEXT + Dismiss diff --git a/app/src/main/res/web_hi_res_512.png b/app/src/main/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..4a525ba3c1fd3e7122f874af48b2815e3ba57d52 GIT binary patch literal 103774 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
  • BL zP#6JgxB*^*5W4jw*51e%xL&y!AnNDe$b+BY@G}T*zYGu{UAfJi(3`;$zeD?R5YOeK z(EQng6eU2cgG#)t+M{Y*jgIy85hV+OO|P<@&$t+8)e_sn#%}_-nnEoK=Lsg8Cc?Ue zzLv$hVMTVSzWrj*G}xnDBS?%pasxc>k}_FkbK5vYeYO%epul`bv^go_)@L*Hm@cNT z3~l3K{im}QD=&qchs{Hb(jqd39=D(BeoSD8=*>@lSZVue<7TD9&#S66&@C_NVR9x> zIwN0bT(;Dy)(}8vCG=uNB5Xx+#vU-l!7125o9=<~ILNCZ2Tbny3HLrrj@vtz$6j^W zlv8ziWjugG^J@!LZd}8npa4riI7_wpR{5kH`lOVjQ{jwPr(z-1r$Vw%RKb*j>M8{5 z@H901b$^AD$*XGLQwLR;ivoo;sF#&WFy*{8y+2oEL80kqC~j%!pEKdEy(ctc#^&L} z@&;Xif~%@bj3K>dN}63It>6~WlR#r45z@7`+aGQ)8`rPg9t@VLy^{R{XjX0V9*i^R zo4Z)QE>@0-F4ZNr@vhjg+FN6gUT)d2M#Id$U1v2h6tH$}Ooj>JiApLw%a^E4c%YLu2}T_)|wzgPxRO>!1Ft2dpGc&{=Y`4g91d(eL_xk zKZoGIX!Qd?`gOP%ql&`cyu!jX)55CdfJA7RPmOx;!OEWZ25sT!A*ex0Daf}I3e0Jl z?gpH&;@+l9FvAGmyLpM-e{xsDp8aSx7;r8yXSeVwb`R%OzP9t_s%lm%FHc<(yaV;n z^GjTS(kiDYJJ1@&3U*R!9j2A_p9}=1^S6MuWyl9+T>oW_UeE7vc{)-B+7r6SC?nKe zWK5OS?in3&SG9@Mc^hK5V->Tek94PxWR{sdEMYF;=S%m&j)ju`A8uP5zh9Txu1T+f z1odvbE$aJ1O~41|t8ItFv{m8-pBfv_<_Rj~rTHHwI+wH9=BC8hR2q znuJRbjyjNgAttyX=eq+OmiT)Jt>}4y;hRwVX$~Qki5saN|4U#}4{#Yfc$h>*q7Z39 z?K|FP`{CGqq+RjvP>BuI-AU(B@i1R@1UTGM>*L%C8WVLYkGK8lY05sNg5R91w4}O?4%U|@$_(G+w#{KKIjTn7MRsn}h~s`egG#oKBF~)Ii3B@nsVccE(dWsl?@(&BxC?Ykh#v z`BNSyPkKx^8M!_?9F}C?btR7qbbWSlG+box$Tqlun9gv$8C5}(OJ!|A!BrL?<5Y;# zozU_)MdHRSlj+&kwerp|(EaS7@ThMy?l0j@H0iH}le7vIQS0JKIj_d>IR%R7)76<@ zZcYs~(HxpYeBSLL@*en5i(|*VzSI5JIh*~*NS;e66Jo4(?A3{(F2Yt5ZS!{j4Y@dC zv1b29T~rbXt@u;7c#(L-lZz?;4Ck16CZAl+l9wBNp9z4)?j=vYee{GW+yuW?W z%N#(Id%_5~g{mQHOfL;BFDtN8v8Q|={8}X5e-$_Ff8Ts--+SnuIW8RtLl2jOYPr@q zd>WipZuPyr^0+P)j+OGk&H_89&#ZXFq^RImdi|4%zM??)goc@Per9qWhk*Xo4y3%G zi01_;y>*n)sdFZE?2qu0GS($_R>jLEoBa&!UE~HOn><>!^)3VeZ?#EBs5g#en}=z0|=c4 z==dPG#e0=tNr7d>0hK|d>Ba)6=Bykb#Na*O`` zi}|-ap3PmR(1qkZJg~2P;MKvDZgxCd{(jl=#_R4{^c?NDQNOVWnm=0O`}3MD)pNJ^ zACT2#&uki5OL<;*-e9ab#hc?7T|C~`g+~C#n}lWovIE;Pp%DkxA80N!qbFP{wLZ;j z7?}azpE<-Jw-;l~v%>sYX5bQK�_-B>>of?|DCx(YVI4XsgX9(#s1-+d93p29&Jb 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 aPtPo + + + + + + + + \ No newline at end of file From 895f7be224f5df20952982ea0c55c6bf9223b0a0 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Mon, 24 Jun 2019 16:38:23 +0545 Subject: [PATCH 15/23] [#5] hides checkin checkout ui --- .../staffattendance/StaffListAdapter.java | 6 +++- .../AttendancesDashboardActivity.kt | 5 ++- app/src/main/res/layout/staff_list_row.xml | 31 +++++++++++++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java b/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java index c1ddfdc..e960628 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java +++ b/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java @@ -67,6 +67,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int pos staffVH.rootLayout.setEnabled(enablePersonSelection); staffVH.staffName.setText(staff.getFirstName()); + staffVH.staffPost.setText(staff.getTeamName()); staffVH.iconText.setVisibility(View.VISIBLE); staffVH.imgProfile.setImageResource(R.drawable.circle_blue); @@ -168,6 +169,7 @@ private void applyIconAnimation(StaffVH holder, int position, boolean shouldHigh holder.staffStatus.setText(holder.rootLayout.getContext().getString(R.string.attedance_absent)); + holder.rootLayout.setActivated(!shouldHightlight); holder.iconBack.setVisibility(View.GONE); resetIconYAxis(holder.iconFront); @@ -226,12 +228,13 @@ public ArrayList getSelectedStaffID() { public class StaffVH extends RecyclerView.ViewHolder { - private TextView staffName, staffStatus, siteAddress, sitePhone, staffType, sitePendingFormsNumber, site, iconText, timestamp, tvTagOfflineSite; + private TextView staffName, staffStatus, siteAddress, sitePhone, staffType, sitePendingFormsNumber, site, iconText, timestamp, tvTagOfflineSite,staffPost; private ImageView iconImp, imgProfile; private RelativeLayout iconContainer, iconBack, iconFront; private RelativeLayout rootLayout; private CardView card; + public StaffVH(View view) { super(view); card = view.findViewById(R.id.card_site_lst_row); @@ -242,6 +245,7 @@ public StaffVH(View view) { staffStatus = view.findViewById(R.id.staff_list_row_status); staffName = view.findViewById(R.id.staff_list_row_name); + staffPost = view.findViewById(R.id.staff_list_row_post); siteAddress = view.findViewById(R.id.staff_list_row_email); sitePhone = view.findViewById(R.id.staff_list_row_phone); staffType = view.findViewById(R.id.staff_list_row_type); diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 190db28..bb9fe07 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -20,6 +20,7 @@ import np.com.naxa.staffattendance.utlils.DateConvertor import np.com.naxa.staffattendance.utlils.ToastUtils import java.util.concurrent.TimeUnit + class AttendancesDashboardActivity : AppCompatActivity() { private var exitOnBackPress: Boolean = false; @@ -50,7 +51,9 @@ class AttendancesDashboardActivity : AppCompatActivity() { list.add(AddItemButton(UIConstants.UUID_GRID_ITEM_TEAM_MEMBER)) list.add(getString(R.string.title_attedance)) list.add("") - for (x in -6 until 1 step 1) { + + + for (x in 1 downTo -6 step 1) { val date = DateConvertor.getPastDate(x) val yearMonthDay = DateConvertor.getYearMonthDay(date); list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], diff --git a/app/src/main/res/layout/staff_list_row.xml b/app/src/main/res/layout/staff_list_row.xml index e85b169..c58e548 100644 --- a/app/src/main/res/layout/staff_list_row.xml +++ b/app/src/main/res/layout/staff_list_row.xml @@ -18,10 +18,25 @@ android:padding="@dimen/spacing_large"> + + + + + + style="@style/TextAppearance.AppCompat.Caption" + android:layout_marginEnd="@dimen/spacing_medium" /> From 40315c1e56aa8d8023fc75e77d7ed2ea76f3e638 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Tue, 25 Jun 2019 13:15:58 +0545 Subject: [PATCH 16/23] [#5] changed slider text for scanner --- app/src/main/res/values/arrays.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 88a8fdf..0c8052f 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,15 +1,14 @@ - Scan Card - Scan Fingerprint - Finish + Fingerprint + Success - We are ready to scan your card - Card verified! Let\'s scan your fingerprint - We have recorded your attendance + We are ready to scan your card. + Card verified! Verify your fingerprint. + Attendance recorded successfully! \ No newline at end of file From d1a3c20de5e52ec7e255ebd6e0b11ecfba23f4c7 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Tue, 25 Jun 2019 17:49:01 +0545 Subject: [PATCH 17/23] [#5] adds swipe to refresh in dashboard --- .../staffattendance/StaffListAdapter.java | 2 +- .../AttendancesDashboardActivity.kt | 83 ++++++++++++++++++- .../attendence/TeamMemberResposne.java | 15 +++- .../attendence/TeamMemberResposneBuilder.java | 8 +- .../database/DatabaseHelper.java | 5 +- .../staffattendance/database/NewStaffDao.java | 1 + .../staffattendance/database/StaffDao.java | 4 +- .../newstaff/NewStaffActivity.java | 1 + .../staffattendance/pojo/NewStaffPojo.java | 9 +- .../pojo/NewStaffPojoBuilder.java | 8 +- .../layout/activity_dashboard_attedance.xml | 22 +++-- 11 files changed, 140 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java b/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java index e960628..bee769d 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java +++ b/app/src/main/java/np/com/naxa/staffattendance/StaffListAdapter.java @@ -67,7 +67,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int pos staffVH.rootLayout.setEnabled(enablePersonSelection); staffVH.staffName.setText(staff.getFirstName()); - staffVH.staffPost.setText(staff.getTeamName()); + staffVH.staffPost.setText(staff.getDesignationLabel()); staffVH.iconText.setVisibility(View.VISIBLE); staffVH.imgProfile.setImageResource(R.drawable.circle_blue); diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index bb9fe07..3a8a872 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -1,5 +1,6 @@ package np.com.naxa.staffattendance.attedancedashboard +import android.app.ProgressDialog import android.content.Context import android.content.Intent import android.os.Bundle @@ -12,12 +13,24 @@ import android.view.Menu import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* import np.com.naxa.staffattendance.R +import np.com.naxa.staffattendance.TeamRemoteSource +import np.com.naxa.staffattendance.attendence.AttendanceViewPagerActivity import np.com.naxa.staffattendance.common.UIConstants import np.com.naxa.staffattendance.database.StaffDao import np.com.naxa.staffattendance.database.TeamDao import np.com.naxa.staffattendance.settings.SettingsActivity import np.com.naxa.staffattendance.utlils.DateConvertor +import np.com.naxa.staffattendance.utlils.DialogFactory +import np.com.naxa.staffattendance.utlils.NetworkUtils import np.com.naxa.staffattendance.utlils.ToastUtils +import retrofit2.adapter.rxjava.HttpException +import rx.Observer +import rx.android.schedulers.AndroidSchedulers +import rx.functions.Action0 +import rx.schedulers.Schedulers +import timber.log.Timber +import java.io.IOException +import java.net.SocketTimeoutException import java.util.concurrent.TimeUnit @@ -27,13 +40,79 @@ class AttendancesDashboardActivity : AppCompatActivity() { private val backPressHandler = Handler() private val runnable = { exitOnBackPress = false } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dashboard_attedance); - + DialogFactory.createProgressDialogHorizontal(this@AttendancesDashboardActivity, "Please Wait") setSupportActionBar(toolbar) supportActionBar?.title = "" setupListAdapter(generateGridItems()); + setupSwipeToRefresh(); + + + } + + private fun setupSwipeToRefresh() { + swiperefresh.setOnRefreshListener { + if (NetworkUtils.isInternetAvailable()) { + TeamRemoteSource.getInstance() + .syncAll() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSubscribe(Action0 { this.showPleaseWaitDialog() }) + .subscribe(object : Observer { + override fun onCompleted() { + closePleaseWaitDialog() + showMessage("Everything is Up-to-date") + Timber.i("onCompleted") + } + + override fun onError(e: Throwable) { + closePleaseWaitDialog() + if (e is HttpException) { + try { + val responseBody = e.response().errorBody() + showMessage(responseBody!!.string()) + } catch (e1: NullPointerException) { + showMessage("") + e1.printStackTrace() + } catch (e1: IOException) { + showMessage("") + e1.printStackTrace() + } + + } else if (e is SocketTimeoutException) { + showMessage("Server took too long to respond") + } else if (e is IOException) { + showMessage(e.message.toString()) + } else { + showMessage(e.message.toString()) + } + } + + override fun onNext(o: Any) { + + } + }) + + } else { + ToastUtils.showLong(getString(R.string.no_internet)) + } + } + } + + private fun showPleaseWaitDialog() { + swiperefresh.isRefreshing = true; + } + + private fun showMessage(message: String) { + ToastUtils.showLong(message) + swiperefresh.isRefreshing = false; + } + + private fun closePleaseWaitDialog() { + swiperefresh.isRefreshing = false; } private fun generateGridItems(): ArrayList { @@ -53,7 +132,7 @@ class AttendancesDashboardActivity : AppCompatActivity() { list.add("") - for (x in 1 downTo -6 step 1) { + for (x in 1 downTo -6 step 1) { val date = DateConvertor.getPastDate(x) val yearMonthDay = DateConvertor.getYearMonthDay(date); list.add(element = AttendanceDay(dayOfWeek = yearMonthDay[2], diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java index 667e873..45c4c84 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposne.java @@ -60,6 +60,10 @@ public class TeamMemberResposne implements Serializable { @Expose private Object bank; + @SerializedName("designation_label") + private String designationLabel; + + public String getId() { return id; } @@ -77,7 +81,10 @@ public String getTeamID() { } - public TeamMemberResposne(String teamID, String teamName, String id, String firstName, String lastName, Object email, Integer gender, String ethnicity, String address, String phoneNumber, String bankName, String accountNumber, String photo, Integer designation, Object dateOfBirth, Object contractStart, Object contractEnd, Object bank, String IDPassDID) { + public TeamMemberResposne(String teamID, String teamName, String id, String firstName, String lastName, + Object email, Integer gender, String ethnicity, String address, String phoneNumber, + String bankName, String accountNumber, String photo, Integer designation, Object dateOfBirth, + Object contractStart, Object contractEnd, Object bank, String IDPassDID,String designationLabel) { this.teamID = teamID; this.teamName = teamName; this.id = id; @@ -96,8 +103,14 @@ public TeamMemberResposne(String teamID, String teamName, String id, String firs this.contractStart = contractStart; this.contractEnd = contractEnd; this.bank = bank; + this.designationLabel = designationLabel; } + public String getDesignationLabel() { + return designationLabel; + } + + public String getIDPassDID() { return IDPassDID; diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposneBuilder.java b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposneBuilder.java index 25471a8..3e84776 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposneBuilder.java +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/TeamMemberResposneBuilder.java @@ -20,6 +20,7 @@ public class TeamMemberResposneBuilder { private Object contractEnd; private Object bank; private String IDPassDID; + private String designationLabel; public TeamMemberResposneBuilder setTeamID(String teamID) { this.teamID = teamID; @@ -116,7 +117,12 @@ public TeamMemberResposneBuilder setIDPassDID(String IDPassDID) { return this; } + public TeamMemberResposneBuilder setDesignationLabel(String designationLabel) { + this.designationLabel = designationLabel; + return this; + } + public TeamMemberResposne createTeamMemberResposne() { - return new TeamMemberResposne(teamID, teamName, id, firstName, lastName, email, gender, ethnicity, address, phoneNumber, bankName, accountNumber, photo, designation, dateOfBirth, contractStart, contractEnd, bank,IDPassDID); + return new TeamMemberResposne(teamID, teamName, id, firstName, lastName, email, gender, ethnicity, address, phoneNumber, bankName, accountNumber, photo, designation, dateOfBirth, contractStart, contractEnd, bank,IDPassDID,designationLabel); } } \ No newline at end of file diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java index 8af24ff..ba12dd1 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java @@ -19,7 +19,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { public static final String LOG = "DatabaseHelper"; // Database Version - public static final int DATABASE_VERSION = 6; + public static final int DATABASE_VERSION = 7; // Database Name public static final String DATABASE_NAME = "staffManager2"; @@ -43,6 +43,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { //New Staff Column names public static final String KEY_STAFF_DESIGNATION = "designation"; + public static final String KEY_STAFF_DESIGNATION_LABEL = "designation_label"; public static final String KEY_STAFF_FIRST_NAME = "first_name"; public static final String KEY_STAFF_LAST_NAME = "last_name"; public static final String KEY_STAFF_DOB = "dob"; @@ -77,6 +78,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { KEY_STAFF_TEAM_NAME + " TEXT," + KEY_STAFF_FULL_NAME + " TEXT," + KEY_ID_PASS + " TEXT," + + KEY_STAFF_DESIGNATION_LABEL + " TEXT," + KEY_STAFF_TYPE + " INTEGER," + KEY_CREATED_BY + " INTEGER," + KEY_CREATED_AT + " DATETIME," + @@ -105,6 +107,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { KEY_ID + " INTEGER PRIMARY KEY," + KEY_ID_PASS + " TEXT," + KEY_STAFF_DESIGNATION + " INTEGER," + + KEY_STAFF_DESIGNATION_LABEL + " TEXT," + KEY_STAFF_FIRST_NAME + " TEXT," + KEY_STAFF_LAST_NAME + " TEXT," + KEY_STAFF_DOB + " TEXT," + diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/NewStaffDao.java b/app/src/main/java/np/com/naxa/staffattendance/database/NewStaffDao.java index 582a08d..a758c16 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/NewStaffDao.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/NewStaffDao.java @@ -58,6 +58,7 @@ private NewStaffPojo mapCursorToPojo(Cursor cursor) { return new NewStaffPojoBuilder() .setDesignation(Integer.valueOf(DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_DESIGNATION))) + .setDesignationLabel(DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_DESIGNATION_LABEL)) .setFirstName(DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_FIRST_NAME)) .setLastName(DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_LAST_NAME)) .setDateOfBirth(DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_DOB)) diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java b/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java index b233912..00304f5 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java @@ -70,11 +70,11 @@ public void saveStafflist(final List staffs) { private ContentValues getContentValuesFronSaff(TeamMemberResposne staff) { ContentValues contentValues = new ContentValues(); contentValues.put(DatabaseHelper.KEY_STAFF_FULL_NAME, staff.getFirstName().concat(" ").concat(staff.getLastName())); - contentValues.put(DatabaseHelper.KEY_STAFF_TYPE, StaffAttendance.getStaffAttendance().getString(R.string.not_avaliable, "Staff type")); contentValues.put(DatabaseHelper.KEY_ID, staff.getId()); contentValues.put(DatabaseHelper.KEY_STAFF_TEAM_ID, staff.getTeamID()); contentValues.put(DatabaseHelper.KEY_STAFF_TEAM_NAME, staff.getTeamName()); contentValues.put(DatabaseHelper.KEY_ID_PASS, staff.getIDPassDID()); + contentValues.put(DatabaseHelper.KEY_STAFF_DESIGNATION_LABEL, staff.getDesignation()); return contentValues; } @@ -108,6 +108,7 @@ public ArrayList getStaffFromCursor(Cursor cursor) { String staffId = DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_ID); String staffName = DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_FULL_NAME); String IDPassDID = DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_ID_PASS); + String designationLabel = DatabaseHelper.getStringFromCursor(cursor, DatabaseHelper.KEY_STAFF_DESIGNATION_LABEL); TeamMemberResposne staff = new TeamMemberResposneBuilder() .setTeamID(teamID) @@ -115,6 +116,7 @@ public ArrayList getStaffFromCursor(Cursor cursor) { .setId(staffId) .setIDPassDID(IDPassDID) .setFirstName(staffName) + .setDesignationLabel(designationLabel) .createTeamMemberResposne(); staffs.add(staff); diff --git a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java index 1b2548f..478c0f8 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java +++ b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java @@ -441,6 +441,7 @@ public NewStaffPojo getNewStaffDetail() { .setContractEnd(contractEndDate.getText().toString()) .setPhoto(getPhotoLocation()) .setStatus(NewStaffDao.SAVED) + .setDesignationLabel(designation.getSelectedItem().toString()) .createNewStaffPojo(); } diff --git a/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojo.java b/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojo.java index bbdefcd..a9c427d 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojo.java +++ b/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojo.java @@ -57,8 +57,13 @@ public class NewStaffPojo { private String status; + @SerializedName("designation_label") + private String designationLabel; - public NewStaffPojo(String id, Integer designation, String firstName, String lastName, String dateOfBirth, Integer gender, String ethnicity, Integer bank, String bankName, String accountNumber, String phoneNumber, String email, String address, String contractStart, String contractEnd, String photo, String status) { + + public NewStaffPojo(String id, Integer designation, String firstName, String lastName, String dateOfBirth, Integer gender, + String ethnicity, Integer bank, String bankName, String accountNumber, String phoneNumber, String email, + String address, String contractStart, String contractEnd, String photo, String status,String designationLabel) { this.id = id; this.firstName = firstName; this.lastName = lastName; @@ -76,8 +81,10 @@ public NewStaffPojo(String id, Integer designation, String firstName, String las this.contractEnd = contractEnd; this.bank = bank; this.status = status; + this.designationLabel = designationLabel; } + public String getId() { return id; } diff --git a/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojoBuilder.java b/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojoBuilder.java index 9751c1f..0132797 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojoBuilder.java +++ b/app/src/main/java/np/com/naxa/staffattendance/pojo/NewStaffPojoBuilder.java @@ -18,6 +18,7 @@ public class NewStaffPojoBuilder { private String photo; private String status; private String id; + private String designationLabel; public NewStaffPojoBuilder setDesignation(Integer designation) { this.designation = designation; @@ -105,8 +106,13 @@ public NewStaffPojoBuilder setStatus(String status) { return this; } + public NewStaffPojoBuilder setDesignationLabel(String designationLabel) { + this.designationLabel = designationLabel; + return this; + } + public NewStaffPojo createNewStaffPojo() { - return new NewStaffPojo(id, designation, firstName, lastName, dateOfBirth, gender, ethnicity, bank, bankName, accountNumber, phoneNumber, email, address, contractStart, contractEnd, photo, status); + return new NewStaffPojo(id, designation, firstName, lastName, dateOfBirth, gender, ethnicity, bank, bankName, accountNumber, phoneNumber, email, address, contractStart, contractEnd, photo, status,designationLabel); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dashboard_attedance.xml b/app/src/main/res/layout/activity_dashboard_attedance.xml index 0f3932c..ddce794 100644 --- a/app/src/main/res/layout/activity_dashboard_attedance.xml +++ b/app/src/main/res/layout/activity_dashboard_attedance.xml @@ -17,13 +17,13 @@ + android:text="@string/dashboard" + android:textColor="@color/white" /> - - - + android:layout_height="match_parent"> + + + \ No newline at end of file From 9d4b42b20c09db3ea371b96853f12849b998d213 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Tue, 25 Jun 2019 18:05:32 +0545 Subject: [PATCH 18/23] [#5] disabled swiperefresh in attedance --- .../com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt | 1 + .../java/np/com/naxa/staffattendance/database/StaffDao.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt index 7e7a0e0..9ebb3a9 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -58,6 +58,7 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe setupToolbar(title = teamName) setupRecyclerView() + swiperefresh.isEnabled = false } diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java b/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java index 00304f5..9d967bf 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/StaffDao.java @@ -74,7 +74,7 @@ private ContentValues getContentValuesFronSaff(TeamMemberResposne staff) { contentValues.put(DatabaseHelper.KEY_STAFF_TEAM_ID, staff.getTeamID()); contentValues.put(DatabaseHelper.KEY_STAFF_TEAM_NAME, staff.getTeamName()); contentValues.put(DatabaseHelper.KEY_ID_PASS, staff.getIDPassDID()); - contentValues.put(DatabaseHelper.KEY_STAFF_DESIGNATION_LABEL, staff.getDesignation()); + contentValues.put(DatabaseHelper.KEY_STAFF_DESIGNATION_LABEL, staff.getDesignationLabel()); return contentValues; } From b744ec3dbc92d1408b5b5fc587f5f2b84d39df48 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Fri, 28 Jun 2019 13:17:23 +0545 Subject: [PATCH 19/23] [#5] removes bottombar --- .../naxa/staffattendance/database/DatabaseHelper.java | 1 - .../staffattendance/newstaff/NewStaffActivity.java | 8 ++------ app/src/main/res/layout/activity_new_staff.xml | 11 +---------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java index e0a1d24..a326217 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java +++ b/app/src/main/java/np/com/naxa/staffattendance/database/DatabaseHelper.java @@ -80,7 +80,6 @@ public class DatabaseHelper extends SQLiteOpenHelper { KEY_STAFF_TEAM_ID + " TEXT," +//todo if team will have more attr than name and id, make new team table KEY_STAFF_TEAM_NAME + " TEXT," + KEY_STAFF_FULL_NAME + " TEXT," + - KEY_ID_PASS + " TEXT," + KEY_STAFF_DESIGNATION_LABEL + " TEXT," + KEY_STAFF_TYPE + " INTEGER," + KEY_CREATED_BY + " INTEGER," + diff --git a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java index 1900abd..327482f 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java +++ b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java @@ -77,7 +77,7 @@ public class NewStaffActivity extends AppCompatActivity implements View.OnClickL private DatePickerDialog.OnDateSetListener date; private ArrayAdapter spinnerAdapter; private File photoFileToUpload; - private BottomNavigationView bottomNavigationView; + private Gson gson; private Dialog msgDialog; private TextView idpassValue; @@ -107,8 +107,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { initSpinners(); - bottomNavigationView.setSelectedItemId(R.id.action_add_staff); - bottomNavigationView.setOnNavigationItemSelectedListener(this); } @@ -290,8 +288,7 @@ private void initUI() { idpassEnroll = findViewById(R.id.idpass_enroll); save = findViewById(R.id.staff_save); create = findViewById(R.id.staff_send); - bottomNavigationView = (BottomNavigationView) - findViewById(R.id.bottom_navigation); + } private void initListeners() { @@ -565,7 +562,6 @@ public void onImagePicked(File photoFileToUpload, EasyImage.ImageSource source, @Override public void onBackPressed() { - AttendanceViewPagerActivity.start(this, false); finish(); } diff --git a/app/src/main/res/layout/activity_new_staff.xml b/app/src/main/res/layout/activity_new_staff.xml index 7647111..d300499 100644 --- a/app/src/main/res/layout/activity_new_staff.xml +++ b/app/src/main/res/layout/activity_new_staff.xml @@ -43,14 +43,5 @@ - + From a04faeb0602a4ba708df1cedab27c8bfc22be785 Mon Sep 17 00:00:00 2001 From: Nishon Tandukar Date: Fri, 28 Jun 2019 13:44:23 +0545 Subject: [PATCH 20/23] [#5] refactored staff form design --- .../AttendancesDashboardActivity.kt | 4 +- .../attendence/v2/AttedanceActivity.kt | 9 -- .../staffattendance/common/BaseActivity.kt | 19 ++++ .../newstaff/NewStaffActivity.java | 103 +++++++++++++++--- .../main/res/layout/activity_login_page.xml | 2 +- .../main/res/layout/activity_new_staff.xml | 48 +++++--- .../main/res/layout/staff_data_edit_form.xml | 16 ++- app/src/main/res/values/styles.xml | 2 +- 8 files changed, 157 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt index 3a8a872..e0cc599 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attedancedashboard/AttendancesDashboardActivity.kt @@ -47,8 +47,8 @@ class AttendancesDashboardActivity : AppCompatActivity() { DialogFactory.createProgressDialogHorizontal(this@AttendancesDashboardActivity, "Please Wait") setSupportActionBar(toolbar) supportActionBar?.title = "" - setupListAdapter(generateGridItems()); - setupSwipeToRefresh(); + setupListAdapter(generateGridItems()) + setupSwipeToRefresh() } diff --git a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt index 9ebb3a9..9a3d746 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/attendence/v2/AttedanceActivity.kt @@ -62,15 +62,6 @@ class AttedanceActivity : BaseActivity(), StaffListAdapter.OnStaffItemClickListe } - private fun setupToolbar(title: String) { - setSupportActionBar(toolbar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - supportActionBar?.setDisplayShowTitleEnabled(false) - supportActionBar?.title = "" - supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_toolbar_back) - tv_screen_name.text = title - - } override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { diff --git a/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt b/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt index f1cbe7c..5cab93c 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt +++ b/app/src/main/java/np/com/naxa/staffattendance/common/BaseActivity.kt @@ -2,7 +2,9 @@ package np.com.naxa.staffattendance.common import android.os.Bundle import android.support.v7.app.AppCompatActivity +import android.view.MenuItem import kotlinx.android.synthetic.main.activity_dashboard_attedance.* +import np.com.naxa.staffattendance.R open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -10,6 +12,23 @@ open class BaseActivity : AppCompatActivity() { } + protected fun setupToolbar(title: String) { + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowTitleEnabled(false) + supportActionBar?.title = "" + supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_toolbar_back) + tv_screen_name.text = title + + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item?.itemId) { + android.R.id.home -> onBackPressed(); + } + return super.onOptionsItemSelected(item) + } + } diff --git a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java index 327482f..accfd42 100644 --- a/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java +++ b/app/src/main/java/np/com/naxa/staffattendance/newstaff/NewStaffActivity.java @@ -8,13 +8,16 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.BottomNavigationView; import android.support.design.widget.TextInputLayout; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; @@ -24,6 +27,7 @@ import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; +import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; @@ -41,6 +45,7 @@ import java.util.Calendar; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Random; import np.com.naxa.staffattendance.FormCall; @@ -49,6 +54,7 @@ import np.com.naxa.staffattendance.attendence.AttendanceViewPagerActivity; import np.com.naxa.staffattendance.attendence.TeamMemberResposne; import np.com.naxa.staffattendance.attendence.TeamMemberResposneBuilder; +import np.com.naxa.staffattendance.common.BaseActivity; import np.com.naxa.staffattendance.database.NewStaffDao; import np.com.naxa.staffattendance.database.StaffDao; import np.com.naxa.staffattendance.database.TeamDao; @@ -62,7 +68,7 @@ import rx.Observer; import timber.log.Timber; -public class NewStaffActivity extends AppCompatActivity implements View.OnClickListener, BottomNavigationView.OnNavigationItemSelectedListener { +public class NewStaffActivity extends BaseActivity implements View.OnClickListener, BottomNavigationView.OnNavigationItemSelectedListener { private int IDENTIFY_RESULT_INTENT = 1; private Spinner bank, designation; @@ -84,6 +90,7 @@ public class NewStaffActivity extends AppCompatActivity implements View.OnClickL DatePickerDialog datePickerDialog; private String idPassDID; + private ScrollView scrollView; public static void start(Context context, boolean disableTrasition) { Intent intent = new Intent(context, NewStaffActivity.class); @@ -107,8 +114,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { initSpinners(); - - + setupToolbar("Add Staff"); } private void setFakeData() { @@ -288,6 +294,7 @@ private void initUI() { idpassEnroll = findViewById(R.id.idpass_enroll); save = findViewById(R.id.staff_save); create = findViewById(R.id.staff_send); + scrollView = findViewById(R.id.scrollView); } @@ -397,37 +404,100 @@ private boolean validate() { boolean validation = false; if (designation.getSelectedItem().equals(getResources().getString(R.string.default_option))) { - ToastUtils.showShort("Select a designation"); + showErrorMessage(designation, "Select a designation"); } else if (firstName.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter first name"); + showErrorMessage(firstName, "Enter first name"); } else if (lastName.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter last name"); + showErrorMessage(lastName, "Enter last name"); } else if (dob.getText().toString().isEmpty()) { - ToastUtils.showShort("Choose date of birth"); + showErrorMessage(dob, "Choose date of birth"); } else if (gender.getCheckedRadioButtonId() == -1) { - ToastUtils.showShort("Select gender"); + showErrorMessage(gender, "Select Gender"); } else if (ethinicity.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter ethnicity"); + showErrorMessage(ethinicity, "Enter ethnicity"); } else if (bank.getSelectedItem().toString().equals(getResources().getString(R.string.default_option))) { - ToastUtils.showShort("Choose a option"); + showErrorMessage(bank, "Choose a bank"); } else if (bank.getSelectedItem().toString().equals(getResources().getString(R.string.bank_other)) && bankNameOther.getText().toString().isEmpty()) { - ToastUtils.showShort("Enter bank name"); + showErrorMessage(bankNameOther, "Enter Bank name"); } else if (!bank.getSelectedItem().toString().equals(getResources().getString(R.string.default_option)) && accountNumber.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter account number"); + showErrorMessage(accountNumber, "Enter Account number"); } else if (contactNumber.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter contact number"); + showErrorMessage(contactNumber, "Enter contact number"); } else if (address.getEditText().getText().toString().isEmpty()) { - ToastUtils.showShort("Enter address"); + showErrorMessage(address, "Enter address"); + } else if (contractStartDate.getText().toString().isEmpty()) { - ToastUtils.showShort("Choose contract start date"); + + showErrorMessage(contractEndDate, "Choose contract start date"); } else if (contractEndDate.getText().toString().isEmpty()) { - ToastUtils.showShort("Choose contract end date"); + + showErrorMessage(contractEndDate, "Choose contract end date"); + } else { validation = true; } return validation; } + private void focusOnView(final ScrollView scroll, final View view) { + new Handler().post(new Runnable() { + @Override + public void run() { + int vLeft = view.getLeft(); + int vRight = view.getRight(); + int sWidth = scroll.getWidth(); + scroll.smoothScrollTo(((vLeft + vRight - sWidth) / 2), 0); + } + }); + } + + private void showErrorMessage(View view, String errorMessage) { + + if (view instanceof EditText) { + ((EditText) view).setError(errorMessage); + Objects.requireNonNull(((EditText) view)).addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + ((TextInputLayout) view).setError(null); + } + }); + + } else if (view instanceof TextInputLayout) { + ((TextInputLayout) view).setError(errorMessage); + Objects.requireNonNull(((TextInputLayout) view).getEditText()).addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + ((TextInputLayout) view).setError(null); + } + }); + } else { + ToastUtils.showShort(errorMessage); + } + + focusOnView(scrollView, view); + + } + private void getDatePicker(final EditText view) { new DatePickerDialog(this, (view1, year, month, dayOfMonth) -> { @@ -509,7 +579,6 @@ private void idpassEnroll() { } - private void showImageOptionsDialog() { final CharSequence[] options = {"Take Photo", "Choose from Gallery", "Dismiss"}; diff --git a/app/src/main/res/layout/activity_login_page.xml b/app/src/main/res/layout/activity_login_page.xml index d7d71b4..320697f 100644 --- a/app/src/main/res/layout/activity_login_page.xml +++ b/app/src/main/res/layout/activity_login_page.xml @@ -57,7 +57,7 @@ style="@style/Base.Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="right" + android:layout_gravity="end" android:layout_marginTop="@dimen/spacing_large" android:layout_marginBottom="@dimen/spacing_xxlarge" android:padding="12dp" diff --git a/app/src/main/res/layout/activity_new_staff.xml b/app/src/main/res/layout/activity_new_staff.xml index d300499..f149039 100644 --- a/app/src/main/res/layout/activity_new_staff.xml +++ b/app/src/main/res/layout/activity_new_staff.xml @@ -1,23 +1,45 @@ - + android:layout_height="match_parent"> + + + + + + + + + + + - - + app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"> - + - + diff --git a/app/src/main/res/layout/staff_data_edit_form.xml b/app/src/main/res/layout/staff_data_edit_form.xml index 92e510d..bd951b5 100644 --- a/app/src/main/res/layout/staff_data_edit_form.xml +++ b/app/src/main/res/layout/staff_data_edit_form.xml @@ -421,11 +421,21 @@ android:text="Save" android:visibility="gone" /> -