diff --git a/.idea/androidTestResultsUserPreferences.xml b/.idea/androidTestResultsUserPreferences.xml
new file mode 100644
index 0000000..263c04c
--- /dev/null
+++ b/.idea/androidTestResultsUserPreferences.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b589d56
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 674414f..1431050 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -5,16 +5,16 @@
-
+
+
-
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..fdf8d99
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 047238c..5ac489c 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
@@ -39,7 +38,7 @@
-
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 37b1ff1..8c565d6 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,8 +2,11 @@
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 7f68460..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 0e0bd08..33df36f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,15 +1,15 @@
apply plugin: 'com.android.application'
+apply plugin: 'org.jetbrains.kotlin.android'
android {
- compileSdkVersion 29
- buildToolsVersion '26.0.2'
+ compileSdkVersion 31
defaultConfig {
applicationId "com.appttude.h_mal.farmr"
minSdkVersion 21
- targetSdkVersion 29
+ targetSdkVersion 31
versionCode 1
versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
vectorDrawables.useSupportLibrary = true
}
buildTypes {
@@ -21,15 +21,16 @@ android {
}
dependencies {
- implementation 'com.android.support:support-v4:26.1.0'
- implementation 'com.android.support:support-vector-drawable:26.1.0'
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- implementation 'com.android.support:appcompat-v7:26.1.0'
- implementation 'com.android.support:design:26.1.0'
- implementation 'com.android.support.constraint:constraint-layout:1.0.2'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.vectordrawable:vectordrawable:1.0.0'
+ implementation 'androidx.core:core-ktx:1.1.0'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.ajts.androidmads.SQLite2Excel:library:1.0.2'
- testCompile 'junit:junit:4.12'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test:core-ktx:1.4.0'
+ androidTestImplementation 'androidx.test:rules:1.4.0'
}
diff --git a/app/src/androidTest/java/com/appttude/h_mal/farmr/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/appttude/h_mal/farmr/ExampleInstrumentedTest.java
deleted file mode 100644
index d660d27..0000000
--- a/app/src/androidTest/java/com/appttude/h_mal/farmr/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() throws Exception {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("com.example.h_mal.shift_tracker", appContext.getPackageName());
- }
-}
diff --git a/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftGenerator.kt b/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftGenerator.kt
new file mode 100644
index 0000000..b0c7799
--- /dev/null
+++ b/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftGenerator.kt
@@ -0,0 +1,36 @@
+package com.appttude.h_mal.farmr.data
+
+import android.icu.util.Calendar
+import com.appttude.h_mal.farmr.model.ShiftType
+import java.text.SimpleDateFormat
+import java.util.UUID
+import kotlin.random.Random
+
+
+fun getShift() = ShiftType.values().toList().shuffled().first()
+fun generateDescription() = UUID.randomUUID().toString()
+fun generatePayRate() = Random.nextDouble(0.00, 50.00)
+
+fun getRandomDate(): String {
+ val calendar = generateCalendar()
+ val format = SimpleDateFormat("yyyy-MM-dd")
+ return format.format(calendar) ?: "2010-12-28"
+}
+
+fun getRandomTime(): String {
+ val calendar = generateCalendar()
+ val format = SimpleDateFormat("hh:mm")
+ return format.format(calendar) ?: "11:00"
+}
+
+fun generateCalendar() = Calendar.getInstance().set(
+ Random.nextInt(2000, 2023),
+ Random.nextInt(12),
+ Random.nextInt(28),
+ Random.nextInt(0, 23),
+ Random.nextInt(0, 59)
+)
+
+fun getDurationInHours(timeOne: String, timeTwo: String) {
+
+}
diff --git a/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftProviderTest.kt b/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftProviderTest.kt
new file mode 100644
index 0000000..d8872a5
--- /dev/null
+++ b/app/src/androidTest/java/com/appttude/h_mal/farmr/data/ShiftProviderTest.kt
@@ -0,0 +1,259 @@
+package com.appttude.h_mal.farmr.data
+
+import android.content.ContentResolver
+import android.content.ContentValues
+import androidx.test.rule.provider.ProviderTestRule
+import com.appttude.h_mal.farmr.data.ShiftsContract.CONTENT_AUTHORITY
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry.CONTENT_URI
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry._ID
+import junit.framework.TestCase.assertEquals
+import junit.framework.TestCase.assertNull
+import org.junit.Rule
+import org.junit.Test
+
+class ShiftProviderTest {
+ @get:Rule
+ val providerRule: ProviderTestRule = ProviderTestRule
+ .Builder(ShiftProvider::class.java, CONTENT_AUTHORITY)
+ .build()
+
+ private val contentResolver: ContentResolver
+ get() = providerRule.resolver
+
+ @Test
+ fun insertEntry_queryEntry_assertEntry() {
+ // Arrange
+ val typeColumn = "Hourly"
+ val descriptionColumn = "Description string"
+ val dateColumn = "01/01/2010"
+ val timeInColumn = "09:00"
+ val timeOutColumn = "14:00"
+ val durationColumn = 4.50f
+ val breakOutColumn = 30
+ val unitColumn = 0f
+ val payrateColumn = 10.00f
+ val totalpayColumn = 45.00f
+
+ val values = ContentValues().apply {
+ put(COLUMN_SHIFT_TYPE, typeColumn)
+ put(COLUMN_SHIFT_DESCRIPTION, descriptionColumn)
+ put(COLUMN_SHIFT_DATE, dateColumn)
+ put(COLUMN_SHIFT_TIME_IN, timeInColumn)
+ put(COLUMN_SHIFT_TIME_OUT, timeOutColumn)
+ put(COLUMN_SHIFT_DURATION, durationColumn)
+ put(COLUMN_SHIFT_BREAK, breakOutColumn)
+ put(COLUMN_SHIFT_UNIT, unitColumn)
+ put(COLUMN_SHIFT_PAYRATE, payrateColumn)
+ put(COLUMN_SHIFT_TOTALPAY, totalpayColumn)
+ }
+ val projection = arrayOf(
+ _ID,
+ COLUMN_SHIFT_DESCRIPTION,
+ COLUMN_SHIFT_DATE,
+ COLUMN_SHIFT_TIME_IN,
+ COLUMN_SHIFT_TIME_OUT,
+ COLUMN_SHIFT_BREAK,
+ COLUMN_SHIFT_DURATION,
+ COLUMN_SHIFT_TYPE,
+ COLUMN_SHIFT_UNIT,
+ COLUMN_SHIFT_PAYRATE,
+ COLUMN_SHIFT_TOTALPAY)
+
+ // Act
+ contentResolver.insert(CONTENT_URI, values)
+
+ // Assert
+ val item = contentResolver.query(CONTENT_URI, projection, null, null, null)
+ item?.takeIf { it.moveToNext() }?.run {
+ val descriptionColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DESCRIPTION))
+ val dateColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DATE))
+ val timeInColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_IN))
+ val timeOutColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_OUT))
+ val durationColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_DURATION))
+ val breakOutColumnIndex = getInt(getColumnIndexOrThrow(COLUMN_SHIFT_BREAK))
+ val typeColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TYPE))
+ val unitColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_UNIT))
+ val payrateColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_PAYRATE))
+ val totalpayColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_TOTALPAY))
+
+ assertEquals(descriptionColumnIndex, descriptionColumn)
+ assertEquals(dateColumnIndex, dateColumn)
+ assertEquals(timeInColumnIndex, timeInColumn)
+ assertEquals(timeOutColumnIndex, timeOutColumn)
+ assertEquals(durationColumnIndex, durationColumn)
+ assertEquals(breakOutColumnIndex, breakOutColumn)
+ assertEquals(typeColumnIndex, typeColumn)
+ assertEquals(unitColumnIndex, unitColumn)
+ assertEquals(payrateColumnIndex, payrateColumn)
+ assertEquals(totalpayColumnIndex, totalpayColumn)
+ }
+ }
+
+ @Test
+ fun insertAndDeleteAllEntry_queryEntry_assertEntry() {
+ // Arrange
+ val typeColumn = "Hourly"
+ val descriptionColumn = "Description string"
+ val dateColumn = "01/01/2010"
+ val timeInColumn = "09:00"
+ val timeOutColumn = "14:00"
+ val durationColumn = 4.50f
+ val breakOutColumn = 30
+ val unitColumn = 0f
+ val payrateColumn = 10.00f
+ val totalpayColumn = 45.00f
+
+ val values = ContentValues().apply {
+ put(COLUMN_SHIFT_TYPE, typeColumn)
+ put(COLUMN_SHIFT_DESCRIPTION, descriptionColumn)
+ put(COLUMN_SHIFT_DATE, dateColumn)
+ put(COLUMN_SHIFT_TIME_IN, timeInColumn)
+ put(COLUMN_SHIFT_TIME_OUT, timeOutColumn)
+ put(COLUMN_SHIFT_DURATION, durationColumn)
+ put(COLUMN_SHIFT_BREAK, breakOutColumn)
+ put(COLUMN_SHIFT_UNIT, unitColumn)
+ put(COLUMN_SHIFT_PAYRATE, payrateColumn)
+ put(COLUMN_SHIFT_TOTALPAY, totalpayColumn)
+ }
+ val projection = arrayOf(
+ _ID,
+ COLUMN_SHIFT_DESCRIPTION,
+ COLUMN_SHIFT_DATE,
+ COLUMN_SHIFT_TIME_IN,
+ COLUMN_SHIFT_TIME_OUT,
+ COLUMN_SHIFT_BREAK,
+ COLUMN_SHIFT_DURATION,
+ COLUMN_SHIFT_TYPE,
+ COLUMN_SHIFT_UNIT,
+ COLUMN_SHIFT_PAYRATE,
+ COLUMN_SHIFT_TOTALPAY)
+
+ // Act
+ contentResolver.insert(CONTENT_URI, values)
+ val itemFirst = contentResolver.query(CONTENT_URI, projection, null, null, null)
+ contentResolver.delete(CONTENT_URI, null, null)
+
+ // Assert
+
+ itemFirst?.takeIf { it.moveToNext() }?.run {
+ val descriptionColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DESCRIPTION))
+ val dateColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DATE))
+ val timeInColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_IN))
+ val timeOutColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_OUT))
+ val durationColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_DURATION))
+ val breakOutColumnIndex = getInt(getColumnIndexOrThrow(COLUMN_SHIFT_BREAK))
+ val typeColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TYPE))
+ val unitColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_UNIT))
+ val payrateColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_PAYRATE))
+ val totalpayColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_TOTALPAY))
+
+ assertEquals(descriptionColumnIndex, descriptionColumn)
+ assertEquals(dateColumnIndex, dateColumn)
+ assertEquals(timeInColumnIndex, timeInColumn)
+ assertEquals(timeOutColumnIndex, timeOutColumn)
+ assertEquals(durationColumnIndex, durationColumn)
+ assertEquals(breakOutColumnIndex, breakOutColumn)
+ assertEquals(typeColumnIndex, typeColumn)
+ assertEquals(unitColumnIndex, unitColumn)
+ assertEquals(payrateColumnIndex, payrateColumn)
+ assertEquals(totalpayColumnIndex, totalpayColumn)
+ }
+ assertNull(contentResolver.query(CONTENT_URI, projection, null, null, null)?.takeIf { it.moveToNext() }?.run { getLong(getColumnIndexOrThrow(_ID)) })
+ }
+
+ @Test
+ fun insertAndDeleteSingleEntry_queryEntry_assertEntry() {
+ // Arrange
+ val typeColumn = "Hourly"
+ val descriptionColumn = "Description string"
+ val dateColumn = "01/01/2010"
+ val timeInColumn = "09:00"
+ val timeOutColumn = "14:00"
+ val durationColumn = 4.50f
+ val breakOutColumn = 30
+ val unitColumn = 0f
+ val payrateColumn = 10.00f
+ val totalpayColumn = 45.00f
+
+ val values = ContentValues().apply {
+ put(COLUMN_SHIFT_TYPE, typeColumn)
+ put(COLUMN_SHIFT_DESCRIPTION, descriptionColumn)
+ put(COLUMN_SHIFT_DATE, dateColumn)
+ put(COLUMN_SHIFT_TIME_IN, timeInColumn)
+ put(COLUMN_SHIFT_TIME_OUT, timeOutColumn)
+ put(COLUMN_SHIFT_DURATION, durationColumn)
+ put(COLUMN_SHIFT_BREAK, breakOutColumn)
+ put(COLUMN_SHIFT_UNIT, unitColumn)
+ put(COLUMN_SHIFT_PAYRATE, payrateColumn)
+ put(COLUMN_SHIFT_TOTALPAY, totalpayColumn)
+ }
+ val projection = arrayOf(
+ _ID,
+ COLUMN_SHIFT_DESCRIPTION,
+ COLUMN_SHIFT_DATE,
+ COLUMN_SHIFT_TIME_IN,
+ COLUMN_SHIFT_TIME_OUT,
+ COLUMN_SHIFT_BREAK,
+ COLUMN_SHIFT_DURATION,
+ COLUMN_SHIFT_TYPE,
+ COLUMN_SHIFT_UNIT,
+ COLUMN_SHIFT_PAYRATE,
+ COLUMN_SHIFT_TOTALPAY)
+
+ // Act
+ contentResolver.insert(CONTENT_URI, values)
+ val itemFirst = contentResolver.query(CONTENT_URI, projection, null, null, null)
+ val id = itemFirst?.takeIf { it.moveToNext() }?.run { getLong(getColumnIndexOrThrow(_ID)) }
+ contentResolver.delete(CONTENT_URI, "$_ID=?", arrayOf(id.toString()))
+
+ // Assert
+
+ itemFirst?.takeIf { it.moveToNext() }?.run {
+ val descriptionColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DESCRIPTION))
+ val dateColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_DATE))
+ val timeInColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_IN))
+ val timeOutColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TIME_OUT))
+ val durationColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_DURATION))
+ val breakOutColumnIndex = getInt(getColumnIndexOrThrow(COLUMN_SHIFT_BREAK))
+ val typeColumnIndex = getString(getColumnIndexOrThrow(COLUMN_SHIFT_TYPE))
+ val unitColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_UNIT))
+ val payrateColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_PAYRATE))
+ val totalpayColumnIndex = getFloat(getColumnIndexOrThrow(COLUMN_SHIFT_TOTALPAY))
+
+ assertEquals(descriptionColumnIndex, descriptionColumn)
+ assertEquals(dateColumnIndex, dateColumn)
+ assertEquals(timeInColumnIndex, timeInColumn)
+ assertEquals(timeOutColumnIndex, timeOutColumn)
+ assertEquals(durationColumnIndex, durationColumn)
+ assertEquals(breakOutColumnIndex, breakOutColumn)
+ assertEquals(typeColumnIndex, typeColumn)
+ assertEquals(unitColumnIndex, unitColumn)
+ assertEquals(payrateColumnIndex, payrateColumn)
+ assertEquals(totalpayColumnIndex, totalpayColumn)
+ }
+ assertNull(contentResolver.query(CONTENT_URI, projection, null, null, null)?.takeIf { it.moveToNext() }?.run { getLong(getColumnIndexOrThrow(_ID))})
+ }
+
+ private fun createContentValue() = ContentValues().apply {
+ put(COLUMN_SHIFT_TYPE, getShift().type)
+ put(COLUMN_SHIFT_DESCRIPTION, generateDescription())
+ put(COLUMN_SHIFT_DATE, getRandomDate())
+ put(COLUMN_SHIFT_TIME_IN, getRandomTime())
+ put(COLUMN_SHIFT_TIME_OUT, getRandomTime())
+ put(COLUMN_SHIFT_DURATION, 6)
+ put(COLUMN_SHIFT_BREAK, 0)
+ put(COLUMN_SHIFT_UNIT, 6)
+ put(COLUMN_SHIFT_PAYRATE, 11)
+ put(COLUMN_SHIFT_TOTALPAY, 6 * 11)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fb6eb7c..8dc1d6f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,10 +17,10 @@
+ tools:ignore="LockedOrientationActivity"
+ android:exported="true">
@@ -28,12 +28,12 @@
+ android:theme="@style/AppTheme.NoActionBar"
+ android:exported="true"/>
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftProvider.java b/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftProvider.java
deleted file mode 100644
index 964f1a8..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftProvider.java
+++ /dev/null
@@ -1,263 +0,0 @@
-package com.appttude.h_mal.farmr.Data;
-
-import android.content.ContentProvider;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.util.Log;
-
-import com.appttude.h_mal.farmr.Data.ShiftsContract.ShiftsEntry;
-
-/**
- * Created by h_mal on 26/12/2017.
- */
-
-public class ShiftProvider extends ContentProvider {
-
-
- public static final String LOG_TAG = ShiftProvider.class.getSimpleName();
-
- private static final int SHIFTS = 100;
- private static final int SHIFT_ID = 101;
-
- private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
-
- static {
-
- sUriMatcher.addURI(ShiftsContract.CONTENT_AUTHORITY, ShiftsContract.PATH_SHIFTS, SHIFTS);
-
- sUriMatcher.addURI(ShiftsContract.CONTENT_AUTHORITY, ShiftsContract.PATH_SHIFTS + "/#", SHIFT_ID);
- }
-
- ShiftsDbHelper mDbHelper;
-
- public ShiftProvider() {
-
- }
-
- @Override
- public boolean onCreate() {
- mDbHelper = new ShiftsDbHelper(getContext());
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
-
- SQLiteDatabase database = mDbHelper.getReadableDatabase();
-
- Cursor cursor;
-
- int match = sUriMatcher.match(uri);
- switch (match) {
- case SHIFTS:
-
- cursor = database.query(ShiftsEntry.TABLE_NAME, projection, selection, selectionArgs,
- null, null, sortOrder);
- break;
- case SHIFT_ID:
-
- selection = ShiftsEntry._ID + "=?";
- selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri)) };
- cursor = database.query(ShiftsEntry.TABLE_NAME, projection, selection, selectionArgs,
- null, null, sortOrder);
- break;
- default:
- throw new IllegalArgumentException("Cannot query " + uri);
- }
-
- cursor.setNotificationUri(getContext().getContentResolver(), uri);
-
- return cursor;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues contentValues) {
- final int match = sUriMatcher.match(uri);
- switch (match) {
- case SHIFTS:
- return insertShift(uri, contentValues);
- default:
- throw new IllegalArgumentException("Insertion is not supported for " + uri);
- }
- }
-
- private Uri insertShift(Uri uri, ContentValues values) {
-
- String description = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION);
- if (description == null) {
- throw new IllegalArgumentException("Description required");
- }
-
- String date = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DATE);
- if (date == null) {
- throw new IllegalArgumentException("Date required");
- }
-
- String timeIn = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_IN);
- if (timeIn == null) {
- throw new IllegalArgumentException("Time In required");
- }
-
- String timeOut = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_OUT);
- if (timeOut == null) {
- throw new IllegalArgumentException("Time Out required");
- }
-
- Float duration = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_DURATION);
- if (duration < 0) {
- throw new IllegalArgumentException("Duration cannot be negative");
- }
-
- String shiftType = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TYPE);
- if (shiftType == null) {
- throw new IllegalArgumentException("Shift type required");
- }
-
- Float shiftUnits = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_UNIT);
- if (shiftUnits < 0) {
- throw new IllegalArgumentException("Units cannot be negative");
- }
-
- Float payRate = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_PAYRATE);
- if (payRate < 0) {
- throw new IllegalArgumentException("Pay rate cannot be negative");
- }
-
- Float totalPay = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_TOTALPAY);
- if (totalPay < 0) {
- throw new IllegalArgumentException("Total Pay cannot be negative");
- }
-
- Integer breakMins = values.getAsInteger(ShiftsEntry.COLUMN_SHIFT_BREAK);
- if (breakMins < 0) {
- throw new IllegalArgumentException("Break cannot be negative");
- }
-
- SQLiteDatabase database = mDbHelper.getWritableDatabase();
-
- long id = database.insert(ShiftsEntry.TABLE_NAME, null, values);
-
- if (id == -1) {
- Log.e(LOG_TAG, "row failed " + uri);
- return null;
- }
-
- getContext().getContentResolver().notifyChange(uri, null);
-
- return ContentUris.withAppendedId(uri, id);
- }
-
- @Override
- public int update(Uri uri, ContentValues contentValues, String selection,
- String[] selectionArgs) {
- final int match = sUriMatcher.match(uri);
- switch (match) {
- case SHIFTS:
- return updateShift(uri, contentValues, selection, selectionArgs);
- case SHIFT_ID:
-
- selection = ShiftsEntry._ID + "=?";
- selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri)) };
- return updateShift(uri, contentValues, selection, selectionArgs);
- default:
- throw new IllegalArgumentException("Update is not supported for " + uri);
- }
- }
-
-
- private int updateShift(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-
- if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)) {
- String description = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION);
- if (description == null) {
- throw new IllegalArgumentException("description required");
- }
- }
-
- if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_DATE)) {
- String date = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DATE);
- if (date == null) {
- throw new IllegalArgumentException("date required");
- }
- }
-
- if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_TIME_IN)) {
- String timeIn = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_IN);
- if (timeIn == null) {
- throw new IllegalArgumentException("time in required");
- }
- }
-
- if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)) {
- String timeOut = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_OUT);
- if (timeOut == null) {
- throw new IllegalArgumentException("time out required");
- }
- }
-
- if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_BREAK)) {
- String breaks = values.getAsString(ShiftsEntry.COLUMN_SHIFT_BREAK);
- if (breaks == null) {
- throw new IllegalArgumentException("break required");
- }
- }
-
- if (values.size() == 0) {
- return 0;
- }
-
- SQLiteDatabase database = mDbHelper.getWritableDatabase();
- int rowsUpdated = database.update(ShiftsEntry.TABLE_NAME, values, selection, selectionArgs);
- if (rowsUpdated != 0) {
- getContext().getContentResolver().notifyChange(uri, null);
- }
-
- return rowsUpdated;
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase database = mDbHelper.getWritableDatabase();
-
- int rowsDeleted;
-
- final int match = sUriMatcher.match(uri);
- switch (match) {
- case SHIFTS:
- rowsDeleted = database.delete(ShiftsEntry.TABLE_NAME, selection, selectionArgs);
- break;
- case SHIFT_ID:
- selection = ShiftsEntry._ID + "=?";
- selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri)) };
- rowsDeleted = database.delete(ShiftsEntry.TABLE_NAME, selection, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("Deletion is not supported for " + uri);
- }
-
- if (rowsDeleted != 0) {
- getContext().getContentResolver().notifyChange(uri, null);
- }
-
- return rowsDeleted;
- }
-
- @Override
- public String getType(Uri uri) {
- final int match = sUriMatcher.match(uri);
- switch (match) {
- case SHIFTS:
- return ShiftsEntry.CONTENT_LIST_TYPE;
- case SHIFT_ID:
- return ShiftsEntry.CONTENT_ITEM_TYPE;
- default:
- throw new IllegalStateException("Unknown URI " + uri + " with match " + match);
- }
- }
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsContract.java b/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsContract.java
deleted file mode 100644
index 93e7151..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsContract.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.appttude.h_mal.farmr.Data;
-
-import android.content.ContentResolver;
-import android.net.Uri;
-import android.provider.BaseColumns;
-
-/**
- * Created by h_mal on 26/12/2017.
- */
-
-public class ShiftsContract {
-
- private ShiftsContract() {}
-
- public static final String CONTENT_AUTHORITY = "com.appttude.h_mal.farmr";
-
- public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
-
- public static final String PATH_SHIFTS = "shifts";
-
- public static final class ShiftsEntry implements BaseColumns {
-
- public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, PATH_SHIFTS);
-
- public static final String CONTENT_LIST_TYPE =
- ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_SHIFTS;
-
-
- public static final String CONTENT_ITEM_TYPE =
- ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_SHIFTS;
-
-
- public final static String TABLE_NAME = "shifts";
-
- public final static String TABLE_NAME_EXPORT = "shiftsexport";
-
- public final static String _ID = BaseColumns._ID;
-
- public final static String COLUMN_SHIFT_TYPE = "shifttype";
-
- public final static String COLUMN_SHIFT_DESCRIPTION = "description";
-
- public final static String COLUMN_SHIFT_DATE = "date";
-
- public final static String COLUMN_SHIFT_TIME_IN = "timein";
-
- public final static String COLUMN_SHIFT_TIME_OUT = "timeout";
-
- public final static String COLUMN_SHIFT_BREAK = "break";
-
- public final static String COLUMN_SHIFT_DURATION = "duration";
-
- public final static String COLUMN_SHIFT_UNIT = "unit";
-
- public final static String COLUMN_SHIFT_PAYRATE = "payrate";
-
- public final static String COLUMN_SHIFT_TOTALPAY = "totalpay";
-
- }
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsDbHelper.java b/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsDbHelper.java
deleted file mode 100644
index 557606f..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/Data/ShiftsDbHelper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.appttude.h_mal.farmr.Data;
-
-import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-
-import com.appttude.h_mal.farmr.Data.ShiftsContract.ShiftsEntry;
-
-/**
- * Created by h_mal on 26/12/2017.
- */
-
-public class ShiftsDbHelper extends SQLiteOpenHelper {
-
- public static final String LOG_TAG = ShiftsDbHelper.class.getSimpleName();
-
- private static final String DATABASE_NAME = "shifts.db";
-
- private static final int DATABASE_VERSION = 4;
-
- private static String DEFAULT_TEXT = "Hourly";
-
-
- public ShiftsDbHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
-
- String SQL_CREATE_PRODUCTS_TABLE = "CREATE TABLE " + ShiftsEntry.TABLE_NAME + " ("
- + ShiftsEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
- + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " TEXT NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_DATE + " DATE NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_TIME_IN + " TIME NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_TIME_OUT + " TIME NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_BREAK + " INTEGER NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_DURATION + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_TYPE + " TEXT NOT NULL DEFAULT " + DEFAULT_TEXT + ", "
- + ShiftsEntry.COLUMN_SHIFT_UNIT + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_PAYRATE + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_TOTALPAY + " FLOAT NOT NULL DEFAULT 0)";
-
-
- db.execSQL(SQL_CREATE_PRODUCTS_TABLE);
- db.execSQL(SQL_CREATE_PRODUCTS_TABLE_2);
- }
-
- private static final String SQL_CREATE_PRODUCTS_TABLE_2 = "CREATE TABLE " + ShiftsEntry.TABLE_NAME_EXPORT + " ("
- + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " TEXT NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_DATE + " DATE NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_TIME_IN + " TIME NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_TIME_OUT + " TIME NOT NULL, "
- + ShiftsEntry.COLUMN_SHIFT_BREAK + " INTEGER NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_DURATION + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_TYPE + " TEXT NOT NULL DEFAULT " + DEFAULT_TEXT + ", "
- + ShiftsEntry.COLUMN_SHIFT_UNIT + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_PAYRATE + " FLOAT NOT NULL DEFAULT 0, "
- + ShiftsEntry.COLUMN_SHIFT_TOTALPAY + " FLOAT NOT NULL DEFAULT 0)";
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion < newVersion) {
- db.execSQL(SQL_CREATE_PRODUCTS_TABLE_2);
- }
- }
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.java b/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.java
deleted file mode 100644
index 4c98c3c..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.app.DatePickerDialog;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.DatePicker;
-import android.widget.EditText;
-import android.widget.Spinner;
-
-import com.appttude.h_mal.farmr.Data.ShiftsContract;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import static com.appttude.h_mal.farmr.MainActivity.args;
-import static com.appttude.h_mal.farmr.MainActivity.selection;
-
-
-public class FilterDataFragment extends Fragment {
-
- private String[] spinnerList = new String[]{"","Hourly","Piece Rate"};
- private List listArgs = new ArrayList();
- private EditText LocationET;
- private EditText dateFromET;
- private EditText dateToET;
- private Spinner typeSpinner;
- Calendar mcurrentDate;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View rootView = inflater.inflate(R.layout.fragment_filter_data, container, false);
- MainActivity.setActionBarTitle(getString(R.string.title_activity_filter_data));
-
- mcurrentDate = Calendar.getInstance();
-
- LocationET = (EditText) rootView.findViewById(R.id.filterLocationEditText);
- dateFromET = (EditText) rootView.findViewById(R.id.fromdateInEditText);
- dateToET = (EditText) rootView.findViewById(R.id.filterDateOutEditText);
- typeSpinner = (Spinner) rootView.findViewById(R.id.TypeFilterEditText);
-
- if(selection != null && selection.contains(" AND " + ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " LIKE ?")){
- String str = args[2];
- str = str.replace("%", "");
- LocationET.setText(str);
- }
- if(selection != null && !args[0].equals("2000-01-01")){
- dateFromET.setText(args[0]);
- }
-
- if(selection != null && args != null && !args[1].equals(String.valueOf(mcurrentDate.get(Calendar.YEAR) + "-"
- + String.format("%02d", (mcurrentDate.get(Calendar.MONTH) + 1)) + "-"
- + String.format("%02d", mcurrentDate.get(Calendar.DAY_OF_MONTH))))){
- dateToET.setText(args[1]);
- }
-
- dateFromET.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //To show current date in the datepicker
-
- int mYear = mcurrentDate.get(Calendar.YEAR);
- int mMonth = mcurrentDate.get(Calendar.MONTH);
- int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);
-
- if(!dateFromET.getText().toString().equals("")) {
- String dateString = dateFromET.getText().toString().trim();
-
- mYear = Integer.parseInt(dateString.substring(0, 4));
- mMonth = Integer.parseInt(dateString.substring(5, 7));
- if (mMonth == 1){
- mMonth = 0;
- }else{
- mMonth = mMonth -1;
- }
-
- mDay = Integer.parseInt(dateString.substring(8));
- }
- DatePickerDialog mDatePicker=new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
- dateFromET.setText(
- selectedyear + "-"
- + String.format("%02d", (selectedmonth + 1)) + "-"
- + String.format("%02d", selectedday)
- );
- }
- },mYear, mMonth, mDay);
- mDatePicker.setTitle("Select date");
- mDatePicker.show(); }
- });
-
- dateToET.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //To show current date in the datepicker
- Calendar mcurrentDate = Calendar.getInstance();
- int mYear = mcurrentDate.get(Calendar.YEAR);
- int mMonth = mcurrentDate.get(Calendar.MONTH);
- int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);
-
- if(!dateToET.getText().toString().equals("")) {
- String dateString = dateToET.getText().toString().trim();
-
- mYear = Integer.parseInt(dateString.substring(0, 4));
- mMonth = Integer.parseInt(dateString.substring(5, 7));
- if (mMonth == 1){
- mMonth = 0;
- }else{
- mMonth = mMonth -1;
- }
-
- mDay = Integer.parseInt(dateString.substring(8));
- }
-
- DatePickerDialog mDatePicker=new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
- dateToET.setText(
- selectedyear + "-"
- + String.format("%02d", (selectedmonth + 1)) + "-"
- + String.format("%02d", selectedday)
- );
- }
- },mYear, mMonth, mDay);
- mDatePicker.setTitle("Select date");
- mDatePicker.show(); }
- });
-
- ArrayAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, spinnerList);
- typeSpinner.setAdapter(adapter);
- if(selection != null && selection.contains(" AND " + ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE + " IS ?")) {
- int spinnerPosition = adapter.getPosition(args[args.length-1]);
- typeSpinner.setSelection(spinnerPosition);
- }
-
- Button submit = (Button) rootView.findViewById(R.id.submitFiltered);
-
- submit.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
-
- BuildQuery();
- args = listArgs.toArray(new String[0]);
- FragmentMain.NEW_LOADER = 1;
- MainActivity.fragmentManager.popBackStack();
-
- }
- });
-
- return rootView;
- }
-
- private void BuildQuery() {
-
- String dateQuery = ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE + " BETWEEN ? AND ?";
- String descQuery = " AND " + ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " LIKE ?";
- String typeQuery = " AND " + ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE + " IS ?";
-
- String dateFrom = "2000-01-01";
-
- Date c = Calendar.getInstance().getTime();
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
- String dateTo = df.format(c);
-
- if(!TextUtils.isEmpty(dateFromET.getText().toString().trim())){
- dateFrom = dateFromET.getText().toString().trim();
- }
-
- if(!TextUtils.isEmpty(dateToET.getText().toString().trim())){
- dateTo = dateToET.getText().toString().trim();
- }
-
- selection = dateQuery;
- listArgs.add(dateFrom);
- listArgs.add(dateTo);
-
- if (!TextUtils.isEmpty(LocationET.getText().toString().trim())){
- selection = selection + descQuery;
- listArgs.add("%" + LocationET.getText().toString().trim() + "%");
- }
-
- if (!typeSpinner.getSelectedItem().toString().equals("")){
- selection = selection + typeQuery;
- listArgs.add(typeSpinner.getSelectedItem().toString());
- }
-
- }
-
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.kt
new file mode 100644
index 0000000..78945fb
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/FilterDataFragment.kt
@@ -0,0 +1,144 @@
+package com.appttude.h_mal.farmr
+
+import android.app.DatePickerDialog
+import android.os.Bundle
+import android.text.TextUtils
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ArrayAdapter
+import android.widget.Button
+import android.widget.EditText
+import android.widget.Spinner
+import androidx.fragment.app.Fragment
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+import java.text.MessageFormat
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Date
+
+class FilterDataFragment : Fragment() {
+ private val spinnerList: Array = arrayOf("", "Hourly", "Piece Rate")
+ private val listArgs: MutableList = ArrayList()
+ private var LocationET: EditText? = null
+ private var dateFromET: EditText? = null
+ private var dateToET: EditText? = null
+ private var typeSpinner: Spinner? = null
+ lateinit var mcurrentDate: Calendar
+ private lateinit var activity: MainActivity
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View {
+ val activity = (activity)
+
+ // Inflate the layout for this fragment
+ val rootView: View = inflater.inflate(R.layout.fragment_filter_data, container, false)
+ activity.setActionBarTitle(getString(R.string.title_activity_filter_data))
+ mcurrentDate = Calendar.getInstance()
+ LocationET = rootView.findViewById(R.id.filterLocationEditText) as EditText?
+ dateFromET = rootView.findViewById(R.id.fromdateInEditText) as EditText?
+ dateToET = rootView.findViewById(R.id.filterDateOutEditText) as EditText?
+ typeSpinner = rootView.findViewById(R.id.TypeFilterEditText) as Spinner?
+
+
+ if (activity.selection != null && activity.selection!!.contains(" AND " + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " LIKE ?")) {
+ var str: String = activity.args!!.get(2)
+ str = str.replace("%", "")
+ LocationET!!.setText(str)
+ }
+ if (activity.selection != null && !(activity.args!!.get(0) == "2000-01-01")) {
+ dateFromET!!.setText(activity.args!!.get(0))
+ }
+ if ((activity.selection != null) && (activity.args != null) && !(activity.args!![1] == (mcurrentDate.get(Calendar.YEAR).toString() + "-"
+ + String.format("%02d", (mcurrentDate.get(Calendar.MONTH) + 1)) + "-"
+ + String.format("%02d", mcurrentDate.get(Calendar.DAY_OF_MONTH))).toString())) {
+ dateToET!!.setText(activity.args!![1])
+ }
+ dateFromET!!.setOnClickListener { //To show current date in the datepicker
+ var mYear: Int = mcurrentDate.get(Calendar.YEAR)
+ var mMonth: Int = mcurrentDate.get(Calendar.MONTH)
+ var mDay: Int = mcurrentDate.get(Calendar.DAY_OF_MONTH)
+ if (!(dateFromET!!.text.toString() == "")) {
+ val dateString: String = dateFromET!!.text.toString().trim()
+ mYear = dateString.substring(0, 4).toInt()
+ mMonth = dateString.substring(5, 7).toInt()
+ if (mMonth == 1) {
+ mMonth = 0
+ } else {
+ mMonth = mMonth - 1
+ }
+ mDay = dateString.substring(8).toInt()
+ }
+
+ val mDatePicker = DatePickerDialog((context)!!, { datepicker, selectedyear, selectedmonth, selectedday ->
+ val input = MessageFormat.format("{0}-{1}-{2}", selectedyear, String.format("%02d", (selectedmonth + 1)), String.format("%02d", selectedday))
+ dateFromET!!.setText(input)
+ }, mYear, mMonth, mDay)
+ mDatePicker.setTitle("Select date")
+ mDatePicker.show()
+ }
+ dateToET!!.setOnClickListener { //To show current date in the datepicker
+ val mcurrentDate: Calendar = Calendar.getInstance()
+ var mYear: Int = mcurrentDate.get(Calendar.YEAR)
+ var mMonth: Int = mcurrentDate.get(Calendar.MONTH)
+ var mDay: Int = mcurrentDate.get(Calendar.DAY_OF_MONTH)
+ if (!(dateToET!!.text.toString() == "")) {
+ val dateString: String = dateToET!!.text.toString().trim({ it <= ' ' })
+ mYear = dateString.substring(0, 4).toInt()
+ mMonth = dateString.substring(5, 7).toInt()
+ if (mMonth == 1) {
+ mMonth = 0
+ } else {
+ mMonth -= 1
+ }
+ mDay = dateString.substring(8).toInt()
+ }
+ val mDatePicker = DatePickerDialog((context)!!, { datepicker, selectedyear, selectedmonth, selectedday ->
+ val input = MessageFormat.format("{0}-{1}-{2}", selectedyear, String.format("%02d", (selectedmonth + 1)), String.format("%02d", selectedday))
+ dateToET!!.setText(input)
+ }, mYear, mMonth, mDay)
+ mDatePicker.setTitle("Select date")
+ mDatePicker.show()
+ }
+ val adapter: ArrayAdapter = ArrayAdapter((context)!!, android.R.layout.simple_spinner_dropdown_item, spinnerList)
+ typeSpinner!!.adapter = adapter
+ if (activity.selection != null && activity.selection!!.contains(" AND " + ShiftsEntry.COLUMN_SHIFT_TYPE + " IS ?")) {
+ val spinnerPosition: Int = adapter.getPosition(activity.args!!.get(activity.args!!.size - 1))
+ typeSpinner!!.setSelection(spinnerPosition)
+ }
+ val submit: Button = rootView.findViewById(R.id.submitFiltered) as Button
+ submit.setOnClickListener {
+ BuildQuery()
+ activity.args = listArgs.toTypedArray()
+ FragmentMain.NEW_LOADER = 1
+ activity.fragmentManager!!.popBackStack()
+ }
+ return rootView
+ }
+
+ private fun BuildQuery() {
+ val dateQuery: String = ShiftsEntry.COLUMN_SHIFT_DATE + " BETWEEN ? AND ?"
+ val descQuery: String = " AND " + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " LIKE ?"
+ val typeQuery: String = " AND " + ShiftsEntry.COLUMN_SHIFT_TYPE + " IS ?"
+ var dateFrom = "2000-01-01"
+ val c: Date = Calendar.getInstance().time
+ val df = SimpleDateFormat("yyyy-MM-dd")
+ var dateTo: String = df.format(c)
+ if (!TextUtils.isEmpty(dateFromET!!.text.toString().trim())) {
+ dateFrom = dateFromET!!.text.toString().trim()
+ }
+ if (!TextUtils.isEmpty(dateToET!!.text.toString().trim())) {
+ dateTo = dateToET!!.text.toString().trim()
+ }
+ activity.selection = dateQuery
+ listArgs.add(dateFrom)
+ listArgs.add(dateTo)
+ if (!TextUtils.isEmpty(LocationET!!.text.toString().trim())) {
+ activity.selection = activity.selection + descQuery
+ listArgs.add("%" + LocationET!!.text.toString().trim() + "%")
+ }
+ if (!(typeSpinner!!.selectedItem.toString() == "")) {
+ activity.selection = activity.selection + typeQuery
+ listArgs.add(typeSpinner!!.selectedItem.toString())
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.java b/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.java
deleted file mode 100644
index fc9e8f2..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.java
+++ /dev/null
@@ -1,622 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.app.DatePickerDialog;
-import android.app.TimePickerDialog;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.Loader;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.DatePicker;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.RadioButton;
-import android.widget.RadioGroup;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import android.widget.TimePicker;
-import android.widget.Toast;
-
-import com.appttude.h_mal.farmr.Data.ShiftsContract;
-
-import java.util.Calendar;
-
-public class FragmentAddItem extends Fragment implements
- LoaderManager.LoaderCallbacks {
-
- private static final int EXISTING_PRODUCT_LOADER = 0;
-
- private Uri mCurrentProductUri;
-
- public static RadioGroup mRadioGroup;
- private RadioButton mRadioButtonOne;
- private RadioButton mRadioButtonTwo;
- private EditText mLocationEditText;
- private EditText mDateEditText;
- private TextView mDurationTextView;
- private EditText mTimeInEditText;
- private EditText mTimeOutEditText;
- private EditText mBreakEditText;
- private EditText mUnitEditText;
- private EditText mPayRateEditText;
- private TextView mTotalPayTextView;
- private LinearLayout hourlyDataView;
- private LinearLayout unitsHolder;
- private LinearLayout durationHolder;
- private LinearLayout wholeView;
- private ScrollView scrollView;
- private ProgressBar progressBarAI;
- private int mBreaks;
-
- private int mDay;
- private int mMonth;
- private int mYear;
- private int mHoursIn;
- private int mMinutesIn;
- private int mHoursOut;
- private int mMinutesOut;
- private float mUnits;
- private float mPayRate;
- private String mType;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View rootView = inflater.inflate(R.layout.fragment_add_item, container, false);
- setHasOptionsMenu(true);
-
- progressBarAI = (ProgressBar) rootView.findViewById(R.id.pd_ai);
- scrollView = (ScrollView) rootView.findViewById(R.id.total_view);
- mRadioGroup = (RadioGroup) rootView.findViewById(R.id.rg);
- mRadioButtonOne = (RadioButton) rootView.findViewById(R.id.hourly);
- mRadioButtonTwo = (RadioButton) rootView.findViewById(R.id.piecerate);
- mLocationEditText = (EditText) rootView.findViewById(R.id.locationEditText);
- mDateEditText = (EditText) rootView.findViewById(R.id.dateEditText);
- mTimeInEditText = (EditText) rootView.findViewById(R.id.timeInEditText);
- mBreakEditText = (EditText) rootView.findViewById(R.id.breakEditText);
- mTimeOutEditText = (EditText) rootView.findViewById(R.id.timeOutEditText);
- mDurationTextView = (TextView) rootView.findViewById(R.id.ShiftDuration);
- mUnitEditText = (EditText) rootView.findViewById(R.id.unitET);
- mPayRateEditText = (EditText) rootView.findViewById(R.id.payrateET);
- mTotalPayTextView = (TextView) rootView.findViewById(R.id.totalpayval);
-
- hourlyDataView = (LinearLayout) rootView.findViewById(R.id.hourly_data_holder);
- unitsHolder = (LinearLayout) rootView.findViewById(R.id.units_holder);
- durationHolder = (LinearLayout) rootView.findViewById(R.id.duration_holder);
- wholeView = (LinearLayout) rootView.findViewById(R.id.whole_view);
-
- mPayRate = 0.0f;
- mUnits = 0.0f;
-
- final Bundle b = getArguments();
- if(b != null) {
- mCurrentProductUri = Uri.parse(b.getString("uri"));
- }
-
- if (mCurrentProductUri == null) {
- MainActivity.setActionBarTitle(getString(R.string.add_item_title));
- wholeView.setVisibility(View.GONE);
- } else {
- MainActivity.setActionBarTitle(getString(R.string.edit_item_title));
- getLoaderManager().initLoader(EXISTING_PRODUCT_LOADER, null, this);
- }
-
- mBreakEditText.setHint("insert break in minutes");
-
- mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int i) {
- if (mRadioButtonOne.isChecked()){
- mType = mRadioButtonOne.getText().toString();
- wholeView.setVisibility(View.VISIBLE);
- unitsHolder.setVisibility(View.GONE);
- hourlyDataView.setVisibility(View.VISIBLE);
- durationHolder.setVisibility(View.VISIBLE);
- }else if(mRadioButtonTwo.isChecked()){
- mType = mRadioButtonTwo.getText().toString();
- wholeView.setVisibility(View.VISIBLE);
- unitsHolder.setVisibility(View.VISIBLE);
- hourlyDataView.setVisibility(View.GONE);
- durationHolder.setVisibility(View.GONE);
- }
- }
- });
-
- mDateEditText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //To show current date in the datepicker
- if(TextUtils.isEmpty(mDateEditText.getText().toString().trim())) {
- Calendar mcurrentDate = Calendar.getInstance();
- mYear = mcurrentDate.get(Calendar.YEAR);
- mMonth = mcurrentDate.get(Calendar.MONTH);
- mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);
- }else{
- String dateString = mDateEditText.getText().toString().trim();
-
- mYear = Integer.parseInt(dateString.substring(0, 4));
- mMonth = Integer.parseInt(dateString.substring(5, 7));
- if (mMonth == 1){
- mMonth = 0;
- }else{
- mMonth = mMonth -1;
- }
-
- mDay = Integer.parseInt(dateString.substring(8));
- }
- DatePickerDialog mDatePicker=new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
- mDateEditText.setText(
- selectedyear + "-"
- + String.format("%02d", (selectedmonth = selectedmonth + 1)) +"-"
- + String.format("%02d", selectedday)
- );
- setDate(selectedyear, selectedmonth, selectedday);
- }
- },mYear, mMonth, mDay);
- mDatePicker.setTitle("Select date");
- mDatePicker.show(); }
- });
-
- mTimeInEditText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mTimeInEditText.getText().toString().equals("")) {
- Calendar mcurrentTime = Calendar.getInstance();
- mHoursIn = mcurrentTime.get(Calendar.HOUR_OF_DAY);
- mMinutesIn = mcurrentTime.get(Calendar.MINUTE);
- } else {
- mHoursIn = Integer.parseInt((mTimeInEditText.getText().toString().subSequence(0,2)).toString());
- mMinutesIn = Integer.parseInt((mTimeInEditText.getText().toString().subSequence(3,5)).toString());
- }
- TimePickerDialog mTimePicker;
- mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
- @Override
- public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
- String ddTime = String.format("%02d", selectedHour) + ":" + String.format("%02d", selectedMinute);
- setTime(selectedMinute, selectedHour);
- mTimeInEditText.setText(ddTime);
- }
- }, mHoursIn, mMinutesIn, true);//Yes 24 hour time
- mTimePicker.setTitle("Select Time");
- mTimePicker.show();
-
- }
- });
-
- mTimeOutEditText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mTimeOutEditText.getText().toString().equals("")) {
- Calendar mcurrentTime = Calendar.getInstance();
- mHoursOut = mcurrentTime.get(Calendar.HOUR_OF_DAY);
- mMinutesOut = mcurrentTime.get(Calendar.MINUTE);
- }else {
- mHoursOut = Integer.parseInt((mTimeOutEditText.getText().toString().subSequence(0,2)).toString());
- mMinutesOut = Integer.parseInt((mTimeOutEditText.getText().toString().subSequence(3,5)).toString());
- }
- TimePickerDialog mTimePicker;
- mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
- @Override
- public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
- String ddTime = String.format("%02d", selectedHour) + ":" + String.format("%02d", selectedMinute);
- setTime2(selectedMinute,selectedHour);
- mTimeOutEditText.setText(ddTime);
- }
- }, mHoursOut, mMinutesOut, true);//Yes 24 hour time
- mTimePicker.setTitle("Select Time");
- mTimePicker.show();
- }
- });
-
- mTimeInEditText.addTextChangedListener(new TextWatcher()
- {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count)
- {
-
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int aft )
- {
-
- }
-
- @Override
- public void afterTextChanged(Editable s)
- {
- setDuration();
- calculateTotalPay();
- }
- });
-
- mTimeOutEditText.addTextChangedListener(new TextWatcher()
- {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count)
- {
-
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int aft )
- {
-
- }
-
- @Override
- public void afterTextChanged(Editable s)
- {
- setDuration();
- calculateTotalPay();
- }
- });
-
- mBreakEditText.addTextChangedListener(new TextWatcher()
- {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count)
- {
-
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int aft )
- {
-
- }
-
- @Override
- public void afterTextChanged(Editable s)
- {
- setDuration();
- calculateTotalPay();
- }
- });
-
- mUnitEditText.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
- }
-
- @Override
- public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
- }
-
- @Override
- public void afterTextChanged(Editable editable) {
-// if(mRadioButtonTwo.isChecked()) {
-// mUnits = 0.0f;
-// if (!mUnitEditText.getText().toString().equals("")){
-// mUnits = Float.parseFloat(mUnitEditText.getText().toString());
-// }
-// mPayRate = 0.0f;
-// if (!mPayRateEditText.getText().toString().equals("")){
-// mPayRate = Float.parseFloat(mPayRateEditText.getText().toString());
-// }
-// Float total = mPayRate * mUnits;
-// mTotalPayTextView.setText(String.valueOf(total));
-// }
- calculateTotalPay();
-
- }
- });
-
- mPayRateEditText.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
- }
-
- @Override
- public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
- }
-
- @Override
- public void afterTextChanged(Editable editable) {
- calculateTotalPay();
- }
-
- });
-
- Button SubmitProduct = (Button) rootView.findViewById(R.id.submit);
-
- SubmitProduct.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- saveProduct();
-
- }
- });
-
- return rootView;
- }
-
- private void calculateTotalPay(){
- Float total = 0.0f;
- mPayRate = 0.0f;
- if(mRadioButtonTwo.isChecked()) {
- mUnits = 0.0f;
- if (!mUnitEditText.getText().toString().equals("")) {
- mUnits = Float.parseFloat(mUnitEditText.getText().toString());
- }
- if (!mPayRateEditText.getText().toString().equals("")) {
- mPayRate = Float.parseFloat(mPayRateEditText.getText().toString());
- }
- total = mPayRate * mUnits;
- mTotalPayTextView.setText(String.valueOf(total));
- } else if(mRadioButtonOne.isChecked()){
- if (!mPayRateEditText.getText().toString().equals("")){
- mPayRate = Float.parseFloat(mPayRateEditText.getText().toString());
- total = mPayRate * calculateDuration(mHoursIn,mMinutesIn,mHoursOut,mMinutesOut,mBreaks);
- }
- }
- mTotalPayTextView.setText(String.format("%.2f",total));
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- menu.clear();
- }
-
- private void saveProduct() {
-
- String typeString = mType;
- String descriptionString = mLocationEditText.getText().toString().trim();
- if (TextUtils.isEmpty(descriptionString)) {
- Toast.makeText(getContext(), "please insert Location", Toast.LENGTH_SHORT).show();
- return;
- }
- String dateString = mDateEditText.getText().toString().trim();
- if (TextUtils.isEmpty(dateString)) {
- Toast.makeText(getContext(), "please insert Date", Toast.LENGTH_SHORT).show();
- return;
- }
- String timeInString = "";
- String timeOutString = "";
- int breaks = 0;
- float units = 0;
- float duration = 0;
- float payRate = 0;
- String payRateString = mPayRateEditText.getText().toString().trim();
- if (!TextUtils.isEmpty(payRateString)) {
- payRate = Float.parseFloat(payRateString);
- }
- float totalPay = 0;
- if (typeString.equals("Hourly")) {
- timeInString = mTimeInEditText.getText().toString().trim();
- if (TextUtils.isEmpty(timeInString)) {
- Toast.makeText(getContext(), "please insert Time in", Toast.LENGTH_SHORT).show();
- return;
- }
- timeOutString = mTimeOutEditText.getText().toString().trim();
- if (TextUtils.isEmpty(timeOutString)) {
- Toast.makeText(getContext(), "please insert Time out", Toast.LENGTH_SHORT).show();
- return;
- }
- String breakMins = mBreakEditText.getText().toString().trim();
- if (!TextUtils.isEmpty(breakMins)) {
- breaks = Integer.parseInt(breakMins);
- if(((float)breaks / 60) > calculateDurationWithoutBreak(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut)){
- Toast.makeText(getContext(), "Break larger than duration", Toast.LENGTH_SHORT).show();
- return;
- }
- }
- duration = calculateDuration(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut, breaks);
- totalPay = duration * payRate;
- }else if(typeString.equals("Piece Rate")){
- String unitsString = mUnitEditText.getText().toString().trim();
- if (TextUtils.isEmpty(unitsString) || Float.parseFloat(unitsString) <= 0) {
- Toast.makeText(getContext(), "Insert Units", Toast.LENGTH_SHORT).show();
- return;
- }else{
- units = Float.parseFloat(unitsString);
- }
- duration = 0;
- totalPay = units * payRate;
- }
-
- ContentValues values = new ContentValues();
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE, typeString);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, descriptionString);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE, dateString);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN, timeInString);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT, timeOutString);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION, duration);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK, breaks);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT, units);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE, payRate);
- values.put(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalPay);
-
- if (mCurrentProductUri == null) {
-
- Uri newUri = getActivity().getContentResolver().insert(ShiftsContract.ShiftsEntry.CONTENT_URI, values);
-
- if (newUri == null) {
- Toast.makeText(getContext(), getString(R.string.insert_item_failed),
- Toast.LENGTH_SHORT).show();
-
- } else {
-
- Toast.makeText(getContext(), getString(R.string.insert_item_successful),
- Toast.LENGTH_SHORT).show();
- }
- } else {
- int rowsAffected = getActivity().getContentResolver().update(mCurrentProductUri, values, null, null);
-
- if (rowsAffected == 0) {
- Toast.makeText(getContext(), getString(R.string.update_item_failed),
- Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(getContext(), getString(R.string.update_item_successful),
- Toast.LENGTH_SHORT).show();
- }
- }
-
- (MainActivity.fragmentManager).popBackStack("main",0);
- }
-
- private void setDuration (){
- Calendar mcurrentTime = Calendar.getInstance();
- mBreaks = 0;
- if (!mBreakEditText.getText().toString().equals("")){
- mBreaks = Integer.parseInt(mBreakEditText.getText().toString());
- }
- if (mTimeOutEditText.getText().toString().equals("")) {
- mHoursOut = mcurrentTime.get(Calendar.HOUR_OF_DAY);
- mMinutesOut = mcurrentTime.get(Calendar.MINUTE);
- }else {
- mHoursOut = Integer.parseInt((mTimeOutEditText.getText().toString().subSequence(0,2)).toString());
- mMinutesOut = Integer.parseInt((mTimeOutEditText.getText().toString().subSequence(3,5)).toString());
- }
- if (mTimeInEditText.getText().toString().equals("")) {
- mHoursIn = mcurrentTime.get(Calendar.HOUR_OF_DAY);
- mMinutesIn = mcurrentTime.get(Calendar.MINUTE);
- } else {
- mHoursIn = Integer.parseInt((mTimeInEditText.getText().toString().subSequence(0,2)).toString());
- mMinutesIn = Integer.parseInt((mTimeInEditText.getText().toString().subSequence(3,5)).toString());
- }
- mDurationTextView.setText(calculateDuration(mHoursIn,mMinutesIn,mHoursOut,mMinutesOut,mBreaks) + " hours");
- }
-
- private void setDate (int year, int month, int day){
- mYear = year;
- mMonth = month;
- mDay = day;
- }
-
-
- private void setTime (int minutes, int hours){
- mMinutesIn = minutes;
- mHoursIn = hours;
-
- }
-
- private void setTime2 (int minutes, int hours){
- mMinutesOut = minutes;
- mHoursOut = hours;
-
- }
-
- private float calculateDuration (int hoursIn, int minutesIn, int hoursOut, int minutesOut, int breaks){
- float duration;
- if (hoursOut > hoursIn){
- duration = (((float)hoursOut + ((float)minutesOut/60)) - ((float) hoursIn + ((float)minutesIn/60))) - ((float)breaks / 60);
- }else{
- duration = ((((float)hoursOut + ((float)minutesOut/60)) - ((float)hoursIn + ((float)minutesIn/60))) - ((float)breaks / 60) + 24);
- }
-
- String s = String.format("%.2f",duration);
- return Float.parseFloat(s);
- }
-
- private float calculateDurationWithoutBreak (int hoursIn, int minutesIn, int hoursOut, int minutesOut){
- float duration;
- if (hoursOut > hoursIn){
- duration = (((float)hoursOut + ((float)minutesOut/60)) - ((float) hoursIn + ((float)minutesIn/60)));
- }else{
- duration = ((((float)hoursOut + ((float)minutesOut/60)) - ((float)hoursIn + ((float)minutesIn/60))) + 24);
- }
-
- String s = String.format("%.2f",duration);
- return Float.parseFloat(s);
- }
-
-
- @Override
- public Loader onCreateLoader(int id, Bundle args) {
- progressBarAI.setVisibility(View.VISIBLE);
- scrollView.setVisibility(View.GONE);
- String[] projection = {
- ShiftsContract.ShiftsEntry._ID,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY,};
-
- return new android.support.v4.content.CursorLoader(getContext(),mCurrentProductUri,
- projection,null,null,null);
- }
-
- @Override
- public void onLoadFinished(Loader loader, Cursor cursor) {
- progressBarAI.setVisibility(View.GONE);
- scrollView.setVisibility(View.VISIBLE);
- if (cursor == null || cursor.getCount() < 1) {
- return;
- }
-
- if (cursor.moveToFirst()) {
- int descriptionColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION);
- int dateColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE);
- int timeInColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN);
- int timeOutColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT);
- int breakColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK);
- int durationColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION);
- int typeColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE);
- int unitColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT);
- int payrateColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE);
- int totalPayColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY);
-
- String type = cursor.getString(typeColumnIndex);
- String description = cursor.getString(descriptionColumnIndex);
- String date = cursor.getString(dateColumnIndex);
- String timeIn = cursor.getString(timeInColumnIndex);
- String timeOut = cursor.getString(timeOutColumnIndex);
- int breaks = cursor.getInt(breakColumnIndex);
- float duration = cursor.getFloat(durationColumnIndex);
- float unit = cursor.getFloat(unitColumnIndex);
- float payrate = cursor.getFloat(payrateColumnIndex);
- float totalPay = cursor.getFloat(totalPayColumnIndex);
-
- mLocationEditText.setText(description);
- mDateEditText.setText(date);
- if (type.equals("Hourly") || type.equals("hourly")) {
- mRadioButtonOne.setChecked(true);
- mRadioButtonTwo.setChecked(false);
- mTimeInEditText.setText(timeIn);
- mTimeOutEditText.setText(timeOut);
- mBreakEditText.setText(Integer.toString(breaks));
- mDurationTextView.setText(String.format("%.2f", duration) + " Hours");
- } else if (type.equals("Piece Rate")) {
- mRadioButtonOne.setChecked(false);
- mRadioButtonTwo.setChecked(true);
- mUnitEditText.setText(Float.toString(unit));
- }
- mPayRateEditText.setText(String.format("%.2f", payrate));
- mTotalPayTextView.setText(String.format("%.2f", totalPay));
-
- }
- }
-
- @Override
- public void onLoaderReset(Loader loader) {
-
- }
-
-
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.kt
new file mode 100644
index 0000000..eedcee5
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/FragmentAddItem.kt
@@ -0,0 +1,507 @@
+package com.appttude.h_mal.farmr
+
+import android.app.DatePickerDialog
+import android.app.DatePickerDialog.OnDateSetListener
+import android.app.TimePickerDialog
+import android.app.TimePickerDialog.OnTimeSetListener
+import android.content.ContentValues
+import android.database.Cursor
+import android.net.Uri
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextUtils
+import android.text.TextWatcher
+import android.view.LayoutInflater
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.DatePicker
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.ProgressBar
+import android.widget.RadioButton
+import android.widget.RadioGroup
+import android.widget.ScrollView
+import android.widget.TextView
+import android.widget.TimePicker
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+import androidx.loader.app.LoaderManager
+import androidx.loader.content.CursorLoader
+import androidx.loader.content.Loader
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+import java.util.Calendar
+
+class FragmentAddItem : Fragment(), LoaderManager.LoaderCallbacks {
+ lateinit var activity: MainActivity
+
+ private var mCurrentProductUri: Uri? = null
+ private var mRadioButtonOne: RadioButton? = null
+ private var mRadioButtonTwo: RadioButton? = null
+ private var mLocationEditText: EditText? = null
+ private var mDateEditText: EditText? = null
+ private var mDurationTextView: TextView? = null
+ private var mTimeInEditText: EditText? = null
+ private var mTimeOutEditText: EditText? = null
+ private var mBreakEditText: EditText? = null
+ private var mUnitEditText: EditText? = null
+ private var mPayRateEditText: EditText? = null
+ private var mTotalPayTextView: TextView? = null
+ private var hourlyDataView: LinearLayout? = null
+ private var unitsHolder: LinearLayout? = null
+ private var durationHolder: LinearLayout? = null
+ private var wholeView: LinearLayout? = null
+ private var scrollView: ScrollView? = null
+ private var progressBarAI: ProgressBar? = null
+ private var mBreaks = 0
+ private var mDay = 0
+ private var mMonth = 0
+ private var mYear = 0
+ private var mHoursIn = 0
+ private var mMinutesIn = 0
+ private var mHoursOut = 0
+ private var mMinutesOut = 0
+ private var mUnits = 0f
+ private var mPayRate = 0f
+ private var mType: String? = null
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View? {
+ // Inflate the layout for this fragment
+ val rootView = inflater.inflate(R.layout.fragment_add_item, container, false)
+ setHasOptionsMenu(true)
+ activity = (requireActivity() as MainActivity)
+
+ progressBarAI = rootView.findViewById(R.id.pd_ai) as ProgressBar
+ scrollView = rootView.findViewById(R.id.total_view) as ScrollView
+ mRadioGroup = rootView.findViewById(R.id.rg) as RadioGroup
+ mRadioButtonOne = rootView.findViewById(R.id.hourly) as RadioButton
+ mRadioButtonTwo = rootView.findViewById(R.id.piecerate) as RadioButton
+ mLocationEditText = rootView.findViewById(R.id.locationEditText) as EditText
+ mDateEditText = rootView.findViewById(R.id.dateEditText) as EditText
+ mTimeInEditText = rootView.findViewById(R.id.timeInEditText) as EditText
+ mBreakEditText = rootView.findViewById(R.id.breakEditText) as EditText
+ mTimeOutEditText = rootView.findViewById(R.id.timeOutEditText) as EditText
+ mDurationTextView = rootView.findViewById(R.id.ShiftDuration) as TextView
+ mUnitEditText = rootView.findViewById(R.id.unitET) as EditText
+ mPayRateEditText = rootView.findViewById(R.id.payrateET) as EditText
+ mTotalPayTextView = rootView.findViewById(R.id.totalpayval) as TextView
+ hourlyDataView = rootView.findViewById(R.id.hourly_data_holder) as LinearLayout
+ unitsHolder = rootView.findViewById(R.id.units_holder) as LinearLayout
+ durationHolder = rootView.findViewById(R.id.duration_holder) as LinearLayout
+ wholeView = rootView.findViewById(R.id.whole_view) as LinearLayout
+ mPayRate = 0.0f
+ mUnits = 0.0f
+ val b = arguments
+ if (b != null) {
+ mCurrentProductUri = Uri.parse(b.getString("uri"))
+ }
+ if (mCurrentProductUri == null) {
+ activity.setActionBarTitle(getString(R.string.add_item_title))
+ wholeView!!.visibility = View.GONE
+ } else {
+ activity.setActionBarTitle(getString(R.string.edit_item_title))
+ loaderManager.initLoader(EXISTING_PRODUCT_LOADER, null, this)
+ }
+ mBreakEditText!!.hint = "insert break in minutes"
+ mRadioGroup!!.setOnCheckedChangeListener(RadioGroup.OnCheckedChangeListener { radioGroup, i ->
+ if (mRadioButtonOne!!.isChecked) {
+ mType = mRadioButtonOne!!.text.toString()
+ wholeView!!.visibility = View.VISIBLE
+ unitsHolder!!.visibility = View.GONE
+ hourlyDataView!!.visibility = View.VISIBLE
+ durationHolder!!.visibility = View.VISIBLE
+ } else if (mRadioButtonTwo!!.isChecked) {
+ mType = mRadioButtonTwo!!.text.toString()
+ wholeView!!.visibility = View.VISIBLE
+ unitsHolder!!.visibility = View.VISIBLE
+ hourlyDataView!!.visibility = View.GONE
+ durationHolder!!.visibility = View.GONE
+ }
+ })
+ mDateEditText!!.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(v: View) {
+ //To show current date in the datepicker
+ if (TextUtils.isEmpty(mDateEditText!!.text.toString().trim { it <= ' ' })) {
+ val mcurrentDate = Calendar.getInstance()
+ mYear = mcurrentDate[Calendar.YEAR]
+ mMonth = mcurrentDate[Calendar.MONTH]
+ mDay = mcurrentDate[Calendar.DAY_OF_MONTH]
+ } else {
+ val dateString = mDateEditText!!.text.toString().trim { it <= ' ' }
+ mYear = dateString.substring(0, 4).toInt()
+ mMonth = dateString.substring(5, 7).toInt()
+ if (mMonth == 1) {
+ mMonth = 0
+ } else {
+ mMonth = mMonth - 1
+ }
+ mDay = dateString.substring(8).toInt()
+ }
+ val mDatePicker = DatePickerDialog((context)!!, object : OnDateSetListener {
+ override fun onDateSet(datepicker: DatePicker, selectedyear: Int, selectedmonth: Int, selectedday: Int) {
+ var selectedmonth = selectedmonth
+ mDateEditText!!.setText(
+ (selectedyear.toString() + "-"
+ + String.format("%02d", (selectedmonth + 1.also { selectedmonth = it })) + "-"
+ + String.format("%02d", selectedday))
+ )
+ setDate(selectedyear, selectedmonth, selectedday)
+ }
+ }, mYear, mMonth, mDay)
+ mDatePicker.setTitle("Select date")
+ mDatePicker.show()
+ }
+ })
+ mTimeInEditText!!.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(v: View) {
+ if ((mTimeInEditText!!.text.toString() == "")) {
+ val mcurrentTime = Calendar.getInstance()
+ mHoursIn = mcurrentTime[Calendar.HOUR_OF_DAY]
+ mMinutesIn = mcurrentTime[Calendar.MINUTE]
+ } else {
+ mHoursIn = (mTimeInEditText!!.text.toString().subSequence(0, 2)).toString().toInt()
+ mMinutesIn = (mTimeInEditText!!.text.toString().subSequence(3, 5)).toString().toInt()
+ }
+ val mTimePicker: TimePickerDialog
+ mTimePicker = TimePickerDialog(context, object : OnTimeSetListener {
+ override fun onTimeSet(timePicker: TimePicker, selectedHour: Int, selectedMinute: Int) {
+ val ddTime = String.format("%02d", selectedHour) + ":" + String.format("%02d", selectedMinute)
+ setTime(selectedMinute, selectedHour)
+ mTimeInEditText!!.setText(ddTime)
+ }
+ }, mHoursIn, mMinutesIn, true) //Yes 24 hour time
+ mTimePicker.setTitle("Select Time")
+ mTimePicker.show()
+ }
+ })
+ mTimeOutEditText!!.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(v: View) {
+ if ((mTimeOutEditText!!.text.toString() == "")) {
+ val mcurrentTime = Calendar.getInstance()
+ mHoursOut = mcurrentTime[Calendar.HOUR_OF_DAY]
+ mMinutesOut = mcurrentTime[Calendar.MINUTE]
+ } else {
+ mHoursOut = (mTimeOutEditText!!.text.toString().subSequence(0, 2)).toString().toInt()
+ mMinutesOut = (mTimeOutEditText!!.text.toString().subSequence(3, 5)).toString().toInt()
+ }
+ val mTimePicker: TimePickerDialog
+ mTimePicker = TimePickerDialog(context, object : OnTimeSetListener {
+ override fun onTimeSet(timePicker: TimePicker, selectedHour: Int, selectedMinute: Int) {
+ val ddTime = String.format("%02d", selectedHour) + ":" + String.format("%02d", selectedMinute)
+ setTime2(selectedMinute, selectedHour)
+ mTimeOutEditText!!.setText(ddTime)
+ }
+ }, mHoursOut, mMinutesOut, true) //Yes 24 hour time
+ mTimePicker.setTitle("Select Time")
+ mTimePicker.show()
+ }
+ })
+ mTimeInEditText!!.addTextChangedListener(object : TextWatcher {
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, aft: Int) {}
+ override fun afterTextChanged(s: Editable) {
+ setDuration()
+ calculateTotalPay()
+ }
+ })
+ mTimeOutEditText!!.addTextChangedListener(object : TextWatcher {
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, aft: Int) {}
+ override fun afterTextChanged(s: Editable) {
+ setDuration()
+ calculateTotalPay()
+ }
+ })
+ mBreakEditText!!.addTextChangedListener(object : TextWatcher {
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, aft: Int) {}
+ override fun afterTextChanged(s: Editable) {
+ setDuration()
+ calculateTotalPay()
+ }
+ })
+ mUnitEditText!!.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
+ override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
+ override fun afterTextChanged(editable: Editable) {
+// if(mRadioButtonTwo.isChecked()) {
+// mUnits = 0.0f;
+// if (!mUnitEditText.getText().toString().equals("")){
+// mUnits = Float.parseFloat(mUnitEditText.getText().toString());
+// }
+// mPayRate = 0.0f;
+// if (!mPayRateEditText.getText().toString().equals("")){
+// mPayRate = Float.parseFloat(mPayRateEditText.getText().toString());
+// }
+// Float total = mPayRate * mUnits;
+// mTotalPayTextView.setText(String.valueOf(total));
+// }
+ calculateTotalPay()
+ }
+ })
+ mPayRateEditText!!.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
+ override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
+ override fun afterTextChanged(editable: Editable) {
+ calculateTotalPay()
+ }
+ })
+ val SubmitProduct = rootView.findViewById(R.id.submit) as Button
+ SubmitProduct.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(view: View) {
+ saveProduct()
+ }
+ })
+ return rootView
+ }
+
+ private fun calculateTotalPay() {
+ var total = 0.0f
+ mPayRate = 0.0f
+ if (mRadioButtonTwo!!.isChecked) {
+ mUnits = 0.0f
+ if (mUnitEditText!!.text.toString() != "") {
+ mUnits = mUnitEditText!!.text.toString().toFloat()
+ }
+ if (mPayRateEditText!!.text.toString() != "") {
+ mPayRate = mPayRateEditText!!.text.toString().toFloat()
+ }
+ total = mPayRate * mUnits
+ mTotalPayTextView!!.text = total.toString()
+ } else if (mRadioButtonOne!!.isChecked) {
+ if (mPayRateEditText!!.text.toString() != "") {
+ mPayRate = mPayRateEditText!!.text.toString().toFloat()
+ total = mPayRate * calculateDuration(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut, mBreaks)
+ }
+ }
+ mTotalPayTextView!!.text = String.format("%.2f", total)
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+ super.onCreateOptionsMenu(menu, inflater)
+ menu.clear()
+ }
+
+ private fun saveProduct() {
+ val typeString = mType
+ val descriptionString = mLocationEditText!!.text.toString().trim { it <= ' ' }
+ if (TextUtils.isEmpty(descriptionString)) {
+ Toast.makeText(context, "please insert Location", Toast.LENGTH_SHORT).show()
+ return
+ }
+ val dateString = mDateEditText!!.text.toString().trim { it <= ' ' }
+ if (TextUtils.isEmpty(dateString)) {
+ Toast.makeText(context, "please insert Date", Toast.LENGTH_SHORT).show()
+ return
+ }
+ var timeInString: String = ""
+ var timeOutString: String = ""
+ var breaks = 0
+ var units = 0f
+ var duration = 0f
+ var payRate = 0f
+ val payRateString = mPayRateEditText!!.text.toString().trim { it <= ' ' }
+ if (!TextUtils.isEmpty(payRateString)) {
+ payRate = payRateString.toFloat()
+ }
+ var totalPay = 0f
+ if ((typeString == "Hourly")) {
+ timeInString = mTimeInEditText!!.text.toString().trim { it <= ' ' }
+ if (TextUtils.isEmpty(timeInString)) {
+ Toast.makeText(context, "please insert Time in", Toast.LENGTH_SHORT).show()
+ return
+ }
+ timeOutString = mTimeOutEditText!!.text.toString().trim { it <= ' ' }
+ if (TextUtils.isEmpty(timeOutString)) {
+ Toast.makeText(context, "please insert Time out", Toast.LENGTH_SHORT).show()
+ return
+ }
+ val breakMins = mBreakEditText!!.text.toString().trim { it <= ' ' }
+ if (!TextUtils.isEmpty(breakMins)) {
+ breaks = breakMins.toInt()
+ if ((breaks.toFloat() / 60) > calculateDurationWithoutBreak(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut)) {
+ Toast.makeText(context, "Break larger than duration", Toast.LENGTH_SHORT).show()
+ return
+ }
+ }
+ duration = calculateDuration(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut, breaks)
+ totalPay = duration * payRate
+ } else if ((typeString == "Piece Rate")) {
+ val unitsString = mUnitEditText!!.text.toString().trim { it <= ' ' }
+ if (TextUtils.isEmpty(unitsString) || unitsString.toFloat() <= 0) {
+ Toast.makeText(context, "Insert Units", Toast.LENGTH_SHORT).show()
+ return
+ } else {
+ units = unitsString.toFloat()
+ }
+ duration = 0f
+ totalPay = units * payRate
+ }
+ val values = ContentValues()
+ values.put(ShiftsEntry.COLUMN_SHIFT_TYPE, typeString)
+ values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, descriptionString)
+ values.put(ShiftsEntry.COLUMN_SHIFT_DATE, dateString)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, timeInString)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, timeOutString)
+ values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, duration)
+ values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, breaks)
+ values.put(ShiftsEntry.COLUMN_SHIFT_UNIT, units)
+ values.put(ShiftsEntry.COLUMN_SHIFT_PAYRATE, payRate)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalPay)
+ if (mCurrentProductUri == null) {
+ val newUri = activity.contentResolver.insert(ShiftsEntry.CONTENT_URI, values)
+ if (newUri == null) {
+ Toast.makeText(context, getString(R.string.insert_item_failed),
+ Toast.LENGTH_SHORT).show()
+ } else {
+ Toast.makeText(context, getString(R.string.insert_item_successful),
+ Toast.LENGTH_SHORT).show()
+ }
+ } else {
+ val rowsAffected = activity.contentResolver.update(mCurrentProductUri!!, values, null, null)
+ if (rowsAffected == 0) {
+ Toast.makeText(context, getString(R.string.update_item_failed),
+ Toast.LENGTH_SHORT).show()
+ } else {
+ Toast.makeText(context, getString(R.string.update_item_successful),
+ Toast.LENGTH_SHORT).show()
+ }
+ }
+ (activity.fragmentManager)!!.popBackStack("main", 0)
+ }
+
+ private fun setDuration() {
+ val mcurrentTime = Calendar.getInstance()
+ mBreaks = 0
+ if (mBreakEditText!!.text.toString() != "") {
+ mBreaks = mBreakEditText!!.text.toString().toInt()
+ }
+ if ((mTimeOutEditText!!.text.toString() == "")) {
+ mHoursOut = mcurrentTime[Calendar.HOUR_OF_DAY]
+ mMinutesOut = mcurrentTime[Calendar.MINUTE]
+ } else {
+ mHoursOut = (mTimeOutEditText!!.text.toString().subSequence(0, 2)).toString().toInt()
+ mMinutesOut = (mTimeOutEditText!!.text.toString().subSequence(3, 5)).toString().toInt()
+ }
+ if ((mTimeInEditText!!.text.toString() == "")) {
+ mHoursIn = mcurrentTime[Calendar.HOUR_OF_DAY]
+ mMinutesIn = mcurrentTime[Calendar.MINUTE]
+ } else {
+ mHoursIn = (mTimeInEditText!!.text.toString().subSequence(0, 2)).toString().toInt()
+ mMinutesIn = (mTimeInEditText!!.text.toString().subSequence(3, 5)).toString().toInt()
+ }
+ mDurationTextView!!.text = calculateDuration(mHoursIn, mMinutesIn, mHoursOut, mMinutesOut, mBreaks).toString() + " hours"
+ }
+
+ private fun setDate(year: Int, month: Int, day: Int) {
+ mYear = year
+ mMonth = month
+ mDay = day
+ }
+
+ private fun setTime(minutes: Int, hours: Int) {
+ mMinutesIn = minutes
+ mHoursIn = hours
+ }
+
+ private fun setTime2(minutes: Int, hours: Int) {
+ mMinutesOut = minutes
+ mHoursOut = hours
+ }
+
+ private fun calculateDuration(hoursIn: Int, minutesIn: Int, hoursOut: Int, minutesOut: Int, breaks: Int): Float {
+ val duration: Float
+ if (hoursOut > hoursIn) {
+ duration = ((hoursOut.toFloat() + (minutesOut.toFloat() / 60)) - (hoursIn.toFloat() + (minutesIn.toFloat() / 60))) - (breaks.toFloat() / 60)
+ } else {
+ duration = (((hoursOut.toFloat() + (minutesOut.toFloat() / 60)) - (hoursIn.toFloat() + (minutesIn.toFloat() / 60))) - (breaks.toFloat() / 60) + 24)
+ }
+ val s = String.format("%.2f", duration)
+ return s.toFloat()
+ }
+
+ private fun calculateDurationWithoutBreak(hoursIn: Int, minutesIn: Int, hoursOut: Int, minutesOut: Int): Float {
+ val duration: Float
+ if (hoursOut > hoursIn) {
+ duration = ((hoursOut.toFloat() + (minutesOut.toFloat() / 60)) - (hoursIn.toFloat() + (minutesIn.toFloat() / 60)))
+ } else {
+ duration = (((hoursOut.toFloat() + (minutesOut.toFloat() / 60)) - (hoursIn.toFloat() + (minutesIn.toFloat() / 60))) + 24)
+ }
+ val s = String.format("%.2f", duration)
+ return s.toFloat()
+ }
+
+ override fun onCreateLoader(id: Int, args: Bundle?): Loader {
+ progressBarAI!!.visibility = View.VISIBLE
+ scrollView!!.visibility = View.GONE
+ val projection = arrayOf(
+ ShiftsEntry._ID,
+ ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
+ ShiftsEntry.COLUMN_SHIFT_DATE,
+ ShiftsEntry.COLUMN_SHIFT_TIME_IN,
+ ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
+ ShiftsEntry.COLUMN_SHIFT_BREAK,
+ ShiftsEntry.COLUMN_SHIFT_DURATION,
+ ShiftsEntry.COLUMN_SHIFT_TYPE,
+ ShiftsEntry.COLUMN_SHIFT_PAYRATE,
+ ShiftsEntry.COLUMN_SHIFT_UNIT,
+ ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ return CursorLoader((context)!!, (mCurrentProductUri)!!,
+ projection, null, null, null)
+ }
+
+ override fun onLoaderReset(loader: Loader) {}
+
+ override fun onLoadFinished(loader: Loader, cursor: Cursor?) {
+ progressBarAI!!.visibility = View.GONE
+ scrollView!!.visibility = View.VISIBLE
+ if (cursor == null || cursor.count < 1) {
+ return
+ }
+ if (cursor.moveToFirst()) {
+ val descriptionColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)
+ val dateColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DATE)
+ val timeInColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_IN)
+ val timeOutColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)
+ val breakColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_BREAK)
+ val durationColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DURATION)
+ val typeColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TYPE)
+ val unitColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_UNIT)
+ val payrateColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_PAYRATE)
+ val totalPayColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ val type = cursor.getString(typeColumnIndex)
+ val description = cursor.getString(descriptionColumnIndex)
+ val date = cursor.getString(dateColumnIndex)
+ val timeIn = cursor.getString(timeInColumnIndex)
+ val timeOut = cursor.getString(timeOutColumnIndex)
+ val breaks = cursor.getInt(breakColumnIndex)
+ val duration = cursor.getFloat(durationColumnIndex)
+ val unit = cursor.getFloat(unitColumnIndex)
+ val payrate = cursor.getFloat(payrateColumnIndex)
+ val totalPay = cursor.getFloat(totalPayColumnIndex)
+ mLocationEditText!!.setText(description)
+ mDateEditText!!.setText(date)
+ if ((type == "Hourly") || (type == "hourly")) {
+ mRadioButtonOne!!.isChecked = true
+ mRadioButtonTwo!!.isChecked = false
+ mTimeInEditText!!.setText(timeIn)
+ mTimeOutEditText!!.setText(timeOut)
+ mBreakEditText!!.setText(Integer.toString(breaks))
+ mDurationTextView!!.text = String.format("%.2f", duration) + " Hours"
+ } else if ((type == "Piece Rate")) {
+ mRadioButtonOne!!.isChecked = false
+ mRadioButtonTwo!!.isChecked = true
+ mUnitEditText!!.setText(java.lang.Float.toString(unit))
+ }
+ mPayRateEditText!!.setText(String.format("%.2f", payrate))
+ mTotalPayTextView!!.text = String.format("%.2f", totalPay)
+ }
+ }
+
+ companion object {
+ private val EXISTING_PRODUCT_LOADER = 0
+ var mRadioGroup: RadioGroup? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.java b/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.java
deleted file mode 100644
index 64816be..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.java
+++ /dev/null
@@ -1,534 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.Manifest;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.ContentValues;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.StrictMode;
-import android.support.annotation.NonNull;
-import android.support.design.widget.FloatingActionButton;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.Loader;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
-import android.widget.Toast;
-
-import com.ajts.androidmads.library.SQLiteToExcel;
-import com.appttude.h_mal.farmr.Data.ShiftsContract.ShiftsEntry;
-import com.appttude.h_mal.farmr.Data.ShiftsDbHelper;
-
-import java.io.File;
-
-import static com.appttude.h_mal.farmr.MainActivity.args;
-import static com.appttude.h_mal.farmr.MainActivity.filter;
-import static com.appttude.h_mal.farmr.MainActivity.selection;
-import static com.appttude.h_mal.farmr.MainActivity.sortOrder;
-
-
-public class FragmentMain extends Fragment implements
- LoaderManager.LoaderCallbacks{
-
- public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;
-
- private static final int DEFAULT_LOADER = 0;
- public static int NEW_LOADER = 0;
-
- ShiftsCursorAdapter mCursorAdapter;
- ShiftsDbHelper shiftsDbhelper;
- LoaderManager.LoaderCallbacks defaultLoaderCallback;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View rootView = inflater.inflate(R.layout.fragment_main, container, false);
- setHasOptionsMenu(true);
-
- MainActivity.setActionBarTitle(getString(R.string.app_name));
-
- filter = getActivity().getSharedPreferences("PREFS", 0);
- sortOrder = filter.getString("Filter",null);
-
- defaultLoaderCallback = this;
-
- ListView productListView = (ListView) rootView.findViewById(R.id.list_item_view);
-
- View emptyView = rootView.findViewById(R.id.empty_view);
- productListView.setEmptyView(emptyView);
-
- mCursorAdapter = new ShiftsCursorAdapter((MainActivity) getActivity(), null);
- productListView.setAdapter(mCursorAdapter);
-
- getLoaderManager().initLoader(DEFAULT_LOADER, null, defaultLoaderCallback);
-
- FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab1);
- fab.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- FragmentTransaction fragmentTransaction = (MainActivity.fragmentManager).beginTransaction();
- fragmentTransaction.replace(R.id.container,new FragmentAddItem()).addToBackStack("additem").commit();
- }
- });
-
- return rootView;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
-
- case R.id.delete_all:
- deleteAllProducts();
- return true;
-
- case R.id.help:
- new AlertDialog.Builder(getContext())
- .setTitle("Help & Support:")
- .setView(R.layout.dialog_layout)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- }
- }).create().show();
- return true;
-
- case R.id.filter_data:
- FragmentTransaction fragmentTransaction = (MainActivity.fragmentManager).beginTransaction();
- fragmentTransaction.replace(R.id.container,new FilterDataFragment()).addToBackStack("filterdata").commit();
- return true;
-
- case R.id.sort_data:
- sortData();
- return true;
-
- case R.id.clear_filter:
- args = null;
- selection = null;
- NEW_LOADER = 0;
- getLoaderManager().restartLoader(DEFAULT_LOADER, null, this);
- return true;
- case R.id.export_data:
- if(checkStoragePermissions(getActivity())){
- new AlertDialog.Builder(getContext())
- .setTitle("Export?")
- .setMessage("Exporting current filtered data. Continue?")
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- ExportData();
- }
- }).create().show();
- }else{
- Toast.makeText(getContext(), "Storage permissions required", Toast.LENGTH_SHORT).show();
- }
- return true;
- case R.id.action_favorite:
- new AlertDialog.Builder(getContext())
- .setTitle("Info:")
- .setMessage(retrieveInfo())
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- }
- }).create().show();
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
-
- private void sortData(){
- final String[] grpname = {"Added","Date","Name"};
- final String[] sortQuery = {""};
- int checkedItem = -1;
-
- if(sortOrder != null && sortOrder.contains(ShiftsEntry._ID)){
- checkedItem = 0;
- sortQuery[0] = ShiftsEntry._ID;
- }else if(sortOrder != null && sortOrder.contains(ShiftsEntry.COLUMN_SHIFT_DATE)){
- checkedItem = 1;
- sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DATE;
- }else if(sortOrder != null && sortOrder.contains(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)){
- checkedItem = 2;
- sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DESCRIPTION;
- }
-
- AlertDialog.Builder alt_bld = new AlertDialog.Builder(getContext());
- //alt_bld.setIcon(R.drawable.icon);
- alt_bld.setTitle("Sort by:");
- alt_bld.setSingleChoiceItems(grpname, checkedItem, new DialogInterface
- .OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
-
- switch (item) {
- case 0:
- sortQuery[0] = ShiftsEntry._ID;
- return;
- case 1:
- sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DATE;
- return;
- case 2:
- sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DESCRIPTION;
- }
-
- }
- }).setPositiveButton("Ascending", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- sortOrder = sortQuery[0] + " ASC";
- filter.edit().putString("Filter",sortOrder).apply();
- getLoaderManager().restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback);
- dialog.dismiss();
- }
- }).setNegativeButton("Descending", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- sortOrder = sortQuery[0] + " DESC";
- filter.edit().putString("Filter",sortOrder).apply();
- getLoaderManager().restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback);
- dialog.dismiss();
- }
- });
- AlertDialog alert = alt_bld.create();
- alert.show();
- }
-
- private void deleteAllProducts() {
- new AlertDialog.Builder(getContext())
- .setTitle("Delete?")
- .setMessage("Are you sure you want to delete all date?")
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface arg0, int arg1) {
-
- int rowsDeleted = getActivity().getContentResolver().delete(ShiftsEntry.CONTENT_URI, null, null);
- Toast.makeText(getContext(), rowsDeleted + " Items Deleted", Toast.LENGTH_SHORT).show();
- }
- }).create().show();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if(NEW_LOADER > DEFAULT_LOADER) {
- getLoaderManager().restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback);
- System.out.println("reloading loader");
- }
- }
-
- private void ExportData() {
-
- int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
-
- if (permission != PackageManager.PERMISSION_GRANTED) {
- Toast.makeText(getContext(), "Storage permissions not granted", Toast.LENGTH_SHORT).show();
- return;
- }
-
-
- shiftsDbhelper = new ShiftsDbHelper(getContext());
- SQLiteDatabase database = shiftsDbhelper.getWritableDatabase();
-
- String[] projection_export = {
- ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
- ShiftsEntry.COLUMN_SHIFT_DATE,
- ShiftsEntry.COLUMN_SHIFT_TIME_IN,
- ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
- ShiftsEntry.COLUMN_SHIFT_BREAK,
- ShiftsEntry.COLUMN_SHIFT_DURATION,
- ShiftsEntry.COLUMN_SHIFT_TYPE,
- ShiftsEntry.COLUMN_SHIFT_UNIT,
- ShiftsEntry.COLUMN_SHIFT_PAYRATE,
- ShiftsEntry.COLUMN_SHIFT_TOTALPAY};
- Cursor cursor = getActivity().getContentResolver().query(
- ShiftsEntry.CONTENT_URI,
- projection_export,
- selection,
- args,
- sortOrder);
-
- database.delete(ShiftsEntry.TABLE_NAME_EXPORT,null,null);
-
- float totalDuration = 0.00f;
- float totalUnits = 0.00f;
- float totalPay= 0.00f;
-
- try {
- while (cursor.moveToNext()) {
- final String descriptionColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION));
- final String dateColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DATE));
- final String timeInColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TIME_IN));
- final String timeOutColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TIME_OUT));
- final Float durationColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION));
- final Integer breakOutColumnIndex = cursor.getInt(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_BREAK));
- final String typeColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE));
- final Float unitColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT));
- final Float payrateColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_PAYRATE));
- final Float totalpayColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY));
-
- totalUnits = totalUnits + unitColumnIndex;
- totalDuration = totalDuration + durationColumnIndex;
- totalPay = totalPay + totalpayColumnIndex;
-
- ContentValues values = new ContentValues();
- values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, descriptionColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_DATE, dateColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, timeInColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, timeOutColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, breakOutColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, durationColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_TYPE, typeColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_UNIT, unitColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_PAYRATE, payrateColumnIndex);
- values.put(ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalpayColumnIndex);
-
- database.insert(ShiftsEntry.TABLE_NAME_EXPORT, null, values);
-
- }
- }catch (Exception e){
- Log.e("FragmentMain", "ExportData: ", e);
- }finally {
- ContentValues values = new ContentValues();
- values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, "");
- values.put(ShiftsEntry.COLUMN_SHIFT_DATE, "");
- values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, "");
- values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, "");
- values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, "Total duration:");
- values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, totalDuration);
- values.put(ShiftsEntry.COLUMN_SHIFT_TYPE, "Total units:");
- values.put(ShiftsEntry.COLUMN_SHIFT_UNIT, totalUnits);
- values.put(ShiftsEntry.COLUMN_SHIFT_PAYRATE, "Total pay:");
- values.put(ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalPay);
-
- database.insert(ShiftsEntry.TABLE_NAME_EXPORT, null, values);
- cursor.close();
- }
-
-
- final String savePath = Environment.getExternalStorageDirectory() + "/ShifttrackerTemp";
- File file = new File(savePath);
- if (!file.exists()) {
- file.mkdirs();
- }
- SQLiteToExcel sqLiteToExcel = new SQLiteToExcel(getContext(), "shifts.db",savePath);
-
- sqLiteToExcel.exportSingleTable("shiftsexport","shifthistory.xls", new SQLiteToExcel.ExportListener() {
- @Override
- public void onStart() {
-
- }
- @Override
- public void onCompleted(String filePath) {
- Toast.makeText(getContext(), filePath, Toast.LENGTH_SHORT).show();
- Uri newPath = Uri.parse("file://" + savePath + "/" +"shifthistory.xls");
-
- StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
- StrictMode.setVmPolicy(builder.build());
-
- Intent emailintent = new Intent(Intent.ACTION_SEND);
-
- emailintent.setType("application/vnd.ms-excel");
- emailintent.putExtra(Intent.EXTRA_SUBJECT, "historic shifts");
- emailintent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");
- emailintent.putExtra(Intent.EXTRA_STREAM,newPath);
-
- startActivity(Intent.createChooser(emailintent, "Send Email"));
- }
- @Override
- public void onError(Exception e) {
- System.out.println("Error msg: " + e);
- Toast.makeText(getContext(), "Failed to Export data", Toast.LENGTH_SHORT).show();
- }
- });
- }
-
- private String retrieveInfo(){
- String[] projection = {
- ShiftsEntry._ID,
- ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
- ShiftsEntry.COLUMN_SHIFT_DATE,
- ShiftsEntry.COLUMN_SHIFT_TIME_IN,
- ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
- ShiftsEntry.COLUMN_SHIFT_BREAK,
- ShiftsEntry.COLUMN_SHIFT_DURATION,
- ShiftsEntry.COLUMN_SHIFT_TYPE,
- ShiftsEntry.COLUMN_SHIFT_UNIT,
- ShiftsEntry.COLUMN_SHIFT_PAYRATE,
- ShiftsEntry.COLUMN_SHIFT_TOTALPAY};
- Cursor cursor = getActivity().getContentResolver().query(
- ShiftsEntry.CONTENT_URI,
- projection,
- selection,
- args,
- sortOrder);
- float totalDuration = 0.0f;
- int countOfTypeH = 0;
- int countOfTypeP = 0;
- float totalUnits = 0;
- float totalPay = 0;
- int lines = 0;
- try {
- while (cursor.moveToNext()) {
- final float durationColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION));
- final String typeColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE));
- final float unitColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT));
- final float totalpayColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY));
-
- totalDuration = totalDuration + durationColumnIndex;
- if (typeColumnIndex.contains("Hourly")){
- countOfTypeH = countOfTypeH + 1;
- }else if (typeColumnIndex.contains("Piece")){
- countOfTypeP = countOfTypeP +1;
- }
- totalUnits= totalUnits + unitColumnIndex;
- totalPay = totalPay + totalpayColumnIndex;
- }
- } finally {
-
- if ((cursor != null) && (cursor.getCount() > 0)) {
- lines = cursor.getCount();
- cursor.close();
- }
-
- }
-
- return buildInfoString(totalDuration,countOfTypeH,countOfTypeP,totalUnits,totalPay,lines);
- }
-
- @SuppressLint("DefaultLocale")
- public String buildInfoString(float totalDuration, int countOfTypeH, int countOfTypeP, float totalUnits, float totalPay, int lines){
- String textString;
- textString = lines + " Shifts";
- if (countOfTypeH != 0 && countOfTypeP != 0){
- textString = textString + " (" + countOfTypeH + " Hourly" + "/" + countOfTypeP + " Piece Rate)";
- }
- if(countOfTypeH != 0){
- textString = textString
- + "\n" + "Total Hours: " + String.format("%.2f",totalDuration);
- }
- if(countOfTypeP != 0){
- textString = textString
- + "\n" + "Total Units: " + String.format("%.2f",totalUnits);
- }
-
- if (totalPay != 0){
- textString = textString
- + "\n" + "Total Pay: " + "$" + String.format("%.2f",totalPay);
- }
-
- return textString;
- }
-
- @Override
- public Loader onCreateLoader(int i, Bundle bundle) {
- String[] projection = {
- ShiftsEntry._ID,
- ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
- ShiftsEntry.COLUMN_SHIFT_DATE,
- ShiftsEntry.COLUMN_SHIFT_TIME_IN,
- ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
- ShiftsEntry.COLUMN_SHIFT_BREAK,
- ShiftsEntry.COLUMN_SHIFT_DURATION,
- ShiftsEntry.COLUMN_SHIFT_TYPE,
- ShiftsEntry.COLUMN_SHIFT_PAYRATE,
- ShiftsEntry.COLUMN_SHIFT_UNIT,
- ShiftsEntry.COLUMN_SHIFT_TOTALPAY,};
-
- return new android.support.v4.content.CursorLoader(getContext(),
- ShiftsEntry.CONTENT_URI,
- projection,
- selection,
- args,
- sortOrder);
- }
-
- @Override
- public void onLoadFinished(Loader loader, Cursor cursor) {
- mCursorAdapter.swapCursor(cursor);
- }
-
- @Override
- public void onLoaderReset(Loader loader) {
- mCursorAdapter.swapCursor(null);
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-
- System.out.println("request code" + requestCode);
- if (requestCode == MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE) {
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- exportDialog();
- } else {
- Toast.makeText(getContext(), "Storage Permissions denied", Toast.LENGTH_SHORT).show();
- }
- }
- }
-
- public void exportDialog(){
- new AlertDialog.Builder(getContext())
- .setTitle("Export?")
- .setMessage("Exporting current filtered data. Continue?")
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- ExportData();
- }
- }).create().show();
- }
-// // Storage Permissions
-// private static final int REQUEST_EXTERNAL_STORAGE = 1;
-// private static String[] PERMISSIONS_STORAGE = {
-// Manifest.permission.READ_EXTERNAL_STORAGE,
-// Manifest.permission.WRITE_EXTERNAL_STORAGE
-// };
-// /**
-// * Checks if the app has permission to write to device storage
-// *
-// * If the app does not has permission then the user will be prompted to grant permissions
-// *
-// * @param activity
-// */
-// public static void verifyStoragePermissions(Activity activity) {
-// // Check if we have write permission
-// int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
-//
-// if (permission != PackageManager.PERMISSION_GRANTED) {
-// // We don't have permission so prompt the user
-// ActivityCompat.requestPermissions(
-// activity,
-// PERMISSIONS_STORAGE,
-// REQUEST_EXTERNAL_STORAGE
-// );
-// }
-// }
-
- public static boolean checkStoragePermissions(Activity activity){
- boolean status = false;
- int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
-
- if (permission == PackageManager.PERMISSION_GRANTED ){
- status = true;
- }
-
- return status;
- }
-
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.kt b/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.kt
new file mode 100644
index 0000000..2b09b09
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/FragmentMain.kt
@@ -0,0 +1,459 @@
+package com.appttude.h_mal.farmr
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.AlertDialog
+import android.content.ContentValues
+import android.content.DialogInterface
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.database.Cursor
+import android.net.Uri
+import android.os.Bundle
+import android.os.Environment
+import android.os.StrictMode
+import android.os.StrictMode.VmPolicy
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.MenuItem
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ListView
+import android.widget.Toast
+import androidx.core.app.ActivityCompat
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
+import androidx.loader.app.LoaderManager
+import androidx.loader.content.CursorLoader
+import androidx.loader.content.Loader
+import com.ajts.androidmads.library.SQLiteToExcel
+import com.ajts.androidmads.library.SQLiteToExcel.ExportListener
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+import com.appttude.h_mal.farmr.data.ShiftsDbHelper
+import com.google.android.material.floatingactionbutton.FloatingActionButton
+import java.io.File
+
+class FragmentMain : Fragment(), LoaderManager.LoaderCallbacks {
+ var mCursorAdapter: ShiftsCursorAdapter? = null
+ var shiftsDbhelper: ShiftsDbHelper? = null
+ lateinit var defaultLoaderCallback: LoaderManager.LoaderCallbacks
+ lateinit var activity: MainActivity
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View? {
+ // Inflate the layout for this fragment
+ val rootView = inflater.inflate(R.layout.fragment_main, container, false)
+ setHasOptionsMenu(true)
+ activity = (requireActivity() as MainActivity)
+
+ activity.setActionBarTitle(getString(R.string.app_name))
+ activity.filter = activity.getSharedPreferences("PREFS", 0)
+ activity.sortOrder = activity.filter?.getString("Filter", null)
+ defaultLoaderCallback = this
+ val productListView = rootView.findViewById(R.id.list_item_view) as ListView
+ val emptyView = rootView.findViewById(R.id.empty_view)
+ productListView.emptyView = emptyView
+ mCursorAdapter = ShiftsCursorAdapter(activity, null)
+ productListView.adapter = mCursorAdapter
+ loaderManager.initLoader(DEFAULT_LOADER, null, defaultLoaderCallback)
+ val fab = rootView.findViewById(R.id.fab1)
+ fab.setOnClickListener {
+ val fragmentTransaction: FragmentTransaction = activity.fragmentManager!!.beginTransaction()
+ fragmentTransaction.replace(R.id.container, FragmentAddItem()).addToBackStack("additem").commit()
+ }
+ return rootView
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ when (item.itemId) {
+ R.id.delete_all -> {
+ deleteAllProducts()
+ return true
+ }
+
+ R.id.help -> {
+ AlertDialog.Builder(context)
+ .setTitle("Help & Support:")
+ .setView(R.layout.dialog_layout)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 -> }.create().show()
+ return true
+ }
+
+ R.id.filter_data -> {
+ val fragmentTransaction: FragmentTransaction = activity.fragmentManager!!.beginTransaction()
+ fragmentTransaction.replace(R.id.container, FilterDataFragment()).addToBackStack("filterdata").commit()
+ return true
+ }
+
+ R.id.sort_data -> {
+ sortData()
+ return true
+ }
+
+ R.id.clear_filter -> {
+ activity.args = null
+ activity.selection = null
+ NEW_LOADER = 0
+ loaderManager.restartLoader(DEFAULT_LOADER, null, this)
+ return true
+ }
+
+ R.id.export_data -> {
+ if (checkStoragePermissions(activity)) {
+ AlertDialog.Builder(context)
+ .setTitle("Export?")
+ .setMessage("Exporting current filtered data. Continue?")
+ .setNegativeButton(android.R.string.no, null)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 -> ExportData() }.create().show()
+ } else {
+ Toast.makeText(context, "Storage permissions required", Toast.LENGTH_SHORT).show()
+ }
+ return true
+ }
+
+ R.id.action_favorite -> {
+ AlertDialog.Builder(context)
+ .setTitle("Info:")
+ .setMessage(retrieveInfo())
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 -> }.create().show()
+ return true
+ }
+ }
+ return super.onOptionsItemSelected(item)
+ }
+
+ private fun sortData() {
+ val grpname = arrayOf("Added", "Date", "Name")
+ val sortQuery = arrayOf("")
+ var checkedItem = -1
+ if (activity.sortOrder != null && activity.sortOrder!!.contains(ShiftsEntry._ID)) {
+ checkedItem = 0
+ sortQuery[0] = ShiftsEntry._ID
+ } else if (activity.sortOrder != null && activity.sortOrder!!.contains(ShiftsEntry.COLUMN_SHIFT_DATE)) {
+ checkedItem = 1
+ sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DATE
+ } else if (activity.sortOrder != null && activity.sortOrder!!.contains(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)) {
+ checkedItem = 2
+ sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DESCRIPTION
+ }
+ val alt_bld = AlertDialog.Builder(context)
+ //alt_bld.setIcon(R.drawable.icon);
+ alt_bld.setTitle("Sort by:")
+ alt_bld.setSingleChoiceItems(grpname, checkedItem, DialogInterface.OnClickListener { dialog, item ->
+ when (item) {
+ 0 -> {
+ sortQuery[0] = ShiftsEntry._ID
+ return@OnClickListener
+ }
+
+ 1 -> {
+ sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DATE
+ return@OnClickListener
+ }
+
+ 2 -> sortQuery[0] = ShiftsEntry.COLUMN_SHIFT_DESCRIPTION
+ }
+ }).setPositiveButton("Ascending") { dialog, id ->
+ activity.sortOrder = sortQuery[0] + " ASC"
+ activity.filter!!.edit().putString("Filter", activity.sortOrder).apply()
+ loaderManager.restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback)
+ dialog.dismiss()
+ }.setNegativeButton("Descending") { dialog, id ->
+ activity.sortOrder = sortQuery[0] + " DESC"
+ activity.filter!!.edit().putString("Filter", activity.sortOrder).apply()
+ loaderManager.restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback)
+ dialog.dismiss()
+ }
+ val alert = alt_bld.create()
+ alert.show()
+ }
+
+ private fun deleteAllProducts() {
+ AlertDialog.Builder(context)
+ .setTitle("Delete?")
+ .setMessage("Are you sure you want to delete all date?")
+ .setNegativeButton(android.R.string.no, null)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 ->
+ val rowsDeleted = activity.contentResolver.delete(ShiftsEntry.CONTENT_URI, null, null)
+ Toast.makeText(context, "$rowsDeleted Items Deleted", Toast.LENGTH_SHORT).show()
+ }.create().show()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ if (NEW_LOADER > DEFAULT_LOADER) {
+ loaderManager.restartLoader(DEFAULT_LOADER, null, defaultLoaderCallback)
+ println("reloading loader")
+ }
+ }
+
+ private fun ExportData() {
+ val permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ if (permission != PackageManager.PERMISSION_GRANTED) {
+ Toast.makeText(context, "Storage permissions not granted", Toast.LENGTH_SHORT).show()
+ return
+ }
+ shiftsDbhelper = ShiftsDbHelper(context)
+ val database = shiftsDbhelper!!.writableDatabase
+ val projection_export = arrayOf(
+ ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
+ ShiftsEntry.COLUMN_SHIFT_DATE,
+ ShiftsEntry.COLUMN_SHIFT_TIME_IN,
+ ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
+ ShiftsEntry.COLUMN_SHIFT_BREAK,
+ ShiftsEntry.COLUMN_SHIFT_DURATION,
+ ShiftsEntry.COLUMN_SHIFT_TYPE,
+ ShiftsEntry.COLUMN_SHIFT_UNIT,
+ ShiftsEntry.COLUMN_SHIFT_PAYRATE,
+ ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ val cursor = activity.contentResolver.query(
+ ShiftsEntry.CONTENT_URI,
+ projection_export,
+ activity.selection,
+ activity.args,
+ activity.sortOrder)
+ database.delete(ShiftsEntry.TABLE_NAME_EXPORT, null, null)
+ var totalDuration = 0.00f
+ var totalUnits = 0.00f
+ var totalPay = 0.00f
+ try {
+ while (cursor!!.moveToNext()) {
+ val descriptionColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION))
+ val dateColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DATE))
+ val timeInColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TIME_IN))
+ val timeOutColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TIME_OUT))
+ val durationColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION))
+ val breakOutColumnIndex = cursor.getInt(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_BREAK))
+ val typeColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE))
+ val unitColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT))
+ val payrateColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_PAYRATE))
+ val totalpayColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY))
+ totalUnits = totalUnits + unitColumnIndex
+ totalDuration = totalDuration + durationColumnIndex
+ totalPay = totalPay + totalpayColumnIndex
+ val values = ContentValues()
+ values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, descriptionColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_DATE, dateColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, timeInColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, timeOutColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, breakOutColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, durationColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TYPE, typeColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_UNIT, unitColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_PAYRATE, payrateColumnIndex)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalpayColumnIndex)
+ database.insert(ShiftsEntry.TABLE_NAME_EXPORT, null, values)
+ }
+ } catch (e: Exception) {
+ Log.e("FragmentMain", "ExportData: ", e)
+ } finally {
+ val values = ContentValues()
+ values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, "")
+ values.put(ShiftsEntry.COLUMN_SHIFT_DATE, "")
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, "")
+ values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, "")
+ values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, "Total duration:")
+ values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, totalDuration)
+ values.put(ShiftsEntry.COLUMN_SHIFT_TYPE, "Total units:")
+ values.put(ShiftsEntry.COLUMN_SHIFT_UNIT, totalUnits)
+ values.put(ShiftsEntry.COLUMN_SHIFT_PAYRATE, "Total pay:")
+ values.put(ShiftsEntry.COLUMN_SHIFT_TOTALPAY, totalPay)
+ database.insert(ShiftsEntry.TABLE_NAME_EXPORT, null, values)
+ cursor!!.close()
+ }
+ val savePath = Environment.getExternalStorageDirectory().toString() + "/ShifttrackerTemp"
+ val file = File(savePath)
+ if (!file.exists()) {
+ file.mkdirs()
+ }
+ val sqLiteToExcel = SQLiteToExcel(context, "shifts.db", savePath)
+ sqLiteToExcel.exportSingleTable("shiftsexport", "shifthistory.xls", object : ExportListener {
+ override fun onStart() {}
+ override fun onCompleted(filePath: String) {
+ Toast.makeText(context, filePath, Toast.LENGTH_SHORT).show()
+ val newPath = Uri.parse("file://$savePath/shifthistory.xls")
+ val builder = VmPolicy.Builder()
+ StrictMode.setVmPolicy(builder.build())
+ val emailintent = Intent(Intent.ACTION_SEND)
+ emailintent.type = "application/vnd.ms-excel"
+ emailintent.putExtra(Intent.EXTRA_SUBJECT, "historic shifts")
+ emailintent.putExtra(Intent.EXTRA_TEXT, "I'm email body.")
+ emailintent.putExtra(Intent.EXTRA_STREAM, newPath)
+ startActivity(Intent.createChooser(emailintent, "Send Email"))
+ }
+
+ override fun onError(e: Exception) {
+ println("Error msg: $e")
+ Toast.makeText(context, "Failed to Export data", Toast.LENGTH_SHORT).show()
+ }
+ })
+ }
+
+ private fun retrieveInfo(): String {
+ val projection = arrayOf(
+ ShiftsEntry._ID,
+ ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
+ ShiftsEntry.COLUMN_SHIFT_DATE,
+ ShiftsEntry.COLUMN_SHIFT_TIME_IN,
+ ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
+ ShiftsEntry.COLUMN_SHIFT_BREAK,
+ ShiftsEntry.COLUMN_SHIFT_DURATION,
+ ShiftsEntry.COLUMN_SHIFT_TYPE,
+ ShiftsEntry.COLUMN_SHIFT_UNIT,
+ ShiftsEntry.COLUMN_SHIFT_PAYRATE,
+ ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ val cursor = activity.contentResolver.query(
+ ShiftsEntry.CONTENT_URI,
+ projection,
+ activity.selection,
+ activity.args,
+ activity.sortOrder)
+ var totalDuration = 0.0f
+ var countOfTypeH = 0
+ var countOfTypeP = 0
+ var totalUnits = 0f
+ var totalPay = 0f
+ var lines = 0
+ try {
+ while (cursor!!.moveToNext()) {
+ val durationColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION))
+ val typeColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE))
+ val unitColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT))
+ val totalpayColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY))
+ totalDuration = totalDuration + durationColumnIndex
+ if (typeColumnIndex.contains("Hourly")) {
+ countOfTypeH = countOfTypeH + 1
+ } else if (typeColumnIndex.contains("Piece")) {
+ countOfTypeP = countOfTypeP + 1
+ }
+ totalUnits = totalUnits + unitColumnIndex
+ totalPay = totalPay + totalpayColumnIndex
+ }
+ } finally {
+ if (cursor != null && cursor.count > 0) {
+ lines = cursor.count
+ cursor.close()
+ }
+ }
+ return buildInfoString(totalDuration, countOfTypeH, countOfTypeP, totalUnits, totalPay, lines)
+ }
+
+ @SuppressLint("DefaultLocale")
+ fun buildInfoString(totalDuration: Float, countOfTypeH: Int, countOfTypeP: Int, totalUnits: Float, totalPay: Float, lines: Int): String {
+ var textString: String
+ textString = "$lines Shifts"
+ if (countOfTypeH != 0 && countOfTypeP != 0) {
+ textString = "$textString ($countOfTypeH Hourly/$countOfTypeP Piece Rate)"
+ }
+ if (countOfTypeH != 0) {
+ textString = """
+ $textString
+ Total Hours: ${String.format("%.2f", totalDuration)}
+ """.trimIndent()
+ }
+ if (countOfTypeP != 0) {
+ textString = """
+ $textString
+ Total Units: ${String.format("%.2f", totalUnits)}
+ """.trimIndent()
+ }
+ if (totalPay != 0f) {
+ textString = """
+ $textString
+ Total Pay: ${"$"}${String.format("%.2f", totalPay)}
+ """.trimIndent()
+ }
+ return textString
+ }
+
+ override fun onCreateLoader(i: Int, bundle: Bundle?): Loader {
+ val projection = arrayOf(
+ ShiftsEntry._ID,
+ ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
+ ShiftsEntry.COLUMN_SHIFT_DATE,
+ ShiftsEntry.COLUMN_SHIFT_TIME_IN,
+ ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
+ ShiftsEntry.COLUMN_SHIFT_BREAK,
+ ShiftsEntry.COLUMN_SHIFT_DURATION,
+ ShiftsEntry.COLUMN_SHIFT_TYPE,
+ ShiftsEntry.COLUMN_SHIFT_PAYRATE,
+ ShiftsEntry.COLUMN_SHIFT_UNIT,
+ ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ return CursorLoader(context!!,
+ ShiftsEntry.CONTENT_URI,
+ projection,
+ activity.selection,
+ activity.args,
+ activity.sortOrder)
+ }
+
+ override fun onLoadFinished(loader: Loader, cursor: Cursor) {
+ mCursorAdapter!!.swapCursor(cursor)
+ }
+
+ override fun onLoaderReset(loader: Loader) {
+ mCursorAdapter!!.swapCursor(null)
+ }
+
+ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ println("request code$requestCode")
+ if (requestCode == MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE) {
+ if (grantResults.size > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ exportDialog()
+ } else {
+ Toast.makeText(context, "Storage Permissions denied", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+
+ fun exportDialog() {
+ AlertDialog.Builder(context)
+ .setTitle("Export?")
+ .setMessage("Exporting current filtered data. Continue?")
+ .setNegativeButton(android.R.string.no, null)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 -> ExportData() }.create().show()
+ }
+
+ companion object {
+ const val MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1
+ private const val DEFAULT_LOADER = 0
+ var NEW_LOADER = 0
+
+ // // Storage Permissions
+ // private static final int REQUEST_EXTERNAL_STORAGE = 1;
+ // private static String[] PERMISSIONS_STORAGE = {
+ // Manifest.permission.READ_EXTERNAL_STORAGE,
+ // Manifest.permission.WRITE_EXTERNAL_STORAGE
+ // };
+ // /**
+ // * Checks if the app has permission to write to device storage
+ // *
+ // * If the app does not has permission then the user will be prompted to grant permissions
+ // *
+ // * @param activity
+ // */
+ // public static void verifyStoragePermissions(Activity activity) {
+ // // Check if we have write permission
+ // int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ //
+ // if (permission != PackageManager.PERMISSION_GRANTED) {
+ // // We don't have permission so prompt the user
+ // ActivityCompat.requestPermissions(
+ // activity,
+ // PERMISSIONS_STORAGE,
+ // REQUEST_EXTERNAL_STORAGE
+ // );
+ // }
+ // }
+ fun checkStoragePermissions(activity: Activity?): Boolean {
+ var status = false
+ val permission = ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ if (permission == PackageManager.PERMISSION_GRANTED) {
+ status = true
+ }
+ return status
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.java b/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.java
deleted file mode 100644
index 77dc060..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.Loader;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.appttude.h_mal.farmr.Data.ShiftsContract;
-
-
-public class FurtherInfoFragment extends Fragment implements
- LoaderManager.LoaderCallbacks {
-
- private static final int DEFAULT_LOADER = 0;
-
- private TextView typeTV;
- private TextView descriptionTV;
- private TextView dateTV;
- private TextView times;
- private TextView breakTV;
- private TextView durationTV;
- private TextView unitsTV;
- private TextView payRateTV;
- private TextView totalPayTV;
- private LinearLayout hourlyDetailHolder;
- private LinearLayout unitsHolder;
- private LinearLayout wholeView;
- private ProgressBar progressBarFI;
- private Button editButton;
-
- private Uri CurrentUri;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View rootView = inflater.inflate(R.layout.fragment_futher_info, container, false);
-
- MainActivity.setActionBarTitle(getString(R.string.further_info_title));
-
- setHasOptionsMenu(true);
-
- progressBarFI = (ProgressBar) rootView.findViewById(R.id.progressBar_info);
- wholeView = (LinearLayout) rootView.findViewById(R.id.further_info_view);
- typeTV = (TextView)rootView.findViewById(R.id.details_shift);
- descriptionTV = (TextView)rootView.findViewById(R.id.details_desc);
- dateTV = (TextView)rootView.findViewById(R.id.details_date);
- times = (TextView)rootView.findViewById(R.id.details_time);
- breakTV = (TextView)rootView.findViewById(R.id.details_breaks);
- durationTV = (TextView)rootView.findViewById(R.id.details_duration);
- unitsTV = (TextView)rootView.findViewById(R.id.details_units);
- payRateTV = (TextView)rootView.findViewById(R.id.details_pay_rate);
- totalPayTV = (TextView)rootView.findViewById(R.id.details_totalpay);
- editButton = (Button) rootView.findViewById(R.id.details_edit);
- hourlyDetailHolder = (LinearLayout) rootView.findViewById(R.id.details_hourly_details);
- unitsHolder = (LinearLayout) rootView.findViewById(R.id.details_units_holder);
-
- final Bundle b = getArguments();
- CurrentUri = Uri.parse(b.getString("uri"));
-
- getLoaderManager().initLoader(DEFAULT_LOADER, null, this);
-
- editButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- FragmentTransaction fragmentTransaction = (MainActivity.fragmentManager).beginTransaction();
- Fragment fragment = new FragmentAddItem();
- fragment.setArguments(b);
- fragmentTransaction.replace(R.id.container,fragment).addToBackStack("additem").commit();
- }
- });
-
-
- return rootView;
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- menu.clear();
- }
-
- @Override
- public Loader onCreateLoader(int id, Bundle args) {
- progressBarFI.setVisibility(View.VISIBLE);
- wholeView.setVisibility(View.GONE);
- String[] projection = {
- ShiftsContract.ShiftsEntry._ID,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT,
- ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY,};
-
- return new android.support.v4.content.CursorLoader(getContext(),CurrentUri,
- projection,null,null,null);
- }
-
- @Override
- public void onLoadFinished(android.support.v4.content.Loader loader, Cursor cursor) {
- progressBarFI.setVisibility(View.GONE);
- wholeView.setVisibility(View.VISIBLE);
- if (cursor == null || cursor.getCount() < 1) {
- return;
- }
-
- if (cursor.moveToFirst()) {
- int descriptionColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DESCRIPTION);
- int dateColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DATE);
- int timeInColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_IN);
- int timeOutColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TIME_OUT);
- int breakColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_BREAK);
- int durationColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_DURATION);
- int typeColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TYPE);
- int unitColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_UNIT);
- int payrateColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_PAYRATE);
- int totalPayColumnIndex = cursor.getColumnIndex(ShiftsContract.ShiftsEntry.COLUMN_SHIFT_TOTALPAY);
-
- String type = cursor.getString(typeColumnIndex);
- String description = cursor.getString(descriptionColumnIndex);
- String date = cursor.getString(dateColumnIndex);
- String timeIn = cursor.getString(timeInColumnIndex);
- String timeOut = cursor.getString(timeOutColumnIndex);
- int breaks = cursor.getInt(breakColumnIndex);
- float duration = cursor.getFloat(durationColumnIndex);
- float unit = cursor.getFloat(unitColumnIndex);
- float payrate = cursor.getFloat(payrateColumnIndex);
- float totalPay = cursor.getFloat(totalPayColumnIndex);
-
- String durationString = ShiftsCursorAdapter.timeValues(duration)[0] + " Hours " + ShiftsCursorAdapter.timeValues(duration)[1] + " Minutes ";
- if(breaks != 0){
- durationString = durationString + " (+ " + Integer.toString(breaks) + " minutes break)";
- }
-
- typeTV.setText(type);
- descriptionTV.setText(description);
- dateTV.setText(date);
- String totalPaid = "";
- String currency = "$";
- if(type.equals("Hourly")){
- hourlyDetailHolder.setVisibility(View.VISIBLE);
- unitsHolder.setVisibility(View.GONE);
- times.setText(timeIn + " - " + timeOut);
- breakTV.setText(Integer.toString(breaks) + "mins");
- durationTV.setText(durationString);
- totalPaid = String.format("%.2f",duration) + " Hours @ " + currency + String.format("%.2f",payrate) + " per Hour" + "\n"
- + "Equals: " + currency + String.format("%.2f",totalPay);
- }else if(type.equals("Piece Rate")){
- hourlyDetailHolder.setVisibility(View.GONE);
- unitsHolder.setVisibility(View.VISIBLE);
- unitsTV.setText(String.format("%.2f",unit));
- totalPaid = String.format("%.2f",unit) + " Units @ " + currency + String.format("%.2f",payrate) + " per Unit" + "\n"
- + "Equals: " + currency + String.format("%.2f",totalPay);
- }
-
- payRateTV.setText(String.format("%.2f",payrate));
- totalPayTV.setText(totalPaid);
-
- }
- }
-
- @Override
- public void onLoaderReset(android.support.v4.content.Loader loader) {
-
- }
-
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.kt
new file mode 100644
index 0000000..eedc41d
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/FurtherInfoFragment.kt
@@ -0,0 +1,161 @@
+package com.appttude.h_mal.farmr
+
+import android.database.Cursor
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.LinearLayout
+import android.widget.ProgressBar
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
+import androidx.loader.app.LoaderManager
+import androidx.loader.content.CursorLoader
+import androidx.loader.content.Loader
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+
+class FurtherInfoFragment : Fragment(), LoaderManager.LoaderCallbacks {
+ private var typeTV: TextView? = null
+ private var descriptionTV: TextView? = null
+ private var dateTV: TextView? = null
+ private var times: TextView? = null
+ private var breakTV: TextView? = null
+ private var durationTV: TextView? = null
+ private var unitsTV: TextView? = null
+ private var payRateTV: TextView? = null
+ private var totalPayTV: TextView? = null
+ private var hourlyDetailHolder: LinearLayout? = null
+ private var unitsHolder: LinearLayout? = null
+ private var wholeView: LinearLayout? = null
+ private var progressBarFI: ProgressBar? = null
+ private var editButton: Button? = null
+ private var CurrentUri: Uri? = null
+
+ lateinit var activity: MainActivity
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View {
+ // Inflate the layout for this fragment
+ val rootView: View = inflater.inflate(R.layout.fragment_futher_info, container, false)
+ setHasOptionsMenu(true)
+ activity = (requireActivity() as MainActivity)
+ activity.setActionBarTitle(getString(R.string.further_info_title))
+
+ progressBarFI = rootView.findViewById(R.id.progressBar_info) as ProgressBar?
+ wholeView = rootView.findViewById(R.id.further_info_view) as LinearLayout?
+ typeTV = rootView.findViewById(R.id.details_shift) as TextView?
+ descriptionTV = rootView.findViewById(R.id.details_desc) as TextView?
+ dateTV = rootView.findViewById(R.id.details_date) as TextView?
+ times = rootView.findViewById(R.id.details_time) as TextView?
+ breakTV = rootView.findViewById(R.id.details_breaks) as TextView?
+ durationTV = rootView.findViewById(R.id.details_duration) as TextView?
+ unitsTV = rootView.findViewById(R.id.details_units) as TextView?
+ payRateTV = rootView.findViewById(R.id.details_pay_rate) as TextView?
+ totalPayTV = rootView.findViewById(R.id.details_totalpay) as TextView?
+ editButton = rootView.findViewById(R.id.details_edit) as Button?
+ hourlyDetailHolder = rootView.findViewById(R.id.details_hourly_details) as LinearLayout?
+ unitsHolder = rootView.findViewById(R.id.details_units_holder) as LinearLayout?
+ val b: Bundle? = arguments
+ CurrentUri = Uri.parse(b!!.getString("uri"))
+ loaderManager.initLoader(DEFAULT_LOADER, null, this)
+ editButton!!.setOnClickListener(object : View.OnClickListener {
+ override fun onClick(view: View) {
+ val fragmentTransaction: FragmentTransaction = (activity.fragmentManager)!!.beginTransaction()
+ val fragment: Fragment = FragmentAddItem()
+ fragment.arguments = b
+ fragmentTransaction.replace(R.id.container, fragment).addToBackStack("additem").commit()
+ }
+ })
+ return rootView
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+ super.onCreateOptionsMenu(menu, inflater)
+ menu.clear()
+ }
+
+ override fun onCreateLoader(id: Int, args: Bundle?): Loader {
+ progressBarFI!!.visibility = View.VISIBLE
+ wholeView!!.visibility = View.GONE
+ val projection: Array = arrayOf(
+ ShiftsEntry._ID,
+ ShiftsEntry.COLUMN_SHIFT_DESCRIPTION,
+ ShiftsEntry.COLUMN_SHIFT_DATE,
+ ShiftsEntry.COLUMN_SHIFT_TIME_IN,
+ ShiftsEntry.COLUMN_SHIFT_TIME_OUT,
+ ShiftsEntry.COLUMN_SHIFT_BREAK,
+ ShiftsEntry.COLUMN_SHIFT_DURATION,
+ ShiftsEntry.COLUMN_SHIFT_TYPE,
+ ShiftsEntry.COLUMN_SHIFT_PAYRATE,
+ ShiftsEntry.COLUMN_SHIFT_UNIT,
+ ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ return CursorLoader((context)!!, (CurrentUri)!!,
+ projection, null, null, null)
+ }
+
+ override fun onLoadFinished(loader: Loader, cursor: Cursor) {
+ progressBarFI!!.visibility = View.GONE
+ wholeView!!.visibility = View.VISIBLE
+ if (cursor == null || cursor.count < 1) {
+ return
+ }
+ if (cursor.moveToFirst()) {
+ val descriptionColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)
+ val dateColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DATE)
+ val timeInColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_IN)
+ val timeOutColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)
+ val breakColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_BREAK)
+ val durationColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DURATION)
+ val typeColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TYPE)
+ val unitColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_UNIT)
+ val payrateColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_PAYRATE)
+ val totalPayColumnIndex: Int = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ val type: String = cursor.getString(typeColumnIndex)
+ val description: String = cursor.getString(descriptionColumnIndex)
+ val date: String = cursor.getString(dateColumnIndex)
+ val timeIn: String = cursor.getString(timeInColumnIndex)
+ val timeOut: String = cursor.getString(timeOutColumnIndex)
+ val breaks: Int = cursor.getInt(breakColumnIndex)
+ val duration: Float = cursor.getFloat(durationColumnIndex)
+ val unit: Float = cursor.getFloat(unitColumnIndex)
+ val payrate: Float = cursor.getFloat(payrateColumnIndex)
+ val totalPay: Float = cursor.getFloat(totalPayColumnIndex)
+ var durationString: String = ShiftsCursorAdapter.Companion.timeValues(duration).get(0) + " Hours " + ShiftsCursorAdapter.Companion.timeValues(duration).get(1) + " Minutes "
+ if (breaks != 0) {
+ durationString = durationString + " (+ " + Integer.toString(breaks) + " minutes break)"
+ }
+ typeTV!!.text = type
+ descriptionTV!!.text = description
+ dateTV!!.text = date
+ var totalPaid: String? = ""
+ val currency: String = "$"
+ if ((type == "Hourly")) {
+ hourlyDetailHolder!!.visibility = View.VISIBLE
+ unitsHolder!!.visibility = View.GONE
+ times!!.text = timeIn + " - " + timeOut
+ breakTV!!.text = Integer.toString(breaks) + "mins"
+ durationTV!!.text = durationString
+ totalPaid = (String.format("%.2f", duration) + " Hours @ " + currency + String.format("%.2f", payrate) + " per Hour" + "\n"
+ + "Equals: " + currency + String.format("%.2f", totalPay))
+ } else if ((type == "Piece Rate")) {
+ hourlyDetailHolder!!.visibility = View.GONE
+ unitsHolder!!.visibility = View.VISIBLE
+ unitsTV!!.text = String.format("%.2f", unit)
+ totalPaid = (String.format("%.2f", unit) + " Units @ " + currency + String.format("%.2f", payrate) + " per Unit" + "\n"
+ + "Equals: " + currency + String.format("%.2f", totalPay))
+ }
+ payRateTV!!.text = String.format("%.2f", payrate)
+ totalPayTV!!.text = totalPaid
+ }
+ }
+
+ override fun onLoaderReset(loader: Loader) {}
+
+ companion object {
+ private val DEFAULT_LOADER: Int = 0
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.java b/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.java
deleted file mode 100644
index 5612f42..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.view.Menu;
-
-import java.util.List;
-
-public class MainActivity extends AppCompatActivity {
-
- public static SharedPreferences filter;
- public static Context context;
- static String sortOrder;
- public static String selection;
- public static String[] args;
- private static Toolbar toolbar;
- public static FragmentManager fragmentManager;
- private String currentFragment;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main_view);
-
- verifyStoragePermissions(this);
-
- toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
-
- fragmentManager = getSupportFragmentManager();
- FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
- fragmentTransaction.replace(R.id.container,new FragmentMain()).addToBackStack("main").commit();
-
- fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
- @Override
- public void onBackStackChanged() {
- List f = fragmentManager.getFragments();
- Fragment frag = f.get(0);
- currentFragment = frag.getClass().getSimpleName();
- }
- });
-
- }
- public static void setActionBarTitle(String title){
- toolbar.setTitle(title);
- }
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
-
- @Override
- public void onBackPressed() {
-
- switch (currentFragment) {
- case "FragmentMain":
- new AlertDialog.Builder(this)
- .setTitle("Leave?")
- .setMessage("Are you sure you want to exit Farmr?")
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- intent.addCategory(Intent.CATEGORY_HOME);
- startActivity(intent);
- finish();
- System.exit(0);
- }
- }).create().show();
- return;
- case "FragmentAddItem":
- if(FragmentAddItem.mRadioGroup.getCheckedRadioButtonId() == -1) {
- fragmentManager.popBackStack();
- }else{
- new AlertDialog.Builder(this)
- .setTitle("Discard Changes?")
- .setMessage("Are you sure you want to discard changes?")
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- fragmentManager.popBackStack();
- }
- }).create().show();
-
- }
- return;
- default:
- if (fragmentManager.getBackStackEntryCount() > 1) {
- fragmentManager.popBackStack();
- }
- }
-
- }
-
- // Storage Permissions
- private static final int REQUEST_EXTERNAL_STORAGE = 1;
- private static String[] PERMISSIONS_STORAGE = {
- Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
- };
- /**
- * Checks if the app has permission to write to device storage
- *
- * If the app does not has permission then the user will be prompted to grant permissions
- *
- * @param activity
- */
- public static void verifyStoragePermissions(Activity activity) {
- // Check if we have write permission
- int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
-
- if (permission != PackageManager.PERMISSION_GRANTED) {
- // We don't have permission so prompt the user
- ActivityCompat.requestPermissions(
- activity,
- PERMISSIONS_STORAGE,
- REQUEST_EXTERNAL_STORAGE
- );
- }
- }
-
-
-// @Override
-// protected void onUserLeaveHint() {
-// super.onUserLeaveHint();
-//
-// Intent intent = getIntent();
-// String activity = intent.getStringExtra("activity");
-//
-// if (activity == null || !activity.equals("first") || !activity.equals("firsttime")) {
-// NavUtils.navigateUpFromSameTask(MainActivity.this);
-// } else {
-// getIntent().removeExtra("activity");
-// }
-//
-// }
-
-// @Override
-// protected void onPause() {
-// super.onPause();
-// // If the screen is off then the device has been locked
-// PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
-// boolean isScreenOn;
-// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
-// isScreenOn = powerManager.isInteractive();
-// } else {
-// isScreenOn = powerManager.isScreenOn();
-// }
-//
-// if (!isScreenOn) {
-// Intent intent = getIntent();
-// String activity = intent.getStringExtra("activity");
-// if (activity == null || !activity.equals("first") || !activity.equals("firsttime")){
-// NavUtils.navigateUpFromSameTask(MainActivity.this);
-// }else {
-// getIntent().removeExtra("activity");
-// }
-// System.out.println("mainactivity");
-// }
-// }
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.kt
new file mode 100644
index 0000000..a0cbd9c
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/MainActivity.kt
@@ -0,0 +1,116 @@
+package com.appttude.h_mal.farmr
+
+import android.Manifest
+import android.app.Activity
+import android.app.AlertDialog
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.view.Menu
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
+import androidx.core.app.ActivityCompat
+import androidx.fragment.app.FragmentManager
+
+class MainActivity : AppCompatActivity() {
+ var filter: SharedPreferences? = null
+ var context: Context? = null
+ var sortOrder: String? = null
+ var selection: String? = null
+ var args: Array? = null
+ private var toolbar: Toolbar? = null
+ var fragmentManager: FragmentManager? = null
+ private var currentFragment: String? = null
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.main_view)
+ verifyStoragePermissions(this)
+ toolbar = findViewById(R.id.toolbar) as Toolbar
+ setSupportActionBar(toolbar)
+ fragmentManager = supportFragmentManager
+ val fragmentTransaction = fragmentManager?.beginTransaction()
+ fragmentTransaction?.replace(R.id.container, FragmentMain())?.addToBackStack("main")?.commit()
+ fragmentManager?.addOnBackStackChangedListener {
+ val f = fragmentManager?.fragments
+ val frag = f?.get(0)
+ currentFragment = frag?.javaClass?.simpleName
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ menuInflater.inflate(R.menu.menu_main, menu)
+ return true
+ }
+
+ override fun onBackPressed() {
+ when (currentFragment) {
+ "FragmentMain" -> {
+ AlertDialog.Builder(this)
+ .setTitle("Leave?")
+ .setMessage("Are you sure you want to exit Farmr?")
+ .setNegativeButton(android.R.string.no, null)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 ->
+ val intent = Intent(Intent.ACTION_MAIN)
+ intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
+ intent.addCategory(Intent.CATEGORY_HOME)
+ startActivity(intent)
+ finish()
+ System.exit(0)
+ }.create().show()
+ return
+ }
+
+ "FragmentAddItem" -> {
+ if (FragmentAddItem.Companion.mRadioGroup!!.checkedRadioButtonId == -1) {
+ fragmentManager!!.popBackStack()
+ } else {
+ AlertDialog.Builder(this)
+ .setTitle("Discard Changes?")
+ .setMessage("Are you sure you want to discard changes?")
+ .setNegativeButton(android.R.string.no, null)
+ .setPositiveButton(android.R.string.yes) { arg0, arg1 -> fragmentManager!!.popBackStack() }.create().show()
+ }
+ return
+ }
+
+ else -> if (fragmentManager!!.backStackEntryCount > 1) {
+ fragmentManager!!.popBackStack()
+ }
+ }
+ }
+
+ fun setActionBarTitle(title: String?) {
+ toolbar!!.title = title
+ }
+
+ // Storage Permissions
+ private val REQUEST_EXTERNAL_STORAGE = 1
+ private val PERMISSIONS_STORAGE = arrayOf(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ )
+
+ /**
+ * Checks if the app has permission to write to device storage
+ *
+ * If the app does not has permission then the user will be prompted to grant permissions
+ *
+ * @param activity
+ */
+ fun verifyStoragePermissions(activity: Activity?) {
+ // Check if we have write permission
+ val permission = ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ if (permission != PackageManager.PERMISSION_GRANTED) {
+ // We don't have permission so prompt the user
+ ActivityCompat.requestPermissions(
+ activity,
+ PERMISSIONS_STORAGE,
+ REQUEST_EXTERNAL_STORAGE
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.java b/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.java
deleted file mode 100644
index 3631ad9..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CursorAdapter;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.appttude.h_mal.farmr.Data.ShiftProvider;
-import com.appttude.h_mal.farmr.Data.ShiftsContract.ShiftsEntry;
-
-/**
- * Created by h_mal on 26/12/2017.
- */
-
-public class ShiftsCursorAdapter extends CursorAdapter {
-
- private final MainActivity activity;
-
- private Context mContext;
-
- ShiftProvider shiftProvider;
-
- public ShiftsCursorAdapter(MainActivity context, Cursor c) {
- super(context, c, 0);
- this.activity = context;
- }
-
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return LayoutInflater.from(context).inflate(R.layout.list_item_1, parent, false);
- }
-
-
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- mContext = context;
-
- TextView descriptionTextView = (TextView) view.findViewById(R.id.location);
- TextView dateTextView = (TextView) view.findViewById(R.id.date);
- TextView totalPay = (TextView) view.findViewById(R.id.total_pay);
- TextView hoursView = (TextView) view.findViewById(R.id.hours);
- TextView h = (TextView) view.findViewById(R.id.h);
- TextView minutesView = (TextView) view.findViewById(R.id.minutes);
- TextView m = (TextView) view.findViewById(R.id.m);
- ImageView editView = (ImageView) view.findViewById(R.id.imageView);
-
- h.setText("h");
- m.setText("m");
-
- final String typeColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE));
- final String descriptionColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION));
- final String dateColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DATE));
- final Float durationColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION));
- final Float unitsColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT));
- final Float totalpayColumnIndex = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY));
-
- descriptionTextView.setText(descriptionColumnIndex);
- dateTextView.setText(newDate(dateColumnIndex));
- totalPay.setText(String.format("%.2f",totalpayColumnIndex));
-
- if (typeColumnIndex.equals("Piece Rate") && durationColumnIndex == 0){
- hoursView.setText(String.valueOf(unitsColumnIndex));
- h.setText("");
- minutesView.setText("");
- m.setText("pcs");
- }else
-// if(typeColumnIndex.equals("Hourly") || typeColumnIndex.equals("hourly"))
- {
- hoursView.setText(timeValues(durationColumnIndex)[0]);
- minutesView.setText(timeValues(durationColumnIndex)[1]);
- }
-
- final long ID = cursor.getLong(cursor.getColumnIndexOrThrow(ShiftsEntry._ID));
- final Uri currentProductUri = ContentUris.withAppendedId(ShiftsEntry.CONTENT_URI, ID);
-
- final Bundle b = new Bundle();
- b.putString("uri",String.valueOf(currentProductUri));
-
- view.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
-// activity.clickOnViewItem(ID);
- FragmentTransaction fragmentTransaction = (MainActivity.fragmentManager).beginTransaction();
- FurtherInfoFragment fragment2 = new FurtherInfoFragment();
- fragment2.setArguments(b);
- fragmentTransaction.replace(R.id.container,fragment2).addToBackStack("furtherinfo").commit();
- }
- });
-
- editView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- FragmentTransaction fragmentTransaction = (MainActivity.fragmentManager).beginTransaction();
- FragmentAddItem fragment3 = new FragmentAddItem();
- fragment3.setArguments(b);
- fragmentTransaction.replace(R.id.container,fragment3).addToBackStack("additem").commit();
- }
- });
-
- view.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View view) {
- System.out.println("long click: " + ID);
-
- android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(mContext);
- builder.setMessage("Are you sure you want to delete");
- builder.setPositiveButton("delete", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- deleteProduct(ID);
- }
- });
- builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
-
- if (dialog != null) {
- dialog.dismiss();
- }
- }
- });
-
- android.app.AlertDialog alertDialog = builder.create();
- alertDialog.show();
- return true;
- }
- });
-
- }
-
- private void deleteProduct(Long id) {
- String[] args = new String [] {String.valueOf(id)};
-// String whereClause = String.format(ShiftsEntry._ID + " in (%s)", new Object[] { TextUtils.join(",", Collections.nCopies(args.length, "?")) }); //for deleting multiple lines
-
- mContext.getContentResolver().delete(ShiftsEntry.CONTENT_URI, ShiftsEntry._ID + "=?", args);
- }
-
- private String newDate(String dateString){
-
- String returnString = "01/01/2010";
-
- String year = dateString.substring(0, 4);
- String month = dateString.substring(5, 7);
- String day = dateString.substring(8);
-
- returnString = day + "-" + month + "-" + year;
-
- return returnString;
- }
-
- public static String[] timeValues(Float duration){
-
- int hours = (int) Math.floor(duration);
- int minutes = (int) ((duration - hours)*60);
-
- String hoursString = hours + "";
- String minutesString = String.format("%02d", minutes);
-
- return new String[]{hoursString,minutesString};
- }
-
-}
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.kt
new file mode 100644
index 0000000..0163f95
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/ShiftsCursorAdapter.kt
@@ -0,0 +1,117 @@
+package com.appttude.h_mal.farmr
+
+import android.app.AlertDialog
+import android.content.ContentUris
+import android.content.Context
+import android.content.DialogInterface
+import android.database.Cursor
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.View.OnLongClickListener
+import android.view.ViewGroup
+import android.widget.CursorAdapter
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.fragment.app.FragmentTransaction
+import com.appttude.h_mal.farmr.data.ShiftProvider
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+import kotlin.math.floor
+
+/**
+ * Created by h_mal on 26/12/2017.
+ */
+class ShiftsCursorAdapter constructor(private val activity: MainActivity, c: Cursor?) : CursorAdapter(activity, c, 0) {
+ private var mContext: Context? = null
+ var shiftProvider: ShiftProvider? = null
+ override fun newView(context: Context, cursor: Cursor, parent: ViewGroup): View {
+ return LayoutInflater.from(context).inflate(R.layout.list_item_1, parent, false)
+ }
+
+ override fun bindView(view: View, context: Context, cursor: Cursor) {
+ mContext = context
+ val descriptionTextView: TextView = view.findViewById(R.id.location) as TextView
+ val dateTextView: TextView = view.findViewById(R.id.date) as TextView
+ val totalPay: TextView = view.findViewById(R.id.total_pay) as TextView
+ val hoursView: TextView = view.findViewById(R.id.hours) as TextView
+ val h: TextView = view.findViewById(R.id.h) as TextView
+ val minutesView: TextView = view.findViewById(R.id.minutes) as TextView
+ val m: TextView = view.findViewById(R.id.m) as TextView
+ val editView: ImageView = view.findViewById(R.id.imageView) as ImageView
+ h.text = "h"
+ m.text = "m"
+ val typeColumnIndex: String = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TYPE))
+ val descriptionColumnIndex: String = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION))
+ val dateColumnIndex: String = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DATE))
+ val durationColumnIndex: Float = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION))
+ val unitsColumnIndex: Float = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_UNIT))
+ val totalpayColumnIndex: Float = cursor.getFloat(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_TOTALPAY))
+ descriptionTextView.text = descriptionColumnIndex
+ dateTextView.text = newDate(dateColumnIndex)
+ totalPay.text = String.format("%.2f", totalpayColumnIndex)
+ if ((typeColumnIndex == "Piece Rate") && durationColumnIndex == 0f) {
+ hoursView.text = unitsColumnIndex.toString()
+ h.text = ""
+ minutesView.text = ""
+ m.text = "pcs"
+ } else // if(typeColumnIndex.equals("Hourly") || typeColumnIndex.equals("hourly"))
+ {
+ hoursView.text = timeValues(durationColumnIndex).get(0)
+ minutesView.text = timeValues(durationColumnIndex).get(1)
+ }
+ val ID: Long = cursor.getLong(cursor.getColumnIndexOrThrow(ShiftsEntry._ID))
+ val currentProductUri: Uri = ContentUris.withAppendedId(ShiftsEntry.CONTENT_URI, ID)
+ val b: Bundle = Bundle()
+ b.putString("uri", currentProductUri.toString())
+ view.setOnClickListener { // activity.clickOnViewItem(ID);
+ val fragmentTransaction: FragmentTransaction = (activity.fragmentManager)!!.beginTransaction()
+ val fragment2: FurtherInfoFragment = FurtherInfoFragment()
+ fragment2.arguments = b
+ fragmentTransaction.replace(R.id.container, fragment2).addToBackStack("furtherinfo").commit()
+ }
+ editView.setOnClickListener {
+ val fragmentTransaction: FragmentTransaction = (activity.fragmentManager)!!.beginTransaction()
+ val fragment3: FragmentAddItem = FragmentAddItem()
+ fragment3.arguments = b
+ fragmentTransaction.replace(R.id.container, fragment3).addToBackStack("additem").commit()
+ }
+ view.setOnLongClickListener {
+ println("long click: $ID")
+ val builder: AlertDialog.Builder = AlertDialog.Builder(mContext)
+ builder.setMessage("Are you sure you want to delete")
+ builder.setPositiveButton("delete") { dialog, id -> deleteProduct(ID) }
+ builder.setNegativeButton("cancel") { dialog, id ->
+ dialog?.dismiss()
+ }
+ val alertDialog: AlertDialog = builder.create()
+ alertDialog.show()
+ true
+ }
+ }
+
+ private fun deleteProduct(id: Long) {
+ val args: Array = arrayOf(id.toString())
+ // String whereClause = String.format(ShiftsEntry._ID + " in (%s)", new Object[] { TextUtils.join(",", Collections.nCopies(args.length, "?")) }); //for deleting multiple lines
+ mContext!!.contentResolver.delete(ShiftsEntry.CONTENT_URI, ShiftsEntry._ID + "=?", args)
+ }
+
+ private fun newDate(dateString: String): String {
+ var returnString: String? = "01/01/2010"
+ val year: String = dateString.substring(0, 4)
+ val month: String = dateString.substring(5, 7)
+ val day: String = dateString.substring(8)
+ returnString = "$day-$month-$year"
+ return returnString
+ }
+
+ companion object {
+ fun timeValues(duration: Float): Array {
+ val hours: Int = floor(duration.toDouble()).toInt()
+ val minutes: Int = ((duration - hours) * 60).toInt()
+ val hoursString: String = hours.toString() + ""
+ val minutesString: String = String.format("%02d", minutes)
+ return arrayOf(hoursString, minutesString)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.java b/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.java
deleted file mode 100644
index cc747cf..0000000
--- a/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.appttude.h_mal.farmr;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.widget.RelativeLayout;
-
-/**
- * Created by h_mal on 27/06/2017.
- */
-
-public class SplashScreen extends Activity {
-
- // Splash screen timer
- private static int SPLASH_TIME_OUT = 2000;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_splash);
-
- final Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.hyperspace_jump, android.R.anim.fade_out).toBundle();
-
- final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.splash_layout);
-
- final Intent i = new Intent(SplashScreen.this,MainActivity.class);
- i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-
- new Handler().postDelayed(new Runnable() {
-
- @Override
- public void run() {
- // This method will be executed once the timer is over
- // Start your app main activity
-// startActivity(i,bundle);
- startActivity(i);
- overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
-// finish();
- }
- }, SPLASH_TIME_OUT);
- }
-
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.kt b/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.kt
new file mode 100644
index 0000000..878fb98
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/SplashScreen.kt
@@ -0,0 +1,36 @@
+package com.appttude.h_mal.farmr
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.view.View
+import android.widget.RelativeLayout
+import androidx.core.app.ActivityOptionsCompat
+
+/**
+ * Created by h_mal on 27/06/2017.
+ */
+class SplashScreen : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_splash)
+ val bundle = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.hyperspace_jump, android.R.anim.fade_out).toBundle()
+ val relativeLayout = findViewById(R.id.splash_layout) as RelativeLayout
+ val i = Intent(this@SplashScreen, MainActivity::class.java)
+ i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+ Handler().postDelayed({
+ // This method will be executed once the timer is over
+ // Start your app main activity
+// startActivity(i,bundle);
+ startActivity(i)
+ overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
+ // finish();
+ }, SPLASH_TIME_OUT.toLong())
+ }
+
+ companion object {
+ // Splash screen timer
+ private const val SPLASH_TIME_OUT = 2000
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftProvider.kt b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftProvider.kt
new file mode 100644
index 0000000..d6cc534
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftProvider.kt
@@ -0,0 +1,178 @@
+package com.appttude.h_mal.farmr.data
+
+import android.content.ContentProvider
+import android.content.ContentUris
+import android.content.ContentValues
+import android.content.Context
+import android.content.UriMatcher
+import android.database.Cursor
+import android.net.Uri
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+
+/**
+ * Created by h_mal on 26/12/2017.
+ */
+class ShiftProvider : ContentProvider() {
+ private var mDbHelper: ShiftsDbHelper? = null
+ override fun onCreate(): Boolean {
+ mDbHelper = ShiftsDbHelper(context)
+ return true
+ }
+
+ override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?,
+ sortOrder: String?): Cursor? {
+ var selection = selection
+ var selectionArgs = selectionArgs
+ val database = mDbHelper!!.readableDatabase
+ val cursor: Cursor
+ val match = sUriMatcher.match(uri)
+ when (match) {
+ SHIFTS -> cursor = database.query(ShiftsEntry.TABLE_NAME, projection, selection, selectionArgs,
+ null, null, sortOrder)
+
+ SHIFT_ID -> {
+ selection = ShiftsEntry._ID + "=?"
+ selectionArgs = arrayOf(ContentUris.parseId(uri).toString())
+ cursor = database.query(ShiftsEntry.TABLE_NAME, projection, selection, selectionArgs,
+ null, null, sortOrder)
+ }
+
+ else -> throw IllegalArgumentException("Cannot query $uri")
+ }
+ cursor.setNotificationUri(context!!.contentResolver, uri)
+ return cursor
+ }
+
+ override fun insert(uri: Uri, contentValues: ContentValues?): Uri? {
+ val match = sUriMatcher.match(uri)
+ return when (match) {
+ SHIFTS -> insertShift(uri, contentValues)
+ else -> throw IllegalArgumentException("Insertion is not supported for $uri")
+ }
+ }
+
+ private fun insertShift(uri: Uri, values: ContentValues?): Uri? {
+ val description = values!!.getAsString(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)
+ ?: throw IllegalArgumentException("Description required")
+ val date = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DATE)
+ ?: throw IllegalArgumentException("Date required")
+ val timeIn = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_IN)
+ ?: throw IllegalArgumentException("Time In required")
+ val timeOut = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)
+ ?: throw IllegalArgumentException("Time Out required")
+ val duration = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_DURATION)
+ require(duration >= 0) { "Duration cannot be negative" }
+ val shiftType = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TYPE)
+ ?: throw IllegalArgumentException("Shift type required")
+ val shiftUnits = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_UNIT)
+ require(shiftUnits >= 0) { "Units cannot be negative" }
+ val payRate = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_PAYRATE)
+ require(payRate >= 0) { "Pay rate cannot be negative" }
+ val totalPay = values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_TOTALPAY)
+ require(totalPay >= 0) { "Total Pay cannot be negative" }
+ val breakMins = values.getAsInteger(ShiftsEntry.COLUMN_SHIFT_BREAK)
+ require(breakMins >= 0) { "Break cannot be negative" }
+ val database = mDbHelper!!.writableDatabase
+ val id = database.insert(ShiftsEntry.TABLE_NAME, null, values)
+ if (id == -1L) {
+ Log.e(LOG_TAG, "row failed $uri")
+ return null
+ }
+ context!!.contentResolver.notifyChange(uri, null)
+ return ContentUris.withAppendedId(uri, id)
+ }
+
+ override fun update(uri: Uri, contentValues: ContentValues?, selection: String?,
+ selectionArgs: Array?): Int {
+ var selection = selection
+ var selectionArgs = selectionArgs
+ val match = sUriMatcher.match(uri)
+ return when (match) {
+ SHIFTS -> updateShift(uri, contentValues, selection, selectionArgs)
+ SHIFT_ID -> {
+ selection = ShiftsEntry._ID + "=?"
+ selectionArgs = arrayOf(ContentUris.parseId(uri).toString())
+ updateShift(uri, contentValues, selection, selectionArgs)
+ }
+
+ else -> throw IllegalArgumentException("Update is not supported for $uri")
+ }
+ }
+
+ private fun updateShift(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int {
+ if (values!!.containsKey(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)) {
+ val description = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION)
+ ?: throw IllegalArgumentException("description required")
+ }
+ if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_DATE)) {
+ val date = values.getAsString(ShiftsEntry.COLUMN_SHIFT_DATE)
+ ?: throw IllegalArgumentException("date required")
+ }
+ if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_TIME_IN)) {
+ val timeIn = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_IN)
+ ?: throw IllegalArgumentException("time in required")
+ }
+ if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)) {
+ val timeOut = values.getAsString(ShiftsEntry.COLUMN_SHIFT_TIME_OUT)
+ ?: throw IllegalArgumentException("time out required")
+ }
+ if (values.containsKey(ShiftsEntry.COLUMN_SHIFT_BREAK)) {
+ val breaks = values.getAsString(ShiftsEntry.COLUMN_SHIFT_BREAK)
+ ?: throw IllegalArgumentException("break required")
+ }
+ if (values.size() == 0) {
+ return 0
+ }
+ val database = mDbHelper!!.writableDatabase
+ val rowsUpdated = database.update(ShiftsEntry.TABLE_NAME, values, selection, selectionArgs)
+ if (rowsUpdated != 0) {
+ context!!.contentResolver.notifyChange(uri, null)
+ }
+ return rowsUpdated
+ }
+
+ override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int {
+ var selection = selection
+ var selectionArgs = selectionArgs
+ val database = mDbHelper!!.writableDatabase
+ val rowsDeleted: Int
+ val match = sUriMatcher.match(uri)
+ when (match) {
+ SHIFTS -> rowsDeleted = database.delete(ShiftsEntry.TABLE_NAME, selection, selectionArgs)
+ SHIFT_ID -> {
+ selection = ShiftsEntry._ID + "=?"
+ selectionArgs = arrayOf(ContentUris.parseId(uri).toString())
+ rowsDeleted = database.delete(ShiftsEntry.TABLE_NAME, selection, selectionArgs)
+ }
+
+ else -> throw IllegalArgumentException("Deletion is not supported for $uri")
+ }
+ if (rowsDeleted != 0) {
+ context!!.contentResolver.notifyChange(uri, null)
+ }
+ return rowsDeleted
+ }
+
+ override fun getType(uri: Uri): String {
+ return when (val match = sUriMatcher.match(uri)) {
+ SHIFTS -> ShiftsEntry.CONTENT_LIST_TYPE
+ SHIFT_ID -> ShiftsEntry.CONTENT_ITEM_TYPE
+ else -> throw IllegalStateException("Unknown URI $uri with match $match")
+ }
+ }
+
+ companion object {
+ val LOG_TAG: String = ShiftProvider::class.java.simpleName
+ private const val SHIFTS = 100
+ private const val SHIFT_ID = 101
+ private val sUriMatcher = UriMatcher(UriMatcher.NO_MATCH)
+
+ init {
+ sUriMatcher.addURI(ShiftsContract.CONTENT_AUTHORITY, ShiftsContract.PATH_SHIFTS, SHIFTS)
+ sUriMatcher.addURI(ShiftsContract.CONTENT_AUTHORITY, ShiftsContract.PATH_SHIFTS + "/#", SHIFT_ID)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsContract.kt b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsContract.kt
new file mode 100644
index 0000000..ac1a5d0
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsContract.kt
@@ -0,0 +1,33 @@
+package com.appttude.h_mal.farmr.data
+
+import android.content.ContentResolver
+import android.net.Uri
+import android.provider.BaseColumns
+
+/**
+ * Created by h_mal on 26/12/2017.
+ */
+object ShiftsContract {
+ const val CONTENT_AUTHORITY = "com.appttude.h_mal.farmr"
+ val BASE_CONTENT_URI = Uri.parse("content://$CONTENT_AUTHORITY")
+ const val PATH_SHIFTS = "shifts"
+
+ object ShiftsEntry : BaseColumns {
+ val CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, PATH_SHIFTS)
+ const val CONTENT_LIST_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_SHIFTS
+ const val CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_SHIFTS
+ const val TABLE_NAME = "shifts"
+ const val TABLE_NAME_EXPORT = "shiftsexport"
+ const val _ID = BaseColumns._ID
+ const val COLUMN_SHIFT_TYPE = "shifttype"
+ const val COLUMN_SHIFT_DESCRIPTION = "description"
+ const val COLUMN_SHIFT_DATE = "date"
+ const val COLUMN_SHIFT_TIME_IN = "timein"
+ const val COLUMN_SHIFT_TIME_OUT = "timeout"
+ const val COLUMN_SHIFT_BREAK = "break"
+ const val COLUMN_SHIFT_DURATION = "duration"
+ const val COLUMN_SHIFT_UNIT = "unit"
+ const val COLUMN_SHIFT_PAYRATE = "payrate"
+ const val COLUMN_SHIFT_TOTALPAY = "totalpay"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsDbHelper.kt b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsDbHelper.kt
new file mode 100644
index 0000000..fe83ed6
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/data/ShiftsDbHelper.kt
@@ -0,0 +1,51 @@
+package com.appttude.h_mal.farmr.data
+
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+import com.appttude.h_mal.farmr.data.ShiftsContract.ShiftsEntry
+
+/**
+ * Created by h_mal on 26/12/2017.
+ */
+class ShiftsDbHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
+ override fun onCreate(db: SQLiteDatabase) {
+ val SQL_CREATE_PRODUCTS_TABLE = ("CREATE TABLE " + ShiftsEntry.TABLE_NAME + " ("
+ + ShiftsEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " TEXT NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_DATE + " DATE NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_TIME_IN + " TIME NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_TIME_OUT + " TIME NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_BREAK + " INTEGER NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_DURATION + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_TYPE + " TEXT NOT NULL DEFAULT " + DEFAULT_TEXT + ", "
+ + ShiftsEntry.COLUMN_SHIFT_UNIT + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_PAYRATE + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_TOTALPAY + " FLOAT NOT NULL DEFAULT 0)")
+ db.execSQL(SQL_CREATE_PRODUCTS_TABLE)
+ db.execSQL(SQL_CREATE_PRODUCTS_TABLE_2)
+ }
+
+ override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+ if (oldVersion < newVersion) {
+ db.execSQL(SQL_CREATE_PRODUCTS_TABLE_2)
+ }
+ }
+
+ companion object {
+ private const val DATABASE_NAME = "shifts.db"
+ private const val DATABASE_VERSION = 4
+ private const val DEFAULT_TEXT = "Hourly"
+ private const val SQL_CREATE_PRODUCTS_TABLE_2 = ("CREATE TABLE " + ShiftsEntry.TABLE_NAME_EXPORT + " ("
+ + ShiftsEntry.COLUMN_SHIFT_DESCRIPTION + " TEXT NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_DATE + " DATE NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_TIME_IN + " TIME NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_TIME_OUT + " TIME NOT NULL, "
+ + ShiftsEntry.COLUMN_SHIFT_BREAK + " INTEGER NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_DURATION + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_TYPE + " TEXT NOT NULL DEFAULT " + DEFAULT_TEXT + ", "
+ + ShiftsEntry.COLUMN_SHIFT_UNIT + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_PAYRATE + " FLOAT NOT NULL DEFAULT 0, "
+ + ShiftsEntry.COLUMN_SHIFT_TOTALPAY + " FLOAT NOT NULL DEFAULT 0)")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/model/Shift.kt b/app/src/main/java/com/appttude/h_mal/farmr/model/Shift.kt
new file mode 100644
index 0000000..5d76543
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/model/Shift.kt
@@ -0,0 +1,14 @@
+package com.appttude.h_mal.farmr.model
+
+data class Shift(
+ val type: ShiftType,
+ val description: String,
+ val date: String,
+ val timeIn: String?,
+ val timeOut: String?,
+ val duration: Float?,
+ val breakMins: Int?,
+ val units: Float?,
+ val rateOfPay: Float,
+ val totalPay: Float
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/appttude/h_mal/farmr/model/ShiftType.kt b/app/src/main/java/com/appttude/h_mal/farmr/model/ShiftType.kt
new file mode 100644
index 0000000..d4d1118
--- /dev/null
+++ b/app/src/main/java/com/appttude/h_mal/farmr/model/ShiftType.kt
@@ -0,0 +1,6 @@
+package com.appttude.h_mal.farmr.model
+
+enum class ShiftType(val type: String) {
+ HOURLY("Hourly"),
+ PIECE("Piece Rate")
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_sync_black_24dp.xml b/app/src/main/res/drawable/ic_sync_black_24dp.xml
index 5a283aa..2aef437 100644
--- a/app/src/main/res/drawable/ic_sync_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_sync_black_24dp.xml
@@ -5,5 +5,5 @@
android:viewportWidth="24.0">
+ android:pathData="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01,-0.25 1.97,-0.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0,-4.42,-3.58,-8,-8,-8zm0 14c-3.31 0,-6,-2.69,-6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4,-4,-4,-4v3z" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index d6b3d04..dfa3dfc 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -2,13 +2,12 @@
+ android:layout_height="match_parent">
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml
index f964b7b..3d50c40 100644
--- a/app/src/main/res/layout/fragment_main.xml
+++ b/app/src/main/res/layout/fragment_main.xml
@@ -41,7 +41,7 @@
android:textColor="#A2AAB0"/>
-
@@ -101,7 +101,7 @@
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+
android:layout_alignParentStart="true"
android:layout_below="@+id/date"
android:maxLines="3"
@@ -112,7 +112,7 @@
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="3dp"
@@ -126,7 +126,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
- android:layout_alignParentRight="true"
+
android:layout_alignParentTop="true"
app:srcCompat="@android:drawable/ic_menu_edit" />
diff --git a/app/src/main/res/layout/main_view.xml b/app/src/main/res/layout/main_view.xml
index 8732118..790957a 100644
--- a/app/src/main/res/layout/main_view.xml
+++ b/app/src/main/res/layout/main_view.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
-
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 64f23c7..f56abf1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,12 +1,16 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+ ext {
+ kotlin_version = '1.9.0'
+ }
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.1'
+ classpath 'com.android.tools.build:gradle:7.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 aac7c9b..9e6fce1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,6 +9,8 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
+android.enableJetifier=true
+android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 13372ae..7454180 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d4d0a68..8049c68 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Tue Apr 28 17:08:04 BST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/gradlew b/gradlew
index 9d82f78..c53aefa 100644
--- a/gradlew
+++ b/gradlew
@@ -1,74 +1,129 @@
-#!/usr/bin/env bash
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
-warn ( ) {
+warn () {
echo "$*"
-}
+} >&2
-die ( ) {
+die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -77,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -85,76 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 8a0b282..107acd3 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,20 +24,23 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,34 +64,14 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell