From f8235dbfa55227a4ff79f6a74bccc8c9453d30c6 Mon Sep 17 00:00:00 2001 From: H Malik Date: Fri, 29 Dec 2017 14:05:32 +1100 Subject: [PATCH] Initial commit --- .gitignore | 9 + .idea/compiler.xml | 22 + .idea/copyright/profiles_settings.xml | 3 + .idea/gradle.xml | 18 + .idea/misc.xml | 46 ++ .idea/modules.xml | 9 + .idea/runConfigurations.xml | 12 + app/.gitignore | 1 + app/build.gradle | 31 ++ app/proguard-rules.pro | 25 + .../ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 58 ++ .../example/h_mal/shift_tracker/AddItem.java | 500 ++++++++++++++++++ .../shift_tracker/Data/ShiftProvider.java | 236 +++++++++ .../shift_tracker/Data/ShiftsContract.java | 52 ++ .../shift_tracker/Data/ShiftsDbHelper.java | 47 ++ .../h_mal/shift_tracker/LoginScreen.java | 76 +++ .../h_mal/shift_tracker/LoginSetup.java | 73 +++ .../h_mal/shift_tracker/MainActivity.java | 157 ++++++ .../shift_tracker/ShiftsCursorAdapter.java | 65 +++ .../h_mal/shift_tracker/SplashScreen.java | 57 ++ app/src/main/res/drawable/img248.jpg | Bin 0 -> 63026 bytes app/src/main/res/layout/activity_add_item.xml | 194 +++++++ app/src/main/res/layout/activity_splash.xml | 18 + app/src/main/res/layout/list_item.xml | 86 +++ app/src/main/res/layout/login_screen.xml | 59 +++ app/src/main/res/layout/login_setup.xml | 82 +++ app/src/main/res/layout/main_view.xml | 54 ++ app/src/main/res/menu/menu_main.xml | 16 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4208 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2555 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6114 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10056 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 14696 bytes app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 7 + app/src/main/res/values/strings.xml | 18 + app/src/main/res/values/styles.xml | 20 + .../h_mal/shift_tracker/ExampleUnitTest.java | 17 + build.gradle | 23 + 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 + 51 files changed, 2397 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 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/AddItem.java 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/LoginScreen.java create mode 100644 app/src/main/java/com/example/h_mal/shift_tracker/LoginSetup.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/drawable/img248.jpg create mode 100644 app/src/main/res/layout/activity_add_item.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/list_item.xml create mode 100644 app/src/main/res/layout/login_screen.xml create mode 100644 app/src/main/res/layout/login_setup.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/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/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..5d19981 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ 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/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..69b2905 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "com.example.h_mal.shift_tracker" + minSdkVersion 15 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + 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.3.1' + compile 'com.android.support:design:25.3.1' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + 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..3c36f94 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/h_mal/shift_tracker/AddItem.java b/app/src/main/java/com/example/h_mal/shift_tracker/AddItem.java new file mode 100644 index 0000000..cd55820 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/AddItem.java @@ -0,0 +1,500 @@ +package com.example.h_mal.shift_tracker; + +import android.app.DatePickerDialog; +import android.app.LoaderManager; +import android.app.TimePickerDialog; +import android.content.ContentValues; +import android.content.CursorLoader; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.Loader; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.NavUtils; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import com.example.h_mal.shift_tracker.Data.ShiftsContract.ShiftsEntry; + +/** + * Created by h_mal on 26/12/2017. + */ + +public class AddItem extends AppCompatActivity implements + LoaderManager.LoaderCallbacks{ + + private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1; + + private static final int EXISTING_PRODUCT_LOADER = 0; + + private Uri mCurrentProductUri; + + private EditText mLocationEditText; + + private EditText mDateEditText; + + private TextView mDurationTextView; + + private EditText mTimeInEditText; + private EditText mTimeOutEditText; + private EditText mBreakEditText; + + private static final int RESULT_LOAD_IMAGE = 1; + + private boolean mProductHasChanged = false; + + private static final int PICK_IMAGE_REQUEST = 0; + + private View.OnTouchListener mTouchListener = new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + mProductHasChanged = true; + return false; + } + }; + private int mDay; + private int mMonth; + private int mYear; + private int mHoursIn; + private int mMinutesIn; + private int mHoursOut; + private int mMinutesOut; + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_add_item); + + mLocationEditText = (EditText) findViewById(R.id.locationEditText); + mDateEditText = (EditText) findViewById(R.id.dateEditText); + mTimeInEditText = (EditText) findViewById(R.id.timeInEditText); + mBreakEditText = (EditText) findViewById(R.id.breakEditText); + mTimeOutEditText = (EditText) findViewById(R.id.timeOutEditText); + mDurationTextView = (TextView) findViewById(R.id.ShiftDuration); + + Intent intent = getIntent(); + mCurrentProductUri = intent.getData(); + + if (mCurrentProductUri == null) { + setTitle(getString(R.string.add_item_title)); + + invalidateOptionsMenu(); + } else { + + setTitle(getString(R.string.edit_item_title)); + + + getLoaderManager().initLoader(EXISTING_PRODUCT_LOADER, null, this); + } + + if (mDateEditText.getText().toString().equals("")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + mDateEditText.setText(sdf.format(new Date())); + } + + mBreakEditText.setText("0"); + + mDateEditText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //To show current date in the datepicker + Calendar mcurrentDate=Calendar.getInstance(); + mYear=mcurrentDate.get(Calendar.YEAR); + mMonth=mcurrentDate.get(Calendar.MONTH); + mDay=mcurrentDate.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog mDatePicker=new DatePickerDialog(AddItem.this, new DatePickerDialog.OnDateSetListener() { + public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) { + mDateEditText.setText(String.format("%02d", selectedday) + "/" + String.format("%02d", (selectedmonth = selectedmonth + 1)) + "/" + selectedyear); + 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(AddItem.this, 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(AddItem.this, 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(); + + } + }); + + 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(); + + } + }); + + 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(); + + } + }); + + Button SubmitProduct = (Button) findViewById(R.id.submit); + SubmitProduct.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + saveProduct(); + + } + }); + + mLocationEditText.setOnTouchListener(mTouchListener); + + } + + @Override + public void onBackPressed() { + 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) { + AddItem.super.onBackPressed(); + } + }).create().show(); + } + + private void saveProduct() { + + String descriptionString = mLocationEditText.getText().toString().trim(); + String dateString = mDateEditText.getText().toString().trim(); + String timeInString = mTimeInEditText.getText().toString().trim(); + String timeOutString = mTimeOutEditText.getText().toString().trim(); + String breakMins = mBreakEditText.getText().toString().trim(); + int breaks = Integer.parseInt(breakMins); + float duration = calculateDuration(mHoursIn,mMinutesIn,mHoursOut,mMinutesOut,breaks); + + if ( + TextUtils.isEmpty(descriptionString)) { + Toast.makeText(AddItem.this, "please insert all product data", Toast.LENGTH_SHORT).show(); + return; + } + + ContentValues values = new ContentValues(); + values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, descriptionString); + values.put(ShiftsEntry.COLUMN_SHIFT_DATE, dateString); + values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, timeInString); + values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, timeOutString); + values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, duration); + values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, breaks); + + if (mCurrentProductUri == null) { + + Uri newUri = getContentResolver().insert(ShiftsEntry.CONTENT_URI, values); + + if (newUri == null) { + Toast.makeText(this, getString(R.string.insert_item_failed), + Toast.LENGTH_SHORT).show(); + } else { + + Toast.makeText(this, getString(R.string.insert_item_successful), + Toast.LENGTH_SHORT).show(); + } + } else { + int rowsAffected = getContentResolver().update(mCurrentProductUri, values, null, null); + + if (rowsAffected == 0) { + Toast.makeText(this, getString(R.string.update_item_failed), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, getString(R.string.update_item_successful), + Toast.LENGTH_SHORT).show(); + } + } + NavUtils.navigateUpFromSameTask(AddItem.this); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + private void setDuration (){ + int breaks = 0; + if (!mBreakEditText.getText().toString().equals("")){ + breaks = Integer.parseInt(mBreakEditText.getText().toString()); + } + 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()); + } + 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()); + } + mDurationTextView.setText(calculateDuration(mHoursIn,mMinutesIn,mHoursOut,mMinutesOut,breaks) + " hours"); + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case R.id.delete_all: + DeleteDialog(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + private void DeleteDialog() { + android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this); + builder.setMessage("Are you sure you want to delete"); + builder.setPositiveButton("delete", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + deleteProduct(); + } + }); + 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(); + } + + private void deleteProduct() { + + if (mCurrentProductUri != null) { + + int rowsDeleted = getContentResolver().delete(mCurrentProductUri, null, null); + + if (rowsDeleted == 0) { + Toast.makeText(this, "error deleting product", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "Product deleted", Toast.LENGTH_SHORT).show(); + } + } + + finish(); + } + + + 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); + } + + + + @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}; + + return new CursorLoader(this, + mCurrentProductUri, + projection, + null, + null, + null); + } + + @Override + public void onLoadFinished(Loader loader, Cursor cursor) { + if (cursor == null || cursor.getCount() < 1) { + return; + } + + if (cursor.moveToFirst()) { + int descriptionColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION); + int dateColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DATE); + int timeInColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_IN); + int timeOutColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_TIME_OUT); + int breakColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_BREAK); + int durationColumnIndex = cursor.getColumnIndex(ShiftsEntry.COLUMN_SHIFT_DURATION); + + 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); + + mLocationEditText.setText(description); + mDateEditText.setText(date); + mTimeInEditText.setText(timeIn); + mTimeOutEditText.setText(timeOut); + mBreakEditText.setText(Integer.toString(breaks)); + mDurationTextView.setText(Float.toString(duration) + " Hours"); + + } + } + + + @Override + public void onLoaderReset(Loader loader) { + + } +} 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..78c4d9c --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftProvider.java @@ -0,0 +1,236 @@ +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; + + @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"); + } + + values.getAsFloat(ShiftsEntry.COLUMN_SHIFT_DURATION); + + 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..0cce669 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsContract.java @@ -0,0 +1,52 @@ +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 _ID = BaseColumns._ID; + + 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"; + + + + } +} 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..e3c714b --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/Data/ShiftsDbHelper.java @@ -0,0 +1,47 @@ +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 = 1; + + + 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)"; + + db.execSQL(SQL_CREATE_PRODUCTS_TABLE); + } + + + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } +} diff --git a/app/src/main/java/com/example/h_mal/shift_tracker/LoginScreen.java b/app/src/main/java/com/example/h_mal/shift_tracker/LoginScreen.java new file mode 100644 index 0000000..2c17c38 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/LoginScreen.java @@ -0,0 +1,76 @@ +package com.example.h_mal.shift_tracker; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +/** + * Created by h_mal on 27/06/2017. + */ + +public class LoginScreen extends AppCompatActivity{ + + private EditText mPasswordEditText; + + String password; + + int count = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.login_screen); + + SharedPreferences settings = getSharedPreferences("PREFS", 0); + password = settings.getString("password", ""); + + mPasswordEditText = (EditText) findViewById(R.id.loginPassword); + + Button login = (Button) findViewById(R.id.loginButton); + login.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + login(); + mPasswordEditText.getText().clear(); + + } + }); + + + } + + private void login() { + String PasswordString = mPasswordEditText.getText().toString().trim(); + + if ( + TextUtils.isEmpty(PasswordString) ) { + Toast.makeText(LoginScreen.this, "please enter password", Toast.LENGTH_SHORT).show(); + return; + } + + if(PasswordString.equals(password)){ + Intent i = new Intent(LoginScreen.this, MainActivity.class); + startActivity(i); + }else{ + addCount(); + Toast.makeText(LoginScreen.this, "password incorrect " + (4 - count) + " tries left", Toast.LENGTH_SHORT).show(); + + } + } + + private void addCount(){ + count = count + 1; + if (count == 4){ + finish(); + System.exit(0); + } + } + + +} diff --git a/app/src/main/java/com/example/h_mal/shift_tracker/LoginSetup.java b/app/src/main/java/com/example/h_mal/shift_tracker/LoginSetup.java new file mode 100644 index 0000000..9b30418 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/LoginSetup.java @@ -0,0 +1,73 @@ +package com.example.h_mal.shift_tracker; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +/** + * Created by h_mal on 27/06/2017. + */ + +public class LoginSetup extends Activity { + + private EditText mPasswordInitialEditText; + private EditText mPasswordCheckEditText; + + public SharedPreferences prefs = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.login_setup); + + mPasswordInitialEditText = (EditText) findViewById(R.id.loginPasswordInitial); + mPasswordCheckEditText = (EditText) findViewById(R.id.loginPasswordCheck); + + Button login = (Button) findViewById(R.id.loginButton); + login.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + clickLogin(); + + } + }); + + + } + + private void clickLogin() { + + String initialPasswordString = mPasswordInitialEditText.getText().toString().trim(); + String checkPasswordString = mPasswordCheckEditText.getText().toString().trim(); + + if ( + TextUtils.isEmpty(initialPasswordString) || + TextUtils.isEmpty(checkPasswordString) ) { + Toast.makeText(LoginSetup.this, "please set password", Toast.LENGTH_SHORT).show(); + return; + } + + if (!initialPasswordString.equals(checkPasswordString)){ + Toast.makeText(LoginSetup.this, "Passwords do not match", Toast.LENGTH_SHORT).show(); + return;} + + if(initialPasswordString.equals(checkPasswordString)){ + SharedPreferences settings = getSharedPreferences("PREFS", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString("password", initialPasswordString); + editor.apply(); + + } + + Intent i = new Intent(LoginSetup.this, MainActivity.class); + startActivity(i); + + } + +} 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..c723e41 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/MainActivity.java @@ -0,0 +1,157 @@ +package com.example.h_mal.shift_tracker; + +import android.app.LoaderManager; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.CursorLoader; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.Loader; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ListView; +import android.support.design.widget.FloatingActionButton; + +import com.example.h_mal.shift_tracker.Data.ShiftsContract.ShiftsEntry; +import com.example.h_mal.shift_tracker.Data.ShiftsDbHelper; + + +public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { + + private static final int ACHIEVEMENT_LOADER = 0; + + ShiftsCursorAdapter mCursorAdapter; + ShiftsDbHelper shiftsDbhelper; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main_view); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab1); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(MainActivity.this, AddItem.class); + startActivity(intent); + } + }); + + ListView productListView = (ListView) findViewById(R.id.list_item_view); + + View emptyView = findViewById(R.id.empty_view); + productListView.setEmptyView(emptyView); + + mCursorAdapter = new ShiftsCursorAdapter(this, null); + productListView.setAdapter(mCursorAdapter); + + getLoaderManager().initLoader(ACHIEVEMENT_LOADER, null, this); + + } + + private void insertProduct() { + ContentValues values = new ContentValues(); + values.put(ShiftsEntry.COLUMN_SHIFT_DESCRIPTION, "Random Location"); + values.put(ShiftsEntry.COLUMN_SHIFT_DATE, "1970/01/01"); + values.put(ShiftsEntry.COLUMN_SHIFT_TIME_IN, "00:00"); + values.put(ShiftsEntry.COLUMN_SHIFT_TIME_OUT, "12:00"); + values.put(ShiftsEntry.COLUMN_SHIFT_BREAK, 30); + values.put(ShiftsEntry.COLUMN_SHIFT_DURATION, 12); + + getContentResolver().insert(ShiftsEntry.CONTENT_URI, values); + } + + + private void deleteAllProducts() { + int rowsDeleted = getContentResolver().delete(ShiftsEntry.CONTENT_URI, null, null); + Log.v("MainActivity", rowsDeleted + " rows deleted"); + } + + @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; + } + + public void clickOnViewItem(long id) { + Intent intent = new Intent(MainActivity.this, AddItem.class); + Uri currentProductUri = ContentUris.withAppendedId(ShiftsEntry.CONTENT_URI, id); + intent.setData(currentProductUri); + startActivity(intent); + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case R.id.delete_all: + deleteAllProducts(); + return true; + + case R.id.insert_placeholder_data: + insertProduct(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @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}; + + return new CursorLoader(this, + ShiftsEntry.CONTENT_URI, + projection, + null, + null, + null); + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + mCursorAdapter.swapCursor(data); + } + + @Override + public void onLoaderReset(Loader loader) { + mCursorAdapter.swapCursor(null); + } + + @Override + public void onBackPressed() { + new AlertDialog.Builder(this) + .setTitle("Leave?") + .setMessage("Are you sure you want to exit Shifts?") + .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(); + } + +} 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..78f1640 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/ShiftsCursorAdapter.java @@ -0,0 +1,65 @@ +package com.example.h_mal.shift_tracker; + +import android.content.Context; +import android.database.Cursor; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; +import android.widget.TextView; + +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; + + 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, parent, false); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + mContext = context; + + TextView descriptionTextView = (TextView) view.findViewById(R.id.editText); + TextView dateTextView = (TextView) view.findViewById(R.id.textView5); + TextView timeTextView = (TextView) view.findViewById(R.id.textView5out); + TextView durationTextView = (TextView) view.findViewById(R.id.textView7); + + 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 String durationColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_DURATION)); + final String breakOutColumnIndex = cursor.getString(cursor.getColumnIndexOrThrow(ShiftsEntry.COLUMN_SHIFT_BREAK)); + + descriptionTextView.setText(descriptionColumnIndex); + dateTextView.setText(dateColumnIndex); + timeTextView.setText(timeInColumnIndex + "-" + timeOutColumnIndex); + durationTextView.setText(durationColumnIndex + " Hours worked (+ "+ breakOutColumnIndex +" minutes break)"); + + final long id = cursor.getLong(cursor.getColumnIndexOrThrow(ShiftsEntry._ID)); + + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + activity.clickOnViewItem(id); + } + }); + + } + +} 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..b3a1285 --- /dev/null +++ b/app/src/main/java/com/example/h_mal/shift_tracker/SplashScreen.java @@ -0,0 +1,57 @@ +package com.example.h_mal.shift_tracker; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; + +/** + * Created by h_mal on 27/06/2017. + */ + +public class SplashScreen extends Activity { + + // Splash screen timer + private static int SPLASH_TIME_OUT = 3000; + + String password; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_splash); + + SharedPreferences settings = getSharedPreferences("PREFS", 0); + password = settings.getString("password", ""); + + + new Handler().postDelayed(new Runnable() { + + /* + * Showing splash screen with a timer. This will be useful when you + * want to show case your app logo / company + */ + + @Override + public void run() { + // This method will be executed once the timer is over + // Start your app main activity + if (password.equals("")) { + Intent i = new Intent(SplashScreen.this, LoginSetup.class); + startActivity(i); + }else { + Intent i = new Intent(SplashScreen.this, LoginScreen.class); + startActivity(i); + } + + // close this activity + finish(); + + + } + }, SPLASH_TIME_OUT); + } + + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/img248.jpg b/app/src/main/res/drawable/img248.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac5fbb8fc070b835ab1ec47c4e99057862f22729 GIT binary patch literal 63026 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_add_item.xml b/app/src/main/res/layout/activity_add_item.xml new file mode 100644 index 0000000..5275dd2 --- /dev/null +++ b/app/src/main/res/layout/activity_add_item.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +