From 1b7507e89233fef43d29ced57f37bf24e1097586 Mon Sep 17 00:00:00 2001 From: H Malik Date: Tue, 17 Jul 2018 16:54:27 +1000 Subject: [PATCH] Initial commit --- .gitignore | 9 + .idea/compiler.xml | 22 + .idea/copyright/profiles_settings.xml | 3 + .idea/gradle.xml | 18 + .idea/misc.xml | 33 + .idea/modules.xml | 9 + .idea/runConfigurations.xml | 12 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 37 ++ app/proguard-rules.pro | 25 + .../ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 55 ++ .../shift_tracker/Data/ShiftProvider.java | 262 ++++++++ .../shift_tracker/Data/ShiftsContract.java | 60 ++ .../shift_tracker/Data/ShiftsDbHelper.java | 88 +++ .../shift_tracker/FilterDataFragment.java | 198 ++++++ .../h_mal/shift_tracker/FragmentAddItem.java | 622 ++++++++++++++++++ .../h_mal/shift_tracker/FragmentMain.java | 529 +++++++++++++++ .../shift_tracker/FurtherInfoFragment.java | 184 ++++++ .../h_mal/shift_tracker/MainActivity.java | 236 +++++++ .../shift_tracker/ShiftsCursorAdapter.java | 171 +++++ .../h_mal/shift_tracker/SplashScreen.java | 46 ++ app/src/main/res/anim/hyperspace_jump.xml | 30 + app/src/main/res/drawable/add.png | Bin 0 -> 661 bytes app/src/main/res/drawable/farm.jpg | Bin 0 -> 92343 bytes app/src/main/res/drawable/farmr.jpg | Bin 0 -> 23818 bytes .../main/res/drawable/ic_info_black_24dp.xml | 9 + .../drawable/ic_notifications_black_24dp.xml | 9 + .../main/res/drawable/ic_sync_black_24dp.xml | 9 + app/src/main/res/drawable/image_i_64.png | Bin 0 -> 1397 bytes app/src/main/res/drawable/img_i_full.png | Bin 0 -> 1370 bytes app/src/main/res/drawable/info.png | Bin 0 -> 1370 bytes app/src/main/res/layout/activity_splash.xml | 46 ++ app/src/main/res/layout/dialog_layout.xml | 180 +++++ app/src/main/res/layout/fragment_add_item.xml | 328 +++++++++ .../main/res/layout/fragment_filter_data.xml | 133 ++++ .../main/res/layout/fragment_futher_info.xml | 255 +++++++ app/src/main/res/layout/fragment_main.xml | 54 ++ app/src/main/res/layout/list_item_1.xml | 136 ++++ app/src/main/res/layout/main_view.xml | 58 ++ app/src/main/res/menu/menu_main.xml | 42 ++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes app/src/main/res/mipmap-xxxhdpi/farmicon.png | Bin 0 -> 132722 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 7 + app/src/main/res/values/strings.xml | 105 +++ app/src/main/res/values/styles.xml | 20 + app/src/main/res/xml/pref_data_sync.xml | 21 + app/src/main/res/xml/pref_general.xml | 33 + app/src/main/res/xml/pref_headers.xml | 20 + app/src/main/res/xml/pref_notification.xml | 27 + .../h_mal/shift_tracker/ExampleUnitTest.java | 17 + build.gradle | 25 + gradle.properties | 17 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 +++++ gradlew.bat | 90 +++ settings.gradle | 1 + 69 files changed, 4496 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/h_mal/shift_tracker/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftProvider.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsContract.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsDbHelper.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/FilterDataFragment.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/FragmentAddItem.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/FragmentMain.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/FurtherInfoFragment.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/MainActivity.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/ShiftsCursorAdapter.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/SplashScreen.java create mode 100644 app/src/main/res/anim/hyperspace_jump.xml create mode 100644 app/src/main/res/drawable/add.png create mode 100644 app/src/main/res/drawable/farm.jpg create mode 100644 app/src/main/res/drawable/farmr.jpg create mode 100644 app/src/main/res/drawable/ic_info_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_sync_black_24dp.xml create mode 100644 app/src/main/res/drawable/image_i_64.png create mode 100644 app/src/main/res/drawable/img_i_full.png create mode 100644 app/src/main/res/drawable/info.png create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/dialog_layout.xml create mode 100644 app/src/main/res/layout/fragment_add_item.xml create mode 100644 app/src/main/res/layout/fragment_filter_data.xml create mode 100644 app/src/main/res/layout/fragment_futher_info.xml create mode 100644 app/src/main/res/layout/fragment_main.xml create mode 100644 app/src/main/res/layout/list_item_1.xml create mode 100644 app/src/main/res/layout/main_view.xml create mode 100644 app/src/main/res/menu/menu_main.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/farmicon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/pref_data_sync.xml create mode 100644 app/src/main/res/xml/pref_general.xml create mode 100644 app/src/main/res/xml/pref_headers.xml create mode 100644 app/src/main/res/xml/pref_notification.xml create mode 100644 app/src/test/java/com/example/h_mal/shift_tracker/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ba7052b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..48b26e3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..2944ad7 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion '26.0.2' + defaultConfig { + applicationId "com.example.h_mal.shift_tracker" + minSdkVersion 21 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation 'com.android.support:support-v4:25.4.0' + implementation 'com.android.support:support-vector-drawable:25.4.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' + }) + compile 'com.android.support:appcompat-v7:25.4.0' + compile 'com.android.support:design:25.4.0' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.ajts.androidmads.SQLite2Excel:library:1.0.2' + + compile 'com.google.android.gms:play-services-ads:11.8.0' + testCompile 'junit:junit:4.12' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..5543844 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\h_mal\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/h_mal/shift_tracker/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/h_mal/shift_tracker/ExampleInstrumentedTest.java new file mode 100644 index 0000000..7887498 --- /dev/null +++ b/app/src/androidTest/java/com/example/h_mal/shift_tracker/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.h_mal.shift_tracker; + +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.*; + +/** + * 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/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..72e509d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftProvider.java b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftProvider.java new file mode 100644 index 0000000..200a6cf --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftProvider.java @@ -0,0 +1,262 @@ +package com.example.h_mal.shift_tracker.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.example.h_mal.shift_tracker.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/example/h_mal/shift_tracker/Data/ShiftsContract.java b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsContract.java new file mode 100644 index 0000000..5cf3734 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsContract.java @@ -0,0 +1,60 @@ +package com.example.h_mal.shift_tracker.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.example.h_mal.shift_tracker"; + + 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/example/h_mal/shift_tracker/Data/ShiftsDbHelper.java b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsDbHelper.java new file mode 100644 index 0000000..a22b0a5 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsDbHelper.java @@ -0,0 +1,88 @@ +package com.example.h_mal.shift_tracker.Data; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.example.h_mal.shift_tracker.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)"; + + private static final String DATABASE_ALTER_1 = + "ALTER TABLE " + ShiftsEntry.TABLE_NAME + " ADD COLUMN " + + ShiftsEntry.COLUMN_SHIFT_TYPE + " TEXT NOT NULL DEFAULT " + DEFAULT_TEXT + ";"; + + private static final String DATABASE_ALTER_2 = + "ALTER TABLE " + ShiftsEntry.TABLE_NAME + " ADD COLUMN " + + ShiftsEntry.COLUMN_SHIFT_UNIT + " FLOAT NOT NULL DEFAULT 0;"; + + private static final String DATABASE_ALTER_3 = + "ALTER TABLE " + ShiftsEntry.TABLE_NAME + " ADD COLUMN " + + ShiftsEntry.COLUMN_SHIFT_PAYRATE + " FLOAT NOT NULL DEFAULT 0;"; + + private static final String DATABASE_ALTER_4 = + "ALTER TABLE " + ShiftsEntry.TABLE_NAME + " ADD COLUMN " + + ShiftsEntry.COLUMN_SHIFT_TOTALPAY + " FLOAT NOT NULL DEFAULT 0;"; + + private static final String DATABASE_UPDATE_1 = + "UPDATE " + ShiftsEntry.TABLE_NAME + " SET " + + ShiftsEntry.COLUMN_SHIFT_TYPE + " = replace( " + ShiftsEntry.COLUMN_SHIFT_TYPE + ", 'hourly', 'Hourly' )" + + " WHERE " + ShiftsEntry.COLUMN_SHIFT_TYPE + " LIKE 'hourly%'"; + + @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/example/h_mal/shift_tracker/FilterDataFragment.java b/app/src/main/java/com/example/h_mal/shift_tracker/FilterDataFragment.java new file mode 100644 index 0000000..5c91523 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/FilterDataFragment.java @@ -0,0 +1,198 @@ +package com.example.h_mal.shift_tracker; + +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.example.h_mal.shift_tracker.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.example.h_mal.shift_tracker.MainActivity.args; +import static com.example.h_mal.shift_tracker.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/example/h_mal/shift_tracker/FragmentAddItem.java b/app/src/main/java/com/example/h_mal/shift_tracker/FragmentAddItem.java new file mode 100644 index 0000000..2b498c0 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/FragmentAddItem.java @@ -0,0 +1,622 @@ +package com.example.h_mal.shift_tracker; + +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.example.h_mal.shift_tracker.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/example/h_mal/shift_tracker/FragmentMain.java b/app/src/main/java/com/example/h_mal/shift_tracker/FragmentMain.java new file mode 100644 index 0000000..67995bd --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/FragmentMain.java @@ -0,0 +1,529 @@ +package com.example.h_mal.shift_tracker; + +import android.Manifest; +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.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.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.example.h_mal.shift_tracker.Data.ShiftsContract.ShiftsEntry; +import com.example.h_mal.shift_tracker.Data.ShiftsDbHelper; + +import java.io.File; + +import static com.example.h_mal.shift_tracker.MainActivity.args; +import static com.example.h_mal.shift_tracker.MainActivity.filter; +import static com.example.h_mal.shift_tracker.MainActivity.selection; +import static com.example.h_mal.shift_tracker.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); + + } + } 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); + } + + 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, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + System.out.println("request code" + requestCode); + switch (requestCode) { + case 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/example/h_mal/shift_tracker/FurtherInfoFragment.java b/app/src/main/java/com/example/h_mal/shift_tracker/FurtherInfoFragment.java new file mode 100644 index 0000000..cd76d12 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/FurtherInfoFragment.java @@ -0,0 +1,184 @@ +package com.example.h_mal.shift_tracker; + +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.example.h_mal.shift_tracker.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/example/h_mal/shift_tracker/MainActivity.java b/app/src/main/java/com/example/h_mal/shift_tracker/MainActivity.java new file mode 100644 index 0000000..712b4e0 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/MainActivity.java @@ -0,0 +1,236 @@ +package com.example.h_mal.shift_tracker; + +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 android.view.View; +import android.widget.ProgressBar; + +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.MobileAds; + +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 AdView adView; + private ProgressBar progressBar; + 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(); + + progressBar = (ProgressBar) findViewById(R.id.progressBar2); + + fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { + @Override + public void onBackStackChanged() { + List f = fragmentManager.getFragments(); + Fragment frag = f.get(0); + currentFragment = frag.getClass().getSimpleName(); + } + }); + + // Initialize the Mobile Ads SDK. + MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713"); + + // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in + // values/strings.xml. + adView = (AdView) findViewById(R.id.adView); + adView.setAdListener(new AdListener(){ + @Override + public void onAdOpened() { + // Code to be executed when an ad opens an overlay that + // covers the screen. + } + + @Override + public void onAdLeftApplication() { + // Code to be executed when the user has left the app. + } + + @Override + public void onAdClosed() { + // Code to be executed when when the user is about to return + // to the app after tapping on an ad. + } + @Override + public void onAdFailedToLoad(int i) { + super.onAdFailedToLoad(i); + progressBar.setVisibility(View.GONE); + } + + @Override + public void onAdLoaded() { + super.onAdLoaded(); + progressBar.setVisibility(View.GONE); + } + }); + // Create an ad request. Check your logcat output for the hashed device ID to + // get test ads on a physical device. e.g. + // "Use AdRequest.Builder.addTestDevice("ABCDEF012345") to get test ads on this device." + + AdRequest adRequest = new AdRequest.Builder() + .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) + .build(); + + // Start loading the ad in the background. + adView.loadAd(adRequest); + + } + 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/example/h_mal/shift_tracker/ShiftsCursorAdapter.java b/app/src/main/java/com/example/h_mal/shift_tracker/ShiftsCursorAdapter.java new file mode 100644 index 0000000..560f6ba --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/ShiftsCursorAdapter.java @@ -0,0 +1,171 @@ +package com.example.h_mal.shift_tracker; + +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.example.h_mal.shift_tracker.Data.ShiftProvider; +import com.example.h_mal.shift_tracker.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/example/h_mal/shift_tracker/SplashScreen.java b/app/src/main/java/com/example/h_mal/shift_tracker/SplashScreen.java new file mode 100644 index 0000000..130fdfb --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/SplashScreen.java @@ -0,0 +1,46 @@ +package com.example.h_mal.shift_tracker; + +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,R.anim.hyperspace_jump); +// finish(); + } + }, SPLASH_TIME_OUT); + } + + +} \ No newline at end of file diff --git a/app/src/main/res/anim/hyperspace_jump.xml b/app/src/main/res/anim/hyperspace_jump.xml new file mode 100644 index 0000000..af06e59 --- /dev/null +++ b/app/src/main/res/anim/hyperspace_jump.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add.png b/app/src/main/res/drawable/add.png new file mode 100644 index 0000000000000000000000000000000000000000..a14e890ea823188cde2d936984d0c9c885fb1db8 GIT binary patch literal 661 zcmV;G0&4wPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0xC&FK~#8N?b$I; z+dvct@aKDHJBcAeg)WxZSosPdzCahmgtB+&S|LRpt4I|)J3>_lMkH2H7rq1wL%p!H zKui*14kx^gn7g>b^NeEsLNIbt(&mk$p^+SOZvGfso2V%@wFo$$~WiU9+FhcNkM8){`OHuQ{l} zP|1QdfPD7$$+1qKIe_;_0-$zoNdVN&E#3fJ7T&CjbLIfF2Pu_>T*g$Xbl#s2K@SHI zrT-v!e0=?lO#Xb9KaSgQog~StcltPvy`2tx9MxKn4;4}hOk)Z9ehBG7tK0^vbO5%A za2o|j&qJ8{$CR1B3m{@1 z0)iiepO%`7Cv@1^%zpy1EQ3M+{;JI6M@oMJI_Im1%C83))jUsG-zOb*p}leGv=Hk2 zUK=lj8af&uduG7Ac%?CeEbTsIz5chYKlxH?dZhy>qqPswkKN>sx)bgFj2Di+LYKO4 zj`b^`m!UyrA(t^#Vhx~f{ZZU)OqEyzFb>-lmoZgh4Pdluv~d|zCEnYh%gTXyb-^3J zJ0t;6%fdLUI=I)@tN|#u{|1pt7OVm2Kv}QxI>@(oj95<=`OEiI7HR|^Zm49z8bF9q v?;%UisXI~4Z(2hVLI@#*5JCtc{s+Jl*t>XPWkLoi00000NkvXXu0mjf{7@Jz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/farm.jpg b/app/src/main/res/drawable/farm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..290da71ee48cb2e02bdc113647ee79fe2044fe2d GIT binary patch literal 92343 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/farmr.jpg b/app/src/main/res/drawable/farmr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfa734d86a578eb351e2f1215b11f04ca37913da GIT binary patch literal 23818 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≠8JPN$$29eN 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 + + diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..e3400cf --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_sync_black_24dp.xml b/app/src/main/res/drawable/ic_sync_black_24dp.xml new file mode 100644 index 0000000..5a283aa --- /dev/null +++ b/app/src/main/res/drawable/ic_sync_black_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/image_i_64.png b/app/src/main/res/drawable/image_i_64.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf9700c7af9d163d4d16ac5de042fc54edc3020 GIT binary patch literal 1397 zcmV-*1&aEKP)~by zA%zMBVW5SX*98M9g}E2_?ia3cUUqZNeE0bdckVg&+zSO2^#4*MtOsl5=`o^!$dGkE zTuAVOIEQJcorA=gpoa+&5q*Y}!sV~%`mH&vp5~|ZTTGU4UrZ%tP zh064mmbJOAsMTY9MRZDO<<}XNd5f=d{VJ2D^s+1XsB`)gG#l+t(!pcC!XG1H@pzuc zeTAU zZM;AYaqjX57fG?`cEIr9*N>o3hbyR{t;^vg+{!xQcFx<%*X<}q2NeeU62CC&l-`|G zqh8|%a7^uPM|4@3HCgshL)`KdUeLsTqsuMEJ%uMiqj7JVWrzh|;mb%G?Q>jnonPI- zSJPm$&ysS??h0N|MZM8wnn6$DiO@iq(IdsYukd?lF{aNfJ=U(muE7`6YP4tQUO5}_ z5x$foM*EEW8Sf50X_@gixaWQ&;sjoB%+mQyG2@)wS>#(S&C>z*YmF=TQj*5CW{%-7 zIv#G|8>lkc#~BG@>+JwukmM<&%NQdeuse$UAB$2Yp(@vJSm5qXGjITSL4~C={LkjsR|Iu@P7_(8oaLikfCm~V zG1>?7&iI#TqZF9q#?H&OAV1hBO_uLp-7G-~5_D1uz@PlI^QANhe2jX__xpLU>E|ct z$i2t8AY1cbk*~IROm1v72@<@WJFgw#e2{WE2zx73 zf5PIicYWXm5jy#Ry#NgJeX#SvV5^Po)t@1%>_ZoB;&k#cbpT{I$M3s#|3)S1l36`E zF4q1Uby}lqwyR18?Y#zxe3og8$FqFNj|`9|!4cYdZmo+y$7f;In^vhv-^s45?rBo9 z>pol7*GdHMc?XGnhCZ^^c^}#2I>lu^VP;qFn+cuN{1#&WsBWsmgWHv=(WPypkLe9X zcO4xR(|cOj7W$}8smKHL+{N4N#C|}pdxDQvA$C##s*I9Vqv=;7d7gSI|1r@YY{R>7f&Gs9$R6YOz03~!q zSaf7zbY(hYa%Ew3WdJfTF*q$SHZ3qYR4_C;FfuwbFfA}OIxsLO+0tbI001R)MObuX zVRU6WZEs|0W_bWIFflkSFg7hPIaDw-IxsRiGcYYMH99abS%hlY00000NkvXXu0mjf DCKH(g literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/img_i_full.png b/app/src/main/res/drawable/img_i_full.png new file mode 100644 index 0000000000000000000000000000000000000000..97c195c5e60666f8d9320a6bc10561f4c1b284ec GIT binary patch literal 1370 zcmZ{kYc$k(7{`DAnQf>7`MzQhs4s*xYia{Wmp+GgV|}%zSw=S-*djt=RD6j-#5>5&XeQe?yP`BBLM&k zt}et=64Jk079pt-mQ@4^U?FbKL?F(}AMBEJa7tsqYF}66rU4fjvKQZ@Pn7#r8LB!Fn}c?MGt`0weGI2PupF&DkNIeYB5K9x)faBe>);m3?<8;dcNCW=rF70trQnk0U+q&; z`!4U6xT3C7vmiTM17tK9B%8KqU)&yX&9HD&g%o#HF)}x>u^-o>Bs^x-a{(RNo{-KL z+NE-y){jLc`Yk+;5N{(y8_J&>hE5OcpsyS8ySkKeedTFW19;c;;Iitg+bRPyz<4t+ z-HC)SZct=)khPw+(10-e!G@Y*x3TBf`S%dbUG@Ba9Uzu$&@ERch^T6N&IV-UJ`gcw z=A1pLNpqjSa*ql|F>ys&HEVAOD;<{fQC{m3pxqh`5XQuJB-HuI;#W&{WNO#Oh$|-_ zZ1?i4FBp8w-gv^lH<$it%N|1^j~fh<)(poPgT2B=nh9?8AdjpNehJ=HskJao4|DST zM^(&gV_|#DWGh`Jop+Tn0tW2r~oZMSO555Nd`( zJ7FBn3SUI4Y71MpKqJ2TBA^V>#}TiyG(N-Ep$|dOBCMdW+X`L-9;+S4Gcr0>cYZ(P z4-MaiCZ))CO~FZEZ6)`cQ~?vI1W|IT*#eoHP`P65!CK7%W<0$HV9x_Tu+$C%+Nxu~ zmy~IfZIroveDYjE5g~d%U7fD&O>dK_Xw>?!cPlCB)w1Bq2=84gcM|T-W9YMqM#Gh^ z(uzJD@r^_l+AWBQ;r#?@KcQ_$>40Wrh?${OEQ*Dvo$jl$0W0DQHp4eHR(-jjETX;i zW}A%`RqXNiuxCW2i)Fl-E$|fy4pdv8f}8npb}oJyM0E$kz!C8-yRoQ;z5F|7bTI;y z*O(7Yvi+5lx%^@~Aa*wFM^#^M{JAn-f3`{Z2tMa=%bXQYbDtvd>I{LQTSXRgK5b?d zK2x&Cd*0;x?5Y%aDR{=MXEO`~Cz*P0qA@^DN0%aj7P!mfZwIwyxuHahUY231L3ti{AaL zIS%=@_?qDCLYWSDQSUhaVl!efYhhiF8uxNw3*=wt9L8Cgn_`dPu-N=Uc;0^kQ8A$r;mQ9W*y(S_N&>*u(VbXl HA9VRIdL34z literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/info.png b/app/src/main/res/drawable/info.png new file mode 100644 index 0000000000000000000000000000000000000000..97c195c5e60666f8d9320a6bc10561f4c1b284ec GIT binary patch literal 1370 zcmZ{kYc$k(7{`DAnQf>7`MzQhs4s*xYia{Wmp+GgV|}%zSw=S-*djt=RD6j-#5>5&XeQe?yP`BBLM&k zt}et=64Jk079pt-mQ@4^U?FbKL?F(}AMBEJa7tsqYF}66rU4fjvKQZ@Pn7#r8LB!Fn}c?MGt`0weGI2PupF&DkNIeYB5K9x)faBe>);m3?<8;dcNCW=rF70trQnk0U+q&; z`!4U6xT3C7vmiTM17tK9B%8KqU)&yX&9HD&g%o#HF)}x>u^-o>Bs^x-a{(RNo{-KL z+NE-y){jLc`Yk+;5N{(y8_J&>hE5OcpsyS8ySkKeedTFW19;c;;Iitg+bRPyz<4t+ z-HC)SZct=)khPw+(10-e!G@Y*x3TBf`S%dbUG@Ba9Uzu$&@ERch^T6N&IV-UJ`gcw z=A1pLNpqjSa*ql|F>ys&HEVAOD;<{fQC{m3pxqh`5XQuJB-HuI;#W&{WNO#Oh$|-_ zZ1?i4FBp8w-gv^lH<$it%N|1^j~fh<)(poPgT2B=nh9?8AdjpNehJ=HskJao4|DST zM^(&gV_|#DWGh`Jop+Tn0tW2r~oZMSO555Nd`( zJ7FBn3SUI4Y71MpKqJ2TBA^V>#}TiyG(N-Ep$|dOBCMdW+X`L-9;+S4Gcr0>cYZ(P z4-MaiCZ))CO~FZEZ6)`cQ~?vI1W|IT*#eoHP`P65!CK7%W<0$HV9x_Tu+$C%+Nxu~ zmy~IfZIroveDYjE5g~d%U7fD&O>dK_Xw>?!cPlCB)w1Bq2=84gcM|T-W9YMqM#Gh^ z(uzJD@r^_l+AWBQ;r#?@KcQ_$>40Wrh?${OEQ*Dvo$jl$0W0DQHp4eHR(-jjETX;i zW}A%`RqXNiuxCW2i)Fl-E$|fy4pdv8f}8npb}oJyM0E$kz!C8-yRoQ;z5F|7bTI;y z*O(7Yvi+5lx%^@~Aa*wFM^#^M{JAn-f3`{Z2tMa=%bXQYbDtvd>I{LQTSXRgK5b?d zK2x&Cd*0;x?5Y%aDR{=MXEO`~Cz*P0qA@^DN0%aj7P!mfZwIwyxuHahUY231L3ti{AaL zIS%=@_?qDCLYWSDQSUhaVl!efYhhiF8uxNw3*=wt9L8Cgn_`dPu-N=Uc;0^kQ8A$r;mQ9W*y(S_N&>*u(VbXl HA9VRIdL34z literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..8db7e41 --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_layout.xml b/app/src/main/res/layout/dialog_layout.xml new file mode 100644 index 0000000..0107d7f --- /dev/null +++ b/app/src/main/res/layout/dialog_layout.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_item.xml b/app/src/main/res/layout/fragment_add_item.xml new file mode 100644 index 0000000..10d1cee --- /dev/null +++ b/app/src/main/res/layout/fragment_add_item.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +