diff --git a/.gitignore b/.gitignore index 4abd130..c08f481 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/* gradle/* gradlew* import-summary.txt +*.apk diff --git a/BloodDonation.iml b/BloodDonation.iml index 42f4ed5..0bb6048 100644 --- a/BloodDonation.iml +++ b/BloodDonation.iml @@ -8,8 +8,6 @@ - - diff --git a/app/app.iml b/app/app.iml index 19f8ce0..4ecb9d0 100644 --- a/app/app.iml +++ b/app/app.iml @@ -85,9 +85,29 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 5341058..1856d5a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,5 +18,5 @@ android { dependencies { compile 'com.google.android.gms:play-services:+' - compile 'com.android.support:support-v4:21.0.3' + compile 'com.android.support:appcompat-v7:21.0.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 55521db..5c3ead8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="5" + android:versionName="2.0" > - + android:parentActivityName=".activity.MainActivity" + android:screenOrientation="portrait"> diff --git a/app/src/main/java/fr/mobdev/blooddonation/Database.java b/app/src/main/java/fr/mobdev/blooddonation/Database.java index 8329a72..da55a10 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/Database.java +++ b/app/src/main/java/fr/mobdev/blooddonation/Database.java @@ -2,6 +2,8 @@ package fr.mobdev.blooddonation; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.TimeZone; @@ -26,7 +28,7 @@ public class Database extends SQLiteOpenHelper { public static Database getInstance(Context context) { if(instance == null) - instance = new Database(context, "BloodDonation.db", null, 2); + instance = new Database(context, "BloodDonation.db", null, 3); return instance; } @@ -47,7 +49,7 @@ public class Database extends SQLiteOpenHelper { "id integer primary key autoincrement, date INTEGER, siteId INTEGER, city varchar(1024), donation_type INTEGER" + ");"); db.execSQL("Create table if not exists notification (" + - "id integer primary key autoincrement, siteId INTEGER " + + "id integer primary key autoincrement, siteId INTEGER, skip INTEGER " + ");"); @@ -63,6 +65,10 @@ public class Database extends SQLiteOpenHelper { "id integer primary key autoincrement, siteId INTEGER " + ");"); } + else if(oldVersion == 2 && newVersion == 3) + { + db.execSQL("Alter Table notification Add Column skip INTEGER;"); + } } @@ -327,7 +333,9 @@ public class Database extends SQLiteOpenHelper { Calendar cal = Calendar.getInstance(); while(cursor.moveToNext()) { - Long id = cursor.getLong(1); + int col = 1; + Long id = cursor.getLong(col++); + int skip = cursor.getInt(col++); List site = getBloodSites(id); //for each siteId found check if date is passed and if it was remove item from the notifications if(site.size() == 1 && cal.compareTo(site.get(0).getDate()) > 0) @@ -336,12 +344,20 @@ public class Database extends SQLiteOpenHelper { } else { - if(site.size() > 0) + if(site.size() > 0 && skip == 0) sites.add(site.get(0)); } } + Comparator compareDate = new Comparator() { + @Override + public int compare(BloodSite lhs, BloodSite rhs) { + return lhs.getDate().compareTo(rhs.getDate()); + } + }; + removeNotifications(oldNotif); + Collections.sort(sites,compareDate); return sites; } @@ -349,7 +365,7 @@ public class Database extends SQLiteOpenHelper { public void removeNotifications(List notificationIds) { String args[] = new String[1]; - String clause = "id = ?"; + String clause = "siteId = ?"; for(Long id : notificationIds) { args[0] = String.valueOf(id); @@ -357,7 +373,7 @@ public class Database extends SQLiteOpenHelper { } } - public void sheduleDonation(long siteId, boolean scheduling) + public void scheduleDonation(long siteId, boolean scheduling) { String whereClause = "id = ? "; String[] whereArgs = new String[1]; @@ -454,13 +470,49 @@ public class Database extends SQLiteOpenHelper { return null; } + public List getAllNotifications() + { + + List notifications = new ArrayList(); + + Cursor cursor = getWritableDatabase().query("notification",null,null,null,null,null,null); + while(cursor.moveToNext()) + { + int col = 1; + Long id = cursor.getLong(col++); + notifications.add(id); + } + + return notifications; + } + public void addNotifications(List newNotifications) { + + List ids = getAllNotifications(); + for(Long id : newNotifications) { - ContentValues values = new ContentValues(); - values.put("siteId", id); - getWritableDatabase().insert("notification", null, values); + if(!ids.contains(id)) { + System.out.println("Db add notif "+id); + ContentValues values = new ContentValues(); + values.put("siteId", id); + values.put("skip", 0); + getWritableDatabase().insert("notification", null, values); + } } } + public void skipNotifications(List notifications) + { + String whereClause = "siteId = ? "; + String[] whereArgs = new String[1]; + for(Long id : notifications) + { + whereArgs[0] = String.valueOf(id); + ContentValues values = new ContentValues(); + values.put("skip",1); + getWritableDatabase().update("notification",values,whereClause,whereArgs); + } + } + } diff --git a/app/src/main/java/fr/mobdev/blooddonation/activity/MainActivity.java b/app/src/main/java/fr/mobdev/blooddonation/activity/MainActivity.java index ccdd1c5..33240f8 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/activity/MainActivity.java +++ b/app/src/main/java/fr/mobdev/blooddonation/activity/MainActivity.java @@ -63,9 +63,9 @@ import android.location.LocationManager; import android.os.Bundle; import android.os.CountDownTimer; import android.preference.PreferenceManager; -import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.FragmentActivity; import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -81,13 +81,12 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.Spinner; - @SuppressLint({ "UseSparseArrays", "InflateParams" }) -public class MainActivity extends FragmentActivity implements LocationSource { +public class MainActivity extends FragmentActivity implements LocationSource{ private GoogleMap map; - private enum CORNER { + private enum CORNER { TOP_LEFT, TOP_RIGHT, BOT_LEFT, BOT_RIGHT }; @@ -339,6 +338,7 @@ public class MainActivity extends FragmentActivity implements LocationSource { adView.loadAd(adRequest); + country = Country.FRANCE; countryMap = new HashMap(); markerList = new HashMap(); @@ -394,8 +394,7 @@ public class MainActivity extends FragmentActivity implements LocationSource { mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ - R.string.drawer_open, /* "open drawer" description */ - R.string.drawer_close /* "close drawer" description */ + R.drawable.ic_drawer ) { /** Called when a drawer has settled in a completely closed state. */ @@ -540,16 +539,17 @@ public class MainActivity extends FragmentActivity implements LocationSource { { final int MENU_ITEM = Menu.FIRST; final int SHOW_ALL = MENU_ITEM + 3; - PopupMenu menu = new PopupMenu(MainActivity.this,v); + final PopupMenu menu = new PopupMenu(MainActivity.this,v); int i = 0; List sites = Database.getInstance(getApplicationContext()).getNotifications(); + notifications.clear(); for(BloodSite site : sites) { if(i == 3) break; - DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()); - df.setTimeZone(TimeZone.getTimeZone("Europe/Paris")); - String date = df.format(site.getDate().getTime()); + DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()); + df.setTimeZone(TimeZone.getTimeZone("Europe/Paris")); + String date = df.format(site.getDate().getTime()); String notif = date + " - " + site.getCityName(); menu.getMenu().add(0,MENU_ITEM + i, Menu.NONE,notif); notifications.add(site.getDbId()); @@ -576,7 +576,17 @@ public class MainActivity extends FragmentActivity implements LocationSource { InformationDialog dialog = new InformationDialog(); dialog.setArguments(args); dialog.show(getSupportFragmentManager(), "information dialog"); + notifications.remove(id); + List notificationsToRemove = new ArrayList(); + notificationsToRemove.add(siteId); + Database.getInstance(getApplicationContext()).skipNotifications(notificationsToRemove); + menu.getMenu().removeItem(id); } + else + { + Intent newIntent = new Intent(MainActivity.this, NotificationsActivity.class); + startActivity(newIntent); + } } return true; } diff --git a/app/src/main/java/fr/mobdev/blooddonation/activity/NotificationsActivity.java b/app/src/main/java/fr/mobdev/blooddonation/activity/NotificationsActivity.java index 9d95217..0dbf680 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/activity/NotificationsActivity.java +++ b/app/src/main/java/fr/mobdev/blooddonation/activity/NotificationsActivity.java @@ -2,16 +2,103 @@ package fr.mobdev.blooddonation.activity; import android.app.Activity; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; +import android.support.v4.app.FragmentActivity; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; + +import fr.mobdev.blooddonation.Database; import fr.mobdev.blooddonation.R; +import fr.mobdev.blooddonation.dialog.InformationDialog; +import fr.mobdev.blooddonation.objects.BloodSite; -public class NotificationsActivity extends Activity { +public class NotificationsActivity extends FragmentActivity implements AdapterView.OnItemClickListener { + private List notificationsIds; + private List readedNotifications; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notifications); + + notificationsIds = new ArrayList(); + readedNotifications = new ArrayList(); + buildListView(); + ListView view = (ListView) findViewById(R.id.notifications_list); + view.setOnItemClickListener(this); + + } + + @Override + protected void onDestroy() + { + Database.getInstance(getApplicationContext()).skipNotifications(readedNotifications); + super.onDestroy(); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(position != notificationsIds.size()) { + long siteId = notificationsIds.get(position); + Bundle args = new Bundle(); + args.putLong("siteId", siteId); + InformationDialog dialog = new InformationDialog(); + dialog.setArguments(args); + dialog.show(getSupportFragmentManager(), "information dialog"); + notificationsIds.remove(id); + readedNotifications.add(siteId); + } + else + { + readedNotifications.addAll(notificationsIds); + Database.getInstance(getApplicationContext()).skipNotifications(readedNotifications); + buildListView(); + } + /*List notificationsToRemove = new ArrayList(); + notificationsToRemove.add(siteId); + Database.getInstance(getApplicationContext()).removeNotifications(notificationsToRemove);*/ + //buildListView(); + } + + private void buildListView() + { + notificationsIds.clear(); + ListView view = (ListView) findViewById(R.id.notifications_list); + ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(),R.layout.simple_list_item); + Comparator compareDate = new Comparator() { + @Override + public int compare(BloodSite lhs, BloodSite rhs) { + return lhs.getDate().compareTo(rhs.getDate()); + } + }; + + List notifications = Database.getInstance(getApplicationContext()).getNotifications(); + Collections.sort(notifications, compareDate); + + for(BloodSite site : notifications) + { + + DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()); + df.setTimeZone(TimeZone.getTimeZone("Europe/Paris")); + String date = df.format(site.getDate().getTime()); + String notif = date + " - " + site.getCityName(); + adapter.add(notif); + + notificationsIds.add(site.getDbId()); + } + if(notifications.size() > 1) + adapter.add(getString(R.string.clear)); + else + adapter.add(getString(R.string.no_notif)); + view.setAdapter(adapter); } } diff --git a/app/src/main/java/fr/mobdev/blooddonation/dialog/ConfirmDialog.java b/app/src/main/java/fr/mobdev/blooddonation/dialog/ConfirmDialog.java index 3677c3c..c1c64b0 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/dialog/ConfirmDialog.java +++ b/app/src/main/java/fr/mobdev/blooddonation/dialog/ConfirmDialog.java @@ -91,7 +91,7 @@ public class ConfirmDialog extends android.support.v4.app.DialogFragment { Calendar date = site.getDate(); Donation donation = new Donation(type,date,siteId,-1,site.getCityName()); Database.getInstance(getActivity()).addDonation(donation); - Database.getInstance(getActivity()).sheduleDonation(siteId, false); + Database.getInstance(getActivity()).scheduleDonation(siteId, false); if(donationListener != null) donationListener.needUpdate(); if(registerListener != null) @@ -100,7 +100,7 @@ public class ConfirmDialog extends android.support.v4.app.DialogFragment { }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - Database.getInstance(getActivity()).sheduleDonation(siteId, false); + Database.getInstance(getActivity()).scheduleDonation(siteId, false); if(registerListener != null) registerListener.processNewRegistration(); dialog.cancel(); diff --git a/app/src/main/java/fr/mobdev/blooddonation/dialog/InformationDialog.java b/app/src/main/java/fr/mobdev/blooddonation/dialog/InformationDialog.java index 302d765..d34c8d7 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/dialog/InformationDialog.java +++ b/app/src/main/java/fr/mobdev/blooddonation/dialog/InformationDialog.java @@ -99,7 +99,7 @@ public class InformationDialog extends DialogFragment { final int endHour = Integer.valueOf(end.substring(0,2)) * 1000 * 60 *60 + Integer.valueOf(end.substring(3,5))*1000*60; intent.putExtra("beginTime", site.getDate().getTimeInMillis()+beginHour); intent.putExtra("endTime", site.getDate().getTimeInMillis()+endHour); - Database.getInstance(getActivity()).sheduleDonation(siteId, true); + Database.getInstance(getActivity()).scheduleDonation(siteId, true); } intent.putExtra("allDay", false); diff --git a/app/src/main/java/fr/mobdev/blooddonation/service/AlarmReceiver.java b/app/src/main/java/fr/mobdev/blooddonation/service/AlarmReceiver.java index 703eb6e..264bc32 100644 --- a/app/src/main/java/fr/mobdev/blooddonation/service/AlarmReceiver.java +++ b/app/src/main/java/fr/mobdev/blooddonation/service/AlarmReceiver.java @@ -163,15 +163,14 @@ public class AlarmReceiver extends BroadcastReceiver { List sites = Database.getInstance(context).getBloodSites(-1); checkForProximity(sites, context); checkForDate(sites, context); - List notifications = Database.getInstance(context).getNotifications(); + List notifications = Database.getInstance(context).getAllNotifications(); List newNotifications = new ArrayList(); for(BloodSite site : sites) { - if(!notifications.contains(site)) - { newNotifications.add(site.getDbId()); - } } + + newNotifications.removeAll(notifications); Database.getInstance(context).addNotifications(newNotifications); notifyUser(context,newNotifications); } diff --git a/app/src/main/res/layout/main_activity_google.xml b/app/src/main/res/layout/main_activity_google.xml index 279f0cf..61b742b 100644 --- a/app/src/main/res/layout/main_activity_google.xml +++ b/app/src/main/res/layout/main_activity_google.xml @@ -1,18 +1,18 @@ + tools:context=".MainActivity"> + android:layout_height="match_parent"> + android:paddingTop="@dimen/activity_vertical_margin"> + + android:layout_above="@+id/adView" + android:layout_alignParentTop="true" + android:tag="Test" /> @@ -49,11 +50,11 @@ android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="start" - + + android:background="#FFFFFFFF" android:choiceMode="singleChoice" android:divider="@android:color/transparent" - android:dividerHeight="0dp" - android:background="#FFFFFFFF"/> - + android:dividerHeight="0dp" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/notifications.xml b/app/src/main/res/layout/notifications.xml index c3812d1..522a3f0 100644 --- a/app/src/main/res/layout/notifications.xml +++ b/app/src/main/res/layout/notifications.xml @@ -1,9 +1,15 @@ - + tools:context=".NotificationsActivity"> - + + diff --git a/app/src/main/res/layout/simple_list_item.xml b/app/src/main/res/layout/simple_list_item.xml new file mode 100644 index 0000000..4fa673e --- /dev/null +++ b/app/src/main/res/layout/simple_list_item.xml @@ -0,0 +1,9 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index adb2ba6..842e213 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,6 +80,7 @@ Centre de Notification Voir tout Pas de Notifications + Supprimer tout Homme