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