Big refactoring

Fragment instead of activity
OSM instead of GMaps
Remove old code to replace by newer implementation
Fix warnings
This commit is contained in:
Schoumi 2017-08-23 14:45:30 +02:00
parent 2985520c89
commit b0f208823b
55 changed files with 2661 additions and 2422 deletions

31
.gitignore vendored
View File

@ -1,9 +1,26 @@
app/build/*
build/*
.gradle/*
.idea/*
gradle/*
gradlew*
import-summary.txt
*.apk
# Generated files
bin/
gen/
# Gradle files
.gradle/
build/
/*/build/
gradlew*
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
#android-studio file
.idea
*.iml
captures/

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,113 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="BloodDonation" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":app" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="play-services-plus-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-cast-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-maps-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-base-7.0.0" level="project" />
<orderEntry type="library" exported="" name="support-v4-22.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-fitness-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-panorama-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-safetynet-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-location-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-identity-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-ads-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-appstate-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-drive-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-games-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-analytics-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-appindexing-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-7.0.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-22.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-gcm-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-nearby-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-wearable-7.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-wallet-7.0.0" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-21.0.0" level="project" />
</component>
</module>

View File

@ -1,22 +1,30 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion '21.1.2'
compileSdkVersion 26
buildToolsVersion '26.0.1'
defaultConfig {
applicationId "fr.mobdev.blooddonation"
minSdkVersion 11
targetSdkVersion 21
minSdkVersion 17
targetSdkVersion 26
versionCode = "8"
versionName = "3.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.google.android.gms:play-services-ads:11.0.4'
compile 'com.github.car2go.AnyMaps:anymaps-base:6.0.0'
compile 'com.github.car2go.AnyMaps:anymaps-osm:6.0.0'
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.android.support:support-v4:26.0.0-alpha1'
}

View File

@ -1,12 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.mobdev.blooddonation"
android:versionCode="7"
android:versionName="2.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="21" />
>
<supports-screens
android:largeScreens="false"
@ -19,63 +14,29 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-feature android:name="android.hardware.location.gps"/>
<application
android:name=".App"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library
android:name="com.google.android.maps"
android:required="false" />
<!-- google Maps API -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBtxQBjEu5XZ0Gw_ObqTx-iCaCsLth4Id8" />
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait" >
android:theme="@style/AppTheme.NoActionBar"
android:screenOrientation="portrait"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.AboutActivity"
android:parentActivityName=".activity.MainActivity"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".activity.PrefsActivity"
android:parentActivityName=".activity.MainActivity"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".activity.DonationActivity"
android:parentActivityName=".activity.MainActivity"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".activity.DonationInfoActivity"
android:parentActivityName=".activity.MainActivity"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
@ -87,12 +48,6 @@
</receiver>
<receiver android:name=".service.AlarmReceiver" />
<activity
android:name=".activity.NotificationsActivity"
android:label="@string/title_activity_notifications"
android:parentActivityName=".activity.MainActivity"
android:screenOrientation="portrait">
</activity>
</application>
</manifest>

View File

@ -1,25 +0,0 @@
package fr.mobdev.blooddonation;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import android.app.Application;
public class App extends Application {
private Tracker tracker;
public void onCreate(){
super.onCreate();
tracker = null;
getTracker();
}
synchronized Tracker getTracker() {
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
if(tracker == null)
tracker = analytics.newTracker(R.xml.analytics);
return tracker;
}
}

View File

@ -13,7 +13,7 @@ import fr.mobdev.blooddonation.enums.DonationType;
import fr.mobdev.blooddonation.enums.SiteType;
import fr.mobdev.blooddonation.objects.BloodSite;
import fr.mobdev.blooddonation.objects.Donation;
import fr.mobdev.blooddonation.objects.LatiLng;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@ -21,6 +21,9 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import com.car2go.maps.model.LatLng;
public class Database extends SQLiteOpenHelper {
private static Database instance;
@ -86,7 +89,7 @@ public class Database extends SQLiteOpenHelper {
values.put("longitude", 0);
if(!isFirstTime())
{
int userId = -1;
int userId;
Cursor cursor = getReadableDatabase().query("user",null,null,null,null,null,null);
cursor.moveToFirst();
userId = cursor.getInt(0);
@ -94,6 +97,7 @@ public class Database extends SQLiteOpenHelper {
String[] whereArgs = new String[1];
whereArgs[0] = String.valueOf(userId);
getWritableDatabase().update("user", values, whereClause, whereArgs);
cursor.close();
}
else
{
@ -107,7 +111,7 @@ public class Database extends SQLiteOpenHelper {
ContentValues values = new ContentValues();
values.put("latitude", latitude);
values.put("longitude", longitude);
int userId = -1;
int userId;
Cursor cursor = getReadableDatabase().query("user",null,null,null,null,null,null);
cursor.moveToFirst();
userId = cursor.getInt(0);
@ -115,19 +119,23 @@ public class Database extends SQLiteOpenHelper {
String[] whereArgs = new String[1];
whereArgs[0] = String.valueOf(userId);
getWritableDatabase().update("user", values, whereClause, whereArgs);
cursor.close();
}
public boolean isFirstTime() {
Cursor cursor = getReadableDatabase().query("user",null,null,null,null,null,null);
if(cursor.getCount() != 0)
if(cursor.getCount() != 0){
cursor.close();
return false;
}
cursor.close();
return true;
}
public void addSitesToDb(List<BloodSite> sites) {
//remove existing site in the list
List<BloodSite> oldList = getBloodSites(-1);
List<BloodSite> removeList = new ArrayList<BloodSite>();
List<BloodSite> removeList = new ArrayList<>();
for(BloodSite site : sites)
{
if(oldList.contains(site))
@ -159,8 +167,8 @@ public class Database extends SQLiteOpenHelper {
}
public List<Donation> getDonations() {
List<Donation> donations = new ArrayList<Donation>();
String orderBy = "date ASC";
List<Donation> donations = new ArrayList<>();
String orderBy = "date DESC";
Cursor cursor = getReadableDatabase().query("donation", null, null, null, null, null, orderBy);
while(cursor.moveToNext())
{
@ -169,7 +177,7 @@ public class Database extends SQLiteOpenHelper {
long date = cursor.getLong(col++);
int siteId = cursor.getInt(col++);
String city_name = cursor.getString(col++);
int donation_type = cursor.getInt(col++);
int donation_type = cursor.getInt(col);
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
@ -178,6 +186,7 @@ public class Database extends SQLiteOpenHelper {
Donation donation = new Donation(DonationType.values()[donation_type], cal, siteId, donationId, city_name);
donations.add(donation);
}
cursor.close();
return donations;
}
@ -202,7 +211,7 @@ public class Database extends SQLiteOpenHelper {
public HashMap<String, Object> getUserInformation()
{
HashMap<String, Object> maps = new HashMap<String, Object>();
HashMap<String, Object> maps = new HashMap<>();
if(!isFirstTime())
{
Cursor cursor = getReadableDatabase().query("user",null,null,null,null,null,null);
@ -218,13 +227,14 @@ public class Database extends SQLiteOpenHelper {
maps.put("E", cursor.getInt(col++));
maps.put("c", cursor.getInt(col++));
maps.put("e", cursor.getInt(col++));
maps.put("K", cursor.getInt(col++));
maps.put("K", cursor.getInt(col));
cursor.close();
}
return maps;
}
public List<BloodSite> getBloodSites(long siteId) {
ArrayList<BloodSite> list = new ArrayList<BloodSite>();
ArrayList<BloodSite> list = new ArrayList<>();
String whereClause = null;
String[] whereArgs = null;
if(siteId != -1)
@ -263,11 +273,11 @@ public class Database extends SQLiteOpenHelper {
}
double lat = cursor.getDouble(col++);
double lon = cursor.getDouble(col++);
site.setLoc(new LatiLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col++)]);
site.setLoc(new LatLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col)]);
list.add(site);
}
cursor.close();
return list;
}
@ -316,23 +326,24 @@ public class Database extends SQLiteOpenHelper {
}
double lat = cursor.getDouble(col++);
double lon = cursor.getDouble(col++);
site.setLoc(new LatiLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col++)]);
site.setLoc(new LatLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col)]);
}
cursor.close();
return site;
}
public List<BloodSite> getNotifications()
{
Cursor cursor = getWritableDatabase().query("notification",null,null,null,null,null,null);
List<Long> oldNotif = new ArrayList<Long>();
List<BloodSite> sites = new ArrayList<BloodSite>();
List<Long> oldNotif = new ArrayList<>();
List<BloodSite> sites = new ArrayList<>();
Calendar cal = Calendar.getInstance();
while(cursor.moveToNext())
{
int col = 1;
Long id = cursor.getLong(col++);
int skip = cursor.getInt(col++);
int skip = cursor.getInt(col);
List<BloodSite> 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)
@ -355,11 +366,11 @@ public class Database extends SQLiteOpenHelper {
removeNotifications(oldNotif);
Collections.sort(sites,compareDate);
cursor.close();
return sites;
}
public void removeNotifications(List<Long> notificationIds)
private void removeNotifications(List<Long> notificationIds)
{
String args[] = new String[1];
String clause = "siteId = ?";
@ -385,10 +396,10 @@ public class Database extends SQLiteOpenHelper {
getWritableDatabase().update("site", values, whereClause, whereArgs);
}
public List<BloodSite> getBloodSites(LatiLng NE, LatiLng SW) {
public List<BloodSite> getBloodSites(LatLng NE, LatLng SW) {
List<BloodSite> list = new ArrayList<BloodSite>();
List<BloodSite> list = new ArrayList<>();
String whereClause = "latitude < ? and latitude > ? and longitude < ? and longitude > ? ";
String[] whereArgs = new String[4];
@ -434,26 +445,27 @@ public class Database extends SQLiteOpenHelper {
}
double lat = cursor.getDouble(col++);
double lon = cursor.getDouble(col++);
site.setLoc(new LatiLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col++)]);
site.setLoc(new LatLng(lat, lon));
site.setType(SiteType.values()[cursor.getInt(col)]);
if(site.getDate() == null || site.getDate().getTimeInMillis() >= dateInMillis)
list.add(site);
}
cursor.close();
return list;
}
public LatiLng getUserLastLocation() {
public LatLng getUserLastLocation() {
String[] columns = new String[2];
columns[0] = "latitude";
columns[1] = "longitude";
Cursor cursor = getReadableDatabase().query("user",columns,null,null,null,null,null);
cursor.moveToFirst();
LatiLng loc = new LatiLng(cursor.getDouble(0),cursor.getDouble(1));
LatLng loc = new LatLng(cursor.getDouble(0),cursor.getDouble(1));
cursor.close();
return loc;
}
public Calendar getLastDonationDate() {
// TODO
String[] columns = new String[1];
columns[0] = "date";
String orderBy = "date DESC";
@ -464,22 +476,23 @@ public class Database extends SQLiteOpenHelper {
cal.setTimeInMillis(cursor.getLong(0));
return cal;
}
cursor.close();
return null;
}
public List<Long> getAllNotifications()
{
List<Long> notifications = new ArrayList<Long>();
List<Long> 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++);
Long id = cursor.getLong(col);
notifications.add(id);
}
cursor.close();
return notifications;
}

View File

@ -20,13 +20,15 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.util.Log;
import com.car2go.maps.model.LatLng;
import fr.mobdev.blooddonation.enums.Country;
import fr.mobdev.blooddonation.enums.SiteType;
import fr.mobdev.blooddonation.objects.BloodSite;
import fr.mobdev.blooddonation.objects.LatiLng;
public class NetworkManager {
//TODO Complete rework with thread and message Queue
private NetworkListener listener;
private static NetworkManager instance;
private Context context;
@ -37,7 +39,7 @@ public class NetworkManager {
{
this.listener = listener;
this.context = context;
idList = new ArrayList<Integer>();
idList = new ArrayList<>();
}
public static NetworkManager getInstance(NetworkListener listener, Context context){
@ -58,7 +60,7 @@ public class NetworkManager {
this.listener = listener;
}
public void loadFromNet(final Country ctr,final LatiLng nECorner, final LatiLng sWCorner)
public void loadFromNet(final Country ctr, final LatLng nECorner, final LatLng sWCorner)
{
if(!isConnectedToInternet(context))
return;
@ -81,9 +83,9 @@ public class NetworkManager {
}).start();
}
public List<BloodSite> loadFrenchData(LatiLng nECorner, LatiLng sWCorner)
private List<BloodSite> loadFrenchData(LatLng nECorner, LatLng sWCorner)
{
List<BloodSite> siteList = new ArrayList<BloodSite>();
List<BloodSite> siteList = new ArrayList<>();
String urlstr = "http://carte.dondusang.com/gmap_regionchanged.php?"
+"nelat="+nECorner.latitude
+"&nelon="+nECorner.longitude
@ -98,7 +100,7 @@ public class NetworkManager {
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
URLConnection connect = null;
URLConnection connect;
InputStream stream = null;
try {
if(isConnectedToInternet(context))
@ -245,7 +247,7 @@ public class NetworkManager {
newSite.setSiteId(siteId);
newSite.setDate(date);
newSite.setSiteName(siteName);
newSite.setLoc(new LatiLng(latitude,longitude));
newSite.setLoc(new LatLng(latitude,longitude));
newSite.setType(type);
newSite.setCityName(cityName);
newSite.setPhone(phone);

View File

@ -3,5 +3,5 @@ package fr.mobdev.blooddonation;
import java.util.EventListener;
public interface NewDonationListener extends EventListener {
public void needUpdate();
void needUpdate();
}

View File

@ -1,30 +0,0 @@
package fr.mobdev.blooddonation.activity;
import com.google.android.gms.analytics.GoogleAnalytics;
import fr.mobdev.blooddonation.R;
import android.app.Activity;
import android.os.Bundle;
public class AboutActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
getActionBar().setTitle(R.string.about);
}
@Override
public void onStart() {
super.onStart();
GoogleAnalytics.getInstance(this).reportActivityStart(this);
}
@Override
public void onStop() {
super.onStop();
GoogleAnalytics.getInstance(this).reportActivityStop(this);
}
}

View File

@ -1,260 +0,0 @@
package fr.mobdev.blooddonation.activity;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import com.google.android.gms.analytics.GoogleAnalytics;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.NewDonationListener;
import fr.mobdev.blooddonation.R;
import fr.mobdev.blooddonation.SelectionModeListener;
import fr.mobdev.blooddonation.custom_object.DrawerAdapter;
import fr.mobdev.blooddonation.custom_object.DrawerItem;
import fr.mobdev.blooddonation.dialog.AddDonationDialog;
import fr.mobdev.blooddonation.enums.DrawerItemType;
import fr.mobdev.blooddonation.objects.Donation;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemLongClickListener;
public class DonationActivity extends FragmentActivity {
ListView donation_list;
List<Donation> donations;
SelectionModeListener listener;
boolean isOnSelection;
List<DrawerItem> items;
MenuItem del_item;
Context context;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.donation);
donation_list = (ListView) findViewById(R.id.donation_list);
items = new ArrayList<DrawerItem>();
isOnSelection = false;
context = this;
listener = new SelectionModeListener() {
@Override
public void selectionModeChange(View v) {
isOnSelection = !isOnSelection;
if(isOnSelection)
{
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_CHECK);
}
selectView(v);
del_item.setVisible(true);
DrawerAdapter adapter = new DrawerAdapter(context,R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
else
{
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_NORMAL);
item.setSelected(false);
}
del_item.setVisible(false);
DrawerAdapter adapter = new DrawerAdapter(context,R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
}
};
donation_list.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View v, int pos, long id) {
if(!isOnSelection)
{
listener.selectionModeChange(v);
}
else
{
selectView(v);
}
return true;
}
});
donation_list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int arg2, long id) {
selectView(v);
}
});
updateDonationList();
getActionBar().setTitle(R.string.donations);
}
@Override
public void onStart() {
super.onStart();
GoogleAnalytics.getInstance(this).reportActivityStart(this);
}
@Override
public void onStop() {
super.onStop();
GoogleAnalytics.getInstance(this).reportActivityStop(this);
}
private void selectView(View v)
{
if(isOnSelection)
{
TextView view = (TextView) v.findViewById(R.id.pos);
long donationId = Integer.valueOf((String) view.getText());
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_CHECK);
if(item.getPos() == donationId)
{
item.setSelected(!item.isSelected());
}
}
DrawerAdapter adapter = new DrawerAdapter(context,R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.donnation_menu, menu);
del_item = menu.findItem(R.id.action_del);
del_item.setVisible(false);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
addDonation();
return true;
case R.id.action_del:
askRemoveDonation();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void onBackPressed(){
if(isOnSelection)
{
listener.selectionModeChange(null);
}
else
{
finish();
}
}
private void addDonation()
{
AddDonationDialog dialog = new AddDonationDialog();
Bundle bundle = new Bundle();
bundle.putInt("siteId", -1);
dialog.setArguments(bundle);
dialog.setListener(new NewDonationListener() {
@Override
public void needUpdate() {
updateDonationList();
}
});
dialog.show(getSupportFragmentManager(), "add donation dialog");
}
private void askRemoveDonation()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.delete_donation_message)
.setCancelable(false)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
removeSelectedDonation();
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void removeSelectedDonation()
{
List<Donation> deletedList = new ArrayList<Donation>();
for(int i = 0; i<items.size(); i++)
{
DrawerItem item = items.get(i);
if(item.isSelected())
{
deletedList.add(donations.get(i));
}
}
Database.getInstance(this).deleteDonation(deletedList);
updateDonationList();
}
private void updateDonationList()
{
donations = Database.getInstance(this).getDonations();
items.clear();
for(Donation don : donations)
{
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault());
df.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
String texte = df.format(don.getDate().getTime());
texte += " - ";
texte += don.getCityName();
if(don.getCityName().length() > 0)
texte += " - ";
switch(don.getDonationType())
{
case TOTAL_BLOOD:
texte += getResources().getStringArray(R.array.donation_type)[0];
break;
case PLASMA:
texte += getResources().getStringArray(R.array.donation_type)[1];
break;
case PLATELET:
texte += getResources().getStringArray(R.array.donation_type)[2];
break;
default:
//do nothing
break;
}
DrawerItem item = new DrawerItem(DrawerItemType.STATE_NORMAL, texte, null);
items.add(item);
}
DrawerAdapter adapter = new DrawerAdapter(this,R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
}

View File

@ -1,61 +0,0 @@
package fr.mobdev.blooddonation.activity;
import java.util.HashMap;
import com.google.android.gms.analytics.GoogleAnalytics;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class DonationInfoActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.donation_info);
HashMap<String, Object> maps = Database.getInstance(this).getUserInformation();
String userName = (String) maps.get("UserName");
String blood = (String) maps.get("BloodGroup");
String city = (String) maps.get("CityName");
int D = (Integer) maps.get("D");
int C = (Integer) maps.get("C");
int E = (Integer) maps.get("E");
int c = (Integer) maps.get("c");
int e = (Integer) maps.get("e");
int K = (Integer) maps.get("K");
TextView view = (TextView) findViewById(R.id.user_name);
view.setText(userName);
view = (TextView) findViewById(R.id.blood_group);
view.setText(blood);
view = (TextView) findViewById(R.id.city_name);
view.setText(city);
view = (TextView) findViewById(R.id.rhesus);
String rhesus = "D" + getStringFor(D) +" C" + getStringFor(C) +" E"+ getStringFor(E) +" c"+ getStringFor(c) +" e" + getStringFor(e) + " K"+getStringFor(K);
view.setText(rhesus);
getActionBar().setTitle(R.string.donation_info);
}
private String getStringFor(int plus)
{
if(plus == 0)
return "-";
else
return "+";
}
@Override
public void onStart() {
super.onStart();
GoogleAnalytics.getInstance(this).reportActivityStart(this);
}
@Override
public void onStop() {
super.onStop();
GoogleAnalytics.getInstance(this).reportActivityStop(this);
}
}

View File

@ -1,104 +0,0 @@
package fr.mobdev.blooddonation.activity;
import android.app.Activity;
import android.os.Bundle;
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 FragmentActivity implements AdapterView.OnItemClickListener {
private List<Long> notificationsIds;
private List<Long> readedNotifications;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notifications);
notificationsIds = new ArrayList<Long>();
readedNotifications = new ArrayList<Long>();
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<Long> notificationsToRemove = new ArrayList<Long>();
notificationsToRemove.add(siteId);
Database.getInstance(getApplicationContext()).removeNotifications(notificationsToRemove);*/
//buildListView();
}
private void buildListView()
{
notificationsIds.clear();
ListView view = (ListView) findViewById(R.id.notifications_list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.simple_list_item);
Comparator<BloodSite> compareDate = new Comparator<BloodSite>() {
@Override
public int compare(BloodSite lhs, BloodSite rhs) {
return lhs.getDate().compareTo(rhs.getDate());
}
};
List<BloodSite> 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);
}
}

View File

@ -1,32 +0,0 @@
package fr.mobdev.blooddonation.activity;
import com.google.android.gms.analytics.GoogleAnalytics;
import fr.mobdev.blooddonation.PrefFragment;
import fr.mobdev.blooddonation.R;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class PrefsActivity extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new PrefFragment())
.commit();
getActionBar().setTitle(R.string.preference);
}
@Override
public void onStart() {
super.onStart();
GoogleAnalytics.getInstance(this).reportActivityStart(this);
}
@Override
public void onStop() {
super.onStop();
GoogleAnalytics.getInstance(this).reportActivityStop(this);
}
}

View File

@ -5,6 +5,7 @@ import java.util.List;
import fr.mobdev.blooddonation.R;
import fr.mobdev.blooddonation.enums.DrawerItemType;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -23,26 +24,25 @@ public class DrawerAdapter extends ArrayAdapter<DrawerItem> {
items = objects;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder holder;
DrawerItem item = items.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.drawer_item, parent, false);
}
holder = new ViewHolder();
holder.pos = (TextView) convertView.findViewById(R.id.pos);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.separator = (TextView) convertView.findViewById(R.id.separator);
holder.checkbox = (CheckedTextView) convertView.findViewById(R.id.checkbox);
holder.radio = (CheckedTextView) convertView.findViewById(R.id.radio);
holder.pos = convertView.findViewById(R.id.pos);
holder.title = convertView.findViewById(R.id.title);
holder.separator = convertView.findViewById(R.id.separator);
holder.checkbox = convertView.findViewById(R.id.checkbox);
holder.radio = convertView.findViewById(R.id.radio);
holder.pos.setText(String.valueOf(item.getPos()));
if (item.getType() == DrawerItemType.STATE_NORMAL)
{
holder.title.setVisibility(View.VISIBLE);
holder.title.setText(item.getTitle());
if(item.getOnClickListener() != null)
holder.title.setOnClickListener(item.getOnClickListener());
holder.separator.setVisibility(View.GONE);
holder.checkbox.setVisibility(View.GONE);
holder.radio.setVisibility(View.GONE);
@ -51,8 +51,6 @@ public class DrawerAdapter extends ArrayAdapter<DrawerItem> {
{
holder.separator.setVisibility(View.VISIBLE);
holder.separator.setText(item.getTitle());
if(item.getOnClickListener() != null)
holder.separator.setOnClickListener(item.getOnClickListener());
holder.title.setVisibility(View.GONE);
holder.checkbox.setVisibility(View.GONE);
holder.radio.setVisibility(View.GONE);
@ -62,8 +60,6 @@ public class DrawerAdapter extends ArrayAdapter<DrawerItem> {
holder.checkbox.setVisibility(View.VISIBLE);
holder.checkbox.setText(item.getTitle());
holder.checkbox.setChecked(item.isSelected());
if(item.getOnClickListener() != null)
holder.checkbox.setOnClickListener(item.getOnClickListener());
holder.separator.setVisibility(View.GONE);
holder.title.setVisibility(View.GONE);
@ -74,8 +70,6 @@ public class DrawerAdapter extends ArrayAdapter<DrawerItem> {
holder.radio.setVisibility(View.VISIBLE);
holder.radio.setText(item.getTitle());
holder.radio.setChecked(item.isSelected());
if(item.getOnClickListener() != null)
holder.radio.setOnClickListener(item.getOnClickListener());
holder.separator.setVisibility(View.GONE);
holder.checkbox.setVisibility(View.GONE);
holder.title.setVisibility(View.GONE);
@ -102,12 +96,16 @@ public class DrawerAdapter extends ArrayAdapter<DrawerItem> {
@Override
public int getItemViewType(int position) {
return getItem(position).getType().equals(DrawerItemType.STATE_SECTION) ? 0 : 1;
DrawerItem item = getItem(position);
assert item != null;
return item.getType().equals(DrawerItemType.STATE_SECTION) ? 0 : 1;
}
@Override
public boolean isEnabled(int position) {
return !getItem(position).getType().equals(DrawerItemType.STATE_SECTION);
DrawerItem item = getItem(position);
assert item != null;
return !item.getType().equals(DrawerItemType.STATE_SECTION);
}
}

View File

@ -1,26 +1,23 @@
package fr.mobdev.blooddonation.custom_object;
import fr.mobdev.blooddonation.enums.DrawerItemType;
import android.view.View.OnClickListener;
public class DrawerItem {
private DrawerItemType type;
private String title;
private OnClickListener listener;
private boolean selected;
private static int pos = 0;
private int id;
public DrawerItem(DrawerItemType type, String title, OnClickListener onClickListener)
public DrawerItem(DrawerItemType type, String title)
{
this.type = type;
this.title = title;
this.listener = onClickListener;
this.selected = false;
id = pos++;
}
public DrawerItemType getType() {
DrawerItemType getType() {
return type;
}
public void setType(DrawerItemType type) {
@ -33,14 +30,6 @@ public class DrawerItem {
this.title = title;
}
public void setOnClicListener(OnClickListener listerner){
this.listener = listerner;
}
public OnClickListener getOnClickListener(){
return listener;
}
public boolean isSelected() {
return selected;
}

View File

@ -18,7 +18,7 @@ import android.widget.EditText;
import android.widget.Spinner;
@SuppressLint("InflateParams")
public class AddDonationDialog extends android.support.v4.app.DialogFragment {
public class AddDonationDialog extends android.app.DialogFragment {
private int siteId;
private NewDonationListener listener;
@ -35,16 +35,16 @@ public class AddDonationDialog extends android.support.v4.app.DialogFragment {
LayoutInflater inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.add_donation_dialog, null);
DatePicker date_picker = (DatePicker) view.findViewById(R.id.add_date_picker);
DatePicker date_picker = view.findViewById(R.id.add_date_picker);
date_picker.setMaxDate(Calendar.getInstance().getTimeInMillis());
builder
.setView(view)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Spinner donationType = (Spinner) view.findViewById(R.id.add_donnation_type_spinner);
EditText name_texte = (EditText) view.findViewById(R.id.add_city_text);
DatePicker date_picker = (DatePicker) view.findViewById(R.id.add_date_picker);
Spinner donationType = view.findViewById(R.id.add_donnation_type_spinner);
EditText name_texte = view.findViewById(R.id.add_city_text);
DatePicker date_picker = view.findViewById(R.id.add_date_picker);
siteId = getArguments().getInt("siteId", -1 );
@ -63,7 +63,7 @@ public class AddDonationDialog extends android.support.v4.app.DialogFragment {
//use city from donation site
Calendar date = Calendar.getInstance();// = date_picker.get
date.set(date_picker.getYear(), date_picker.getMonth(), date_picker.getDayOfMonth(), 12, 00);
date.set(date_picker.getYear(), date_picker.getMonth(), date_picker.getDayOfMonth(), 12, 0);
Donation donation = new Donation(type, date, siteId, -1, city_name);
Database.getInstance(getActivity().getApplicationContext()).addDonation(donation);

View File

@ -6,7 +6,6 @@ import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.NewDonationListener;
import fr.mobdev.blooddonation.R;
import fr.mobdev.blooddonation.RegisterListener;
import fr.mobdev.blooddonation.enums.DonationType;
@ -15,6 +14,7 @@ import fr.mobdev.blooddonation.objects.Donation;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
@ -23,11 +23,10 @@ import android.widget.Spinner;
import android.widget.TextView;
@SuppressLint("InflateParams")
public class ConfirmDialog extends android.support.v4.app.DialogFragment {
public class ConfirmDialog extends DialogFragment {
private long siteId;
private RegisterListener registerListener;
private NewDonationListener donationListener;
public ConfirmDialog()
{
@ -63,8 +62,8 @@ public class ConfirmDialog extends android.support.v4.app.DialogFragment {
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.confirm_dialog, null);
TextView messageView = (TextView) view.findViewById(R.id.confirm_message);
final Spinner spinner = (Spinner) view.findViewById(R.id.confirm_spinner);
TextView messageView = view.findViewById(R.id.confirm_message);
final Spinner spinner = view.findViewById(R.id.confirm_spinner);
messageView.setText(message);
@ -92,8 +91,6 @@ public class ConfirmDialog extends android.support.v4.app.DialogFragment {
Donation donation = new Donation(type,date,siteId,-1,site.getCityName());
Database.getInstance(getActivity()).addDonation(donation);
Database.getInstance(getActivity()).scheduleDonation(siteId, false);
if(donationListener != null)
donationListener.needUpdate();
if(registerListener != null)
registerListener.processNewRegistration();
}
@ -109,12 +106,6 @@ public class ConfirmDialog extends android.support.v4.app.DialogFragment {
return builder.create();
}
public void setNewDonationListener(NewDonationListener listener)
{
donationListener = listener;
}
public void setRegisterListener(RegisterListener listener) {
registerListener = listener;
}

View File

@ -11,11 +11,11 @@ import fr.mobdev.blooddonation.objects.BloodSite;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@ -62,8 +62,8 @@ public class InformationDialog extends DialogFragment {
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.information_dialog, null);
TextView detailsView = (TextView) view.findViewById(R.id.details);
TextView addressView = (TextView) view.findViewById(R.id.address);
TextView detailsView = view.findViewById(R.id.details);
TextView addressView = view.findViewById(R.id.address);
//parse details to find begin and end time
detailsView.setText(site.getDetails());

View File

@ -2,15 +2,12 @@ package fr.mobdev.blooddonation.dialog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import fr.mobdev.blooddonation.R;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnShowListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@ -23,19 +20,17 @@ import android.widget.Spinner;
import android.widget.TextView;
@SuppressLint("InflateParams")
public class PostDonationDialog extends android.support.v4.app.DialogFragment {
public class PostDonationDialog extends android.app.DialogFragment {
private boolean changeMode;
private int depId;
private View view;
private List<String> numbers;
private Button neutralButton;
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
numbers = new ArrayList<String>();
neutralButton = null;
LayoutInflater inflater = getActivity().getLayoutInflater();
@ -44,8 +39,8 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
depId = getArguments().getInt("depId",-1);
else
depId = -1;
final Spinner depList = (Spinner) view.findViewById(R.id.dep_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.dep_array));
final Spinner depList = view.findViewById(R.id.dep_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.dep_array));
depList.setAdapter(adapter);
depList.setOnItemSelectedListener(new OnItemSelectedListener() {
@ -66,7 +61,7 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
{
depId = position+1;
}
TextView depView = (TextView) view.findViewById(R.id.dep_name);
TextView depView = view.findViewById(R.id.dep_name);
if(position > 0){
depView.setText(getResources().getStringArray(R.array.dep_array)[position]);
}
@ -81,7 +76,7 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
});
if(depId > 1)
depList.setSelection(depId-1);
TextView depView = (TextView) view.findViewById(R.id.dep_name);
TextView depView = view.findViewById(R.id.dep_name);
if(depId != -1)
{
@ -111,11 +106,10 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
//setup list if number list contains more 1
//
builder
.setTitle("Numéro Post Don")
.setTitle(getString(R.string.post_numbers))
.setView(view)
.setPositiveButton(R.string.call,null)
.setNeutralButton(R.string.change_region,null)
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
.setNegativeButton(R.string.close, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
@ -135,25 +129,6 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
changeSelectionMode(true);
}
});
Button positivButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
positivButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//todolaunch phone app with the right phone number depends on user locationi
if(numbers.size() > 0)
{
Spinner numberSpinner = (Spinner) view.findViewById(R.id.number_spinner);
int selectedPosition = numberSpinner.getSelectedItemPosition();
String uri = "tel:"+numbers.get(selectedPosition);
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(uri));
startActivity(intent);
dialog.dismiss();
}
}
});
changeSelectionMode(false);
}
});
@ -162,19 +137,17 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
private void changeNumbers()
{
TextView numberView = (TextView) view.findViewById(R.id.number_to_call);
Spinner numberSpinner = (Spinner) view.findViewById(R.id.number_spinner);
TextView numberView = view.findViewById(R.id.number_to_call);
Spinner numberSpinner = view.findViewById(R.id.number_spinner);
HashMap<String, String> numberMap = getNumbersFor(depId);
ArrayList<String> numberList = new ArrayList<String>();
numbers.clear();
ArrayList<String> numberList = new ArrayList<>();
for(String key : numberMap.keySet())
{
numberList.add(key+" - "+numberMap.get(key));
numbers.add(numberMap.get(key));
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line, numberList);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, numberList);
numberSpinner.setAdapter(adapter);
if(numberMap.size() > 1)
@ -199,13 +172,13 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
private void changeSelectionMode(boolean buttonPressed)
{
Spinner depList = (Spinner) view.findViewById(R.id.dep_spinner);
TextView depView = (TextView) view.findViewById(R.id.dep_name);
Spinner depList = view.findViewById(R.id.dep_spinner);
TextView depView = view.findViewById(R.id.dep_name);
HashMap<String,String> numberMap = getNumbersFor(depId);
if(buttonPressed)
changeMode = !changeMode;
if(depId == -1 || changeMode == true || numberMap.size() == 0)
if(depId == -1 || changeMode || numberMap.size() == 0)
{
depList.setVisibility(View.VISIBLE);
depView.setVisibility(View.GONE);
@ -222,7 +195,7 @@ public class PostDonationDialog extends android.support.v4.app.DialogFragment {
}
private HashMap<String,String> getNumbersFor(int depId){
HashMap<String,String> numberMap = new HashMap<String, String>();
HashMap<String,String> numberMap = new HashMap<>();
switch(depId)
{
case 1:

View File

@ -0,0 +1,62 @@
package fr.mobdev.blooddonation.fragment;
import android.app.Fragment;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import fr.mobdev.blooddonation.R;
public class AboutFragment extends Fragment {
private OnLicenceClickListener licenceClickListener;
public static AboutFragment newInstance(OnLicenceClickListener onLicenceClickListener) {
AboutFragment fragment = new AboutFragment();
fragment.setOnLicenceClickListener(onLicenceClickListener);
return fragment;
}
private void setOnLicenceClickListener(OnLicenceClickListener onLicenceClickListener) {
licenceClickListener = onLicenceClickListener;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.about, container, false);
ImageView donate = v.findViewById(R.id.donate);
donate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url = "https://fr.liberapay.com/Schoumi";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
});
TextView tv = v.findViewById(R.id.licence);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
licenceClickListener.onLicenceClick();
}
});
return v;
}
public interface OnLicenceClickListener {
void onLicenceClick();
}
}

View File

@ -0,0 +1,235 @@
package fr.mobdev.blooddonation.fragment;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.NewDonationListener;
import fr.mobdev.blooddonation.R;
import fr.mobdev.blooddonation.SelectionModeListener;
import fr.mobdev.blooddonation.custom_object.DrawerAdapter;
import fr.mobdev.blooddonation.custom_object.DrawerItem;
import fr.mobdev.blooddonation.dialog.AddDonationDialog;
import fr.mobdev.blooddonation.enums.DrawerItemType;
import fr.mobdev.blooddonation.objects.Donation;
public class DonationFragment extends Fragment {
ListView donation_list;
List<Donation> donations;
SelectionModeListener listener;
boolean isOnSelection;
List<DrawerItem> items;
private OnDeletionModeListener onDeletionModeChange;
public DonationFragment() {
}
public static DonationFragment newInstance(OnDeletionModeListener deletionModeListener) {
DonationFragment fragment = new DonationFragment();
fragment.setOnDeletionModeChange(deletionModeListener);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.donation, container,false);
donation_list = v.findViewById(R.id.donation_list);
items = new ArrayList<>();
isOnSelection = false;
listener = new SelectionModeListener() {
@Override
public void selectionModeChange(View v) {
isOnSelection = !isOnSelection;
onDeletionModeChange.onDeleteModeChange(isOnSelection);
if(isOnSelection)
{
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_CHECK);
}
selectView(v);
DrawerAdapter adapter = new DrawerAdapter(getActivity(),R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
else
{
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_NORMAL);
item.setSelected(false);
}
DrawerAdapter adapter = new DrawerAdapter(getActivity(),R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
}
};
donation_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View v, int pos, long id) {
if(!isOnSelection)
{
listener.selectionModeChange(v);
}
else
{
selectView(v);
}
return true;
}
});
donation_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int arg2, long id) {
selectView(v);
}
});
updateDonationList();
return v;
}
private void selectView(View v)
{
if(isOnSelection)
{
TextView view = v.findViewById(R.id.pos);
long donationId = Integer.valueOf((String) view.getText());
for(DrawerItem item:items)
{
item.setType(DrawerItemType.STATE_CHECK);
if(item.getPos() == donationId)
{
item.setSelected(!item.isSelected());
}
}
DrawerAdapter adapter = new DrawerAdapter(getActivity(),R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
}
public void addDonation()
{
AddDonationDialog dialog = new AddDonationDialog();
Bundle bundle = new Bundle();
bundle.putInt("siteId", -1);
dialog.setArguments(bundle);
dialog.setListener(new NewDonationListener() {
@Override
public void needUpdate() {
updateDonationList();
}
});
dialog.show(getFragmentManager(), "add donation dialog");
}
public void askRemoveDonation()
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.delete_donation_message)
.setCancelable(false)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
removeSelectedDonation();
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void removeSelectedDonation()
{
List<Donation> deletedList = new ArrayList<>();
for(int i = 0; i<items.size(); i++)
{
DrawerItem item = items.get(i);
if(item.isSelected())
{
deletedList.add(donations.get(i));
}
}
Database.getInstance(getActivity()).deleteDonation(deletedList);
listener.selectionModeChange(null);
updateDonationList();
}
private void updateDonationList()
{
donations = Database.getInstance(getActivity()).getDonations();
items.clear();
for(Donation don : donations)
{
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault());
df.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
String texte = df.format(don.getDate().getTime());
texte += " - ";
texte += don.getCityName();
if(don.getCityName().length() > 0)
texte += " - ";
switch(don.getDonationType())
{
case TOTAL_BLOOD:
texte += getResources().getStringArray(R.array.donation_type)[0];
break;
case PLASMA:
texte += getResources().getStringArray(R.array.donation_type)[1];
break;
case PLATELET:
texte += getResources().getStringArray(R.array.donation_type)[2];
break;
default:
//do nothing
break;
}
DrawerItem item = new DrawerItem(DrawerItemType.STATE_NORMAL, texte);
items.add(item);
}
DrawerAdapter adapter = new DrawerAdapter(getActivity(),R.layout.drawer_item, 0, items);
donation_list.setAdapter(adapter);
}
public void cancelDeletionMode() {
if(isOnSelection)
listener.selectionModeChange(null);
}
public void setOnDeletionModeChange(OnDeletionModeListener onDeletionModeChange) {
this.onDeletionModeChange = onDeletionModeChange;
}
public boolean isInDeletionMode() {
return isOnSelection;
}
public interface OnDeletionModeListener {
void onDeleteModeChange(boolean activeDelete);
}
}

View File

@ -0,0 +1,62 @@
package fr.mobdev.blooddonation.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.HashMap;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.R;
public class DonationInfoFragment extends Fragment {
public DonationInfoFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.donation_info,container,false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View v = getView();
assert v != null;
HashMap<String, Object> maps = Database.getInstance(getActivity()).getUserInformation();
String userName = (String) maps.get("UserName");
String blood = (String) maps.get("BloodGroup");
String city = (String) maps.get("CityName");
int D = (Integer) maps.get("D");
int C = (Integer) maps.get("C");
int E = (Integer) maps.get("E");
int c = (Integer) maps.get("c");
int e = (Integer) maps.get("e");
int K = (Integer) maps.get("K");
TextView view = v.findViewById(R.id.user_name);
view.setText(userName);
view = v.findViewById(R.id.blood_group);
view.setText(blood);
view = v.findViewById(R.id.city_name);
view.setText(city);
view = v.findViewById(R.id.rhesus);
String rhesus = "D" + getStringFor(D) +" C" + getStringFor(C) +" E"+ getStringFor(E) +" c"+ getStringFor(c) +" e" + getStringFor(e) + " K"+getStringFor(K);
view.setText(rhesus);
}
private String getStringFor(int plus)
{
if(plus == 0)
return "-";
else
return "+";
}
}

View File

@ -0,0 +1,146 @@
package fr.mobdev.blooddonation.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.R;
public class InformationFragment extends Fragment {
private boolean modify;
private InformationListener informationListener;
public InformationFragment() {
}
public static InformationFragment newInstance(boolean modify, InformationListener listener) {
InformationFragment fragment = new InformationFragment();
fragment.modify = modify;
fragment.informationListener = listener;
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.init_view,container,false);
Button bt = view.findViewById(R.id.validate_button);
CheckedTextView dView = view.findViewById(R.id.blood_view_D);
CheckedTextView majCView = view.findViewById(R.id.blood_view_C);
CheckedTextView majEView = view.findViewById(R.id.blood_view_E);
CheckedTextView minCView = view.findViewById(R.id.blood_view_c);
CheckedTextView minEView = view.findViewById(R.id.blood_view_e);
CheckedTextView kView = view.findViewById(R.id.blood_view_K);
final View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
CheckedTextView view = (CheckedTextView) v;
view.setChecked(!view.isChecked());
}
};
if(modify)
{
HashMap<String, Object> map = Database.getInstance(container.getContext()).getUserInformation();
Spinner blood_view = view.findViewById(R.id.blood_spinner);
List<String> group_array = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.blood_array)));
String bloodGroup = (String)map.get("BloodGroup");
blood_view.setSelection(group_array.indexOf(bloodGroup));
Spinner gender_view = view.findViewById(R.id.gender_spinner);
EditText name_view = view.findViewById(R.id.name_text);
name_view.setText((String)map.get("UserName"));
EditText city_name_view = view.findViewById(R.id.city_text);
city_name_view.setText((String)map.get("CityName"));
EditText postal_code_view = view.findViewById(R.id.postal_text);
postal_code_view.setText((String)map.get("Postal"));
dView.setChecked((Integer)map.get("D") != 0);
majCView.setChecked((Integer)map.get("C") != 0);
majEView.setChecked((Integer)map.get("E") != 0);
minCView.setChecked((Integer)map.get("c") != 0);
minEView.setChecked((Integer)map.get("e") != 0);
kView.setChecked((Integer)map.get("K") != 0);
int gender = 0;
if (map.get("Gender").equals(0))
gender = 1;
gender_view.setSelection(gender);
}
dView.setOnClickListener(listener);
majCView.setOnClickListener(listener);
majEView.setOnClickListener(listener);
minCView.setOnClickListener(listener);
minEView.setOnClickListener(listener);
kView.setOnClickListener(listener);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Spinner blood_view = view.findViewById(R.id.blood_spinner);
Spinner gender_view = view.findViewById(R.id.gender_spinner);
EditText name_view = view.findViewById(R.id.name_text);
EditText city_name_view = view.findViewById(R.id.city_text);
EditText postal_code_view = view.findViewById(R.id.postal_text);
CheckedTextView dView = view.findViewById(R.id.blood_view_D);
CheckedTextView majCView = view.findViewById(R.id.blood_view_C);
CheckedTextView majEView = view.findViewById(R.id.blood_view_E);
CheckedTextView minCView = view.findViewById(R.id.blood_view_c);
CheckedTextView minEView = view.findViewById(R.id.blood_view_e);
CheckedTextView kView = view.findViewById(R.id.blood_view_K);
String blood = blood_view.getSelectedItem().toString();
String gender = gender_view.getSelectedItem().toString();
boolean isMale;
isMale = gender.equals(getResources().getStringArray(R.array.gender_array)[0]);
String name = name_view.getText().toString();
String city = city_name_view.getText().toString();
String postal = postal_code_view.getText().toString();
Database.getInstance(container.getContext()).updateUserInfo(
name, isMale, city, postal, blood, dView.isChecked(),
majCView.isChecked(), majEView.isChecked(),
minCView.isChecked(), minEView.isChecked(),
kView.isChecked());
informationListener.onValidate();
}
});
// TODO HIDE keyboard
// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
return view;
}
public interface InformationListener {
void onValidate();
}
}

View File

@ -0,0 +1,22 @@
package fr.mobdev.blooddonation.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import fr.mobdev.blooddonation.R;
public class LicencesFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.licence, container, false);
}
}

View File

@ -0,0 +1,513 @@
package fr.mobdev.blooddonation.fragment;
import android.Manifest;
import android.app.Fragment;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.util.LongSparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.car2go.maps.AnyMap;
import com.car2go.maps.OnMapReadyCallback;
import com.car2go.maps.model.CameraPosition;
import com.car2go.maps.model.LatLng;
import com.car2go.maps.model.LatLngBounds;
import com.car2go.maps.model.Marker;
import com.car2go.maps.model.MarkerOptions;
import com.car2go.maps.osm.BitmapDescriptorFactory;
import com.car2go.maps.osm.MapView;
import com.car2go.maps.osm.CameraUpdateFactory;
import com.car2go.maps.osm.MapsConfiguration;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.NetworkListener;
import fr.mobdev.blooddonation.NetworkManager;
import fr.mobdev.blooddonation.R;
import fr.mobdev.blooddonation.RegisterListener;
import fr.mobdev.blooddonation.dialog.ConfirmDialog;
import fr.mobdev.blooddonation.dialog.InformationDialog;
import fr.mobdev.blooddonation.enums.Country;
import fr.mobdev.blooddonation.enums.SiteType;
import fr.mobdev.blooddonation.objects.BloodSite;
import fr.mobdev.blooddonation.service.AlarmReceiver;
import fr.mobdev.blooddonation.service.BootReceiver;
import static android.content.Context.LOCATION_SERVICE;
public class MapsFragment extends Fragment implements OnMapReadyCallback {
private AnyMap map;
private LocationListener locationListener;
private Geocoder coder;
private Integer postCode;
private LatLng previousLocation;
private float previousZoom;
private MapView mapView;
private Country country;
private Map<Country, LatLng> countryMap;
private LongSparseArray<Marker> markerList;
private boolean isFirstLocation;
private List<BloodSite> siteList;
private long selectedSite;
private Marker userCenter;
private PostCodeUpdateListener postCodeUpdateListener;
private ImageButton myLocationBt;
private Location myLocation;
NetworkListener listener = new NetworkListener() {
@Override
public void bloodSiteListChanged(final List<BloodSite> sites) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Database.getInstance(getActivity()).addSitesToDb(sites);
AlarmReceiver.prepareNotifications(getActivity());
addSitesOnMap();
}
});
}
};
public void setPostCodeUpdateListener(PostCodeUpdateListener postCodeUpdateListener) {
this.postCodeUpdateListener = postCodeUpdateListener;
}
private enum CORNER {
TOP_RIGHT, BOT_LEFT, BOT_RIGHT
}
public MapsFragment() {
}
public static MapsFragment newInstance(PostCodeUpdateListener postCodeUpdateListener) {
MapsFragment mapsFragment = new MapsFragment();
mapsFragment.setPostCodeUpdateListener(postCodeUpdateListener);
return mapsFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
countryMap = new HashMap<>();
buildCountryMap();
country = Country.FRANCE;
selectedSite = -1;
userCenter = null;
if (savedInstanceState != null) {
isFirstLocation = savedInstanceState.getBoolean("isFirstLocation");
final double latitude = savedInstanceState.getDouble("locationLatitude");
final double longitude = savedInstanceState.getDouble("locationLongitude");
final float zoom = savedInstanceState.getFloat("locationZoom");
postCode = savedInstanceState.getInt("posteCode");
previousLocation = new LatLng(latitude,longitude);
previousZoom = zoom;
} else {
isFirstLocation = true;
postCode = -1;
previousZoom = 14;
previousLocation = countryMap.get(country);
}
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
myLocation = location;
myLocationBt.setVisibility(View.VISIBLE);
if(map != null) {
if(userCenter != null)
userCenter.remove();
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(location.getLatitude(),location.getLongitude()))
.icon(BitmapDescriptorFactory.getInstance().fromResource(R.drawable.userlocation));
userCenter = map.addMarker(markerOptions);
}
Database.getInstance(getActivity()).updateUserLoc(location.getLatitude(), location.getLongitude());
try {
List<Address> addrList = coder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);
for (Address addr : addrList) {
if (addr != null && addr.getPostalCode() != null) {
Integer code = Integer.valueOf(addr.getPostalCode());
int original = (code - (code % 1000)) / 1000;
if (original == 97) {
postCode = (code - (code % 100)) / 100;
postCodeUpdateListener.onPostCodeChange(postCode);
break;
} else if (original > 0 && original < 96) {
postCode = (code - (code % 1000)) / 1000;
postCodeUpdateListener.onPostCodeChange(postCode);
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
if (isFirstLocation) {
map.moveCamera(CameraUpdateFactory.getInstance().newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()),14));
isFirstLocation = false;
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
//TODO Handle
}
@Override
public void onProviderDisabled(String s) {
}
};
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.map, container, false);
final LinearLayout layout = v.findViewById(R.id.info_window);
layout.setVisibility(View.GONE);
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(selectedSite == -1)
return;
InformationDialog dialog = new InformationDialog();
Bundle args = new Bundle();
args.putLong("siteId", selectedSite);
dialog.setArguments(args);
dialog.show(getFragmentManager(), "information dialog");
layout.setVisibility(View.GONE);
}
});
myLocationBt = v.findViewById(R.id.move_to_user_location);
myLocationBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(map != null) {
map.animateCamera(CameraUpdateFactory.getInstance().newLatLngZoom(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()),14));
}
}
});
myLocationBt.setVisibility(View.GONE);
return v;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
MapsConfiguration.getInstance().initialize(getActivity());
mapView = view.findViewById(R.id.maps_mv_map);
mapView.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
mapView.getMapAsync(this);
}
@Override
public void onDestroyView() {
super.onDestroyView();
mapView = null;
map = null;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults[0] == PackageManager.PERMISSION_GRANTED || grantResults[1] == PackageManager.PERMISSION_GRANTED) {
startUpdateLocations();
}
}
public void startUpdateLocations() {
if(getActivity() == null)
return;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean use_localisation = !prefs.getBoolean("deactivate_localisation", false);
if(!use_localisation) {
stopUpdateLocations();
return;
}
LocationManager manager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};
ActivityCompat.requestPermissions(getActivity(),permissions,1);
} else {
if (!prefs.getBoolean("wifi_only", false))
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 600000, 50, locationListener);
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 600000, 50, locationListener);
}
}
private void stopUpdateLocations() {
LocationManager manager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE);
if (locationListener != null)
manager.removeUpdates(locationListener);
}
@Override
public void onPause() {
super.onPause();
if(mapView != null)
mapView.onPause();
if(map != null)
stopUpdateLocations();
myLocationBt.setVisibility(View.GONE);
}
@Override
public void onResume() {
super.onResume();
if(mapView != null)
mapView.onResume();
if(map != null)
startUpdateLocations();
}
@Override
public void onDestroy() {
super.onDestroy();
if(mapView != null)
mapView.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(mapView != null) {
mapView.onSaveInstanceState(outState);
}
}
@Override
public void onMapReady(AnyMap anyMap) {
map = anyMap;
startUpdateLocations();
country = Country.FRANCE;
countryMap = new HashMap<>();
markerList = new LongSparseArray<>();
buildCountryMap();
map.setOnCameraChangeListener(new AnyMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
previousZoom = cameraPosition.zoom;
previousLocation = cameraPosition.target;
loadData();
}
});
map.setOnMarkerClickListener(new AnyMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if(marker == userCenter)
return false;
View v = getView();
assert v != null;
LinearLayout layout = v.findViewById(R.id.info_window);
layout.setVisibility(View.VISIBLE);
int idx = markerList.indexOfValue(marker);
long id = markerList.keyAt(idx);
selectedSite = id;
BloodSite infoSite = null;
for(BloodSite site : siteList) {
if(site.getDbId() == id) {
infoSite = site;
break;
}
}
if(infoSite == null)
return false;
TextView tv = v.findViewById(R.id.info_title);
tv.setText(infoSite.getCityName());
tv = v.findViewById(R.id.info_snippet);
if (infoSite.getDate() != null) {
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
df.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
tv.setText(df.format(infoSite.getDate().getTime()));
tv.setVisibility(View.VISIBLE);
} else {
tv.setVisibility(View.GONE);
}
return true;
}
});
map.setOnMapClickListener(new AnyMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
View v = getView();
assert v != null;
LinearLayout layout = v.findViewById(R.id.info_window);
layout.setVisibility(View.GONE);
selectedSite = -1;
}
});
startUpdateLocations();
initPosition();
BootReceiver.startNextChecking(getActivity(), false);
}
private LatLng getCorner(CORNER corner) {
com.car2go.maps.Projection pr = map.getProjection();
LatLngBounds bounds = pr.getVisibleRegion().latLngBounds;
if(corner == CORNER.TOP_RIGHT)
return bounds.northeast;
else if(corner == CORNER.BOT_LEFT)
return bounds.southwest;
else if (corner == CORNER.BOT_RIGHT)
return new LatLng(bounds.southwest.latitude,bounds.northeast.longitude);
else
return new LatLng(bounds.northeast.latitude,bounds.southwest.longitude);
}
private void checkPastDonation() {
BloodSite site = Database.getInstance(getActivity()).getPastUnregisteredDonation();
if (site != null) {
ConfirmDialog dialog = new ConfirmDialog();
Bundle args = new Bundle();
args.putLong("siteId", site.getDbId());
dialog.setArguments(args);
dialog.setRegisterListener(new RegisterListener() {
@Override
public void processNewRegistration() {
checkPastDonation();
}
});
dialog.show(getFragmentManager(),"ConfirmationDialogInformation");
}
}
private void loadData() {
LatLng NECorner = getCorner(CORNER.TOP_RIGHT);
LatLng SWCorner = getCorner(CORNER.BOT_LEFT);
NetworkManager.getInstance(listener, getActivity()).loadFromNet(country, NECorner, SWCorner);
addSitesOnMap();
}
private void addSitesOnMap() {
LatLng top_right = getCorner(CORNER.TOP_RIGHT);
LatLng bot_left = getCorner(CORNER.BOT_LEFT);
siteList = Database.getInstance(getActivity()).getBloodSites(top_right,bot_left);
// clean marker that will not be anymore on maps
List<Long> idList = new ArrayList<>();
for (BloodSite site : siteList) {
idList.add(site.getDbId());
}
List<Long> idToRemove = new ArrayList<>();
for (int i = 0; i < markerList.size(); i++) {
if (!idList.contains(markerList.keyAt(i))) {
idToRemove.add(markerList.keyAt(i));
}
}
for (Long id : idToRemove) {
Marker marker = markerList.get(id);
marker.remove();
markerList.delete(id);
}
for (BloodSite site : siteList) {
if (markerList.indexOfKey(site.getDbId()) < 0) {
MarkerOptions options = new MarkerOptions();
options.position(new LatLng(site.getLoc().latitude, site.getLoc().longitude));
int res;
if (site.getCountry() == Country.FRANCE) {
if (site.getType().equals(SiteType.efs))
res = R.drawable.efs;
else if (site.getType().equals(SiteType.mobile_blood))
res = R.drawable.blood;
else if (site.getType().equals(SiteType.mobile_plasma))
res = R.drawable.plasma;
else
res = R.drawable.mixed;
options.icon(BitmapDescriptorFactory.getInstance().fromResource(res));
}
markerList.put(site.getDbId(),map.addMarker(options));
}
}
}
private void buildCountryMap() {
countryMap.put(Country.FRANCE, new LatLng(47.084444, 2.396389));
}
private void initPosition() {
//
LatLng loc = Database.getInstance(getActivity()).getUserLastLocation();
if(!loc.equals(new LatLng(0,0)))
{
map.moveCamera(CameraUpdateFactory.getInstance().newLatLngZoom(new LatLng(loc.latitude,loc.longitude),14));
}
else
{
map.moveCamera(CameraUpdateFactory.getInstance().newLatLngZoom(previousLocation,previousZoom));
}
coder = new Geocoder(getActivity());
loadData();
checkPastDonation();
}
public interface PostCodeUpdateListener {
void onPostCodeChange(int postcode);
}
}

View File

@ -0,0 +1,108 @@
package fr.mobdev.blooddonation.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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 NotificationFragment extends Fragment{
private List<Long> notificationsIds;
private List<Long> readedNotifications;
public NotificationFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.notifications,container,false);
notificationsIds = new ArrayList<>();
readedNotifications = new ArrayList<>();
buildListView(v);
ListView view = v.findViewById(R.id.notifications_list);
view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, 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(getFragmentManager(), "information dialog");
notificationsIds.remove(id);
readedNotifications.add(siteId);
}
else
{
readedNotifications.addAll(notificationsIds);
Database.getInstance(getActivity()).skipNotifications(readedNotifications);
buildListView(v);
}
}
});
return v;
}
@Override
public void onDestroy()
{
Database.getInstance(getActivity()).skipNotifications(readedNotifications);
super.onDestroy();
}
private void buildListView(View v)
{
if(v == null)
return;
notificationsIds.clear();
ListView view = v.findViewById(R.id.notifications_list);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),R.layout.simple_list_item);
Comparator<BloodSite> compareDate = new Comparator<BloodSite>() {
@Override
public int compare(BloodSite lhs, BloodSite rhs) {
return lhs.getDate().compareTo(rhs.getDate());
}
};
List<BloodSite> notifications = Database.getInstance(getActivity()).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);
}
}

View File

@ -1,11 +1,11 @@
package fr.mobdev.blooddonation;
package fr.mobdev.blooddonation.fragment;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import fr.mobdev.blooddonation.activity.MainActivity;
import android.content.Intent;
import fr.mobdev.blooddonation.Database;
import fr.mobdev.blooddonation.R;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.location.Address;
@ -17,6 +17,15 @@ import android.preference.PreferenceFragment;
public class PrefFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
private OnEditPersonnalInfoListener onEditPersonnalInfoListener;
public static PrefFragment newInstance(OnEditPersonnalInfoListener personnalInfoListener) {
PrefFragment fragment = new PrefFragment();
fragment.setOnEditPersonnalInfoListener(personnalInfoListener);
return fragment;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
@ -26,9 +35,7 @@ public class PrefFragment extends PreferenceFragment implements OnSharedPreferen
@Override
public boolean onPreferenceClick(Preference preference) {
Intent newIntent = new Intent(getActivity(), MainActivity.class);
newIntent.putExtra("modify", true);
startActivity(newIntent);
onEditPersonnalInfoListener.onEditPesonnalInfoClick();
return true;
}
});
@ -44,7 +51,6 @@ public class PrefFragment extends PreferenceFragment implements OnSharedPreferen
@Override
public void run() {
// TODO Auto-generated method stub
//update user location to the location in his profile
HashMap<String,Object> userData = Database.getInstance(getActivity()).getUserInformation();
Geocoder coder = new Geocoder(getActivity());
@ -57,7 +63,6 @@ public class PrefFragment extends PreferenceFragment implements OnSharedPreferen
Database.getInstance(getActivity()).updateUserLoc(addr.get(0).getLatitude(), addr.get(0).getLongitude());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@ -67,4 +72,12 @@ public class PrefFragment extends PreferenceFragment implements OnSharedPreferen
}
public void setOnEditPersonnalInfoListener(OnEditPersonnalInfoListener onEditPersonnalInfoListener) {
this.onEditPersonnalInfoListener = onEditPersonnalInfoListener;
}
public interface OnEditPersonnalInfoListener {
void onEditPesonnalInfoClick();
}
}

View File

@ -4,6 +4,8 @@ import java.util.Calendar;
import android.location.Location;
import com.car2go.maps.model.LatLng;
import fr.mobdev.blooddonation.enums.Country;
import fr.mobdev.blooddonation.enums.SiteType;
@ -12,7 +14,7 @@ public class BloodSite {
private long dbId; //id in application database
private long siteId; //obtain with c_id
private SiteType type;//obtain by parsing icon (verify that there's no solution unknown and that give the real answer)
private LatiLng loc;//obtain with lat and lon
private LatLng loc;//obtain with lat and lon
private Calendar date;//obtain with c_date
private String siteName; //obtain with lp_libconv
private String address;//obtain by parsing text
@ -59,7 +61,7 @@ public class BloodSite {
this.mail = mail;
}
public void setLoc(LatiLng latLng) {
public void setLoc(LatLng latLng) {
loc = latLng;
}
@ -67,7 +69,7 @@ public class BloodSite {
this.type = type;
}
public LatiLng getLoc()
public LatLng getLoc()
{
return loc;
}

View File

@ -1,41 +0,0 @@
package fr.mobdev.blooddonation.objects;
public class LatiLng {
public double latitude;
public double longitude;
public LatiLng(double lat,double longi){
latitude = lat;
longitude = longi;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(latitude);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(longitude);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LatiLng other = (LatiLng) obj;
if (Double.doubleToLongBits(latitude) != Double
.doubleToLongBits(other.latitude))
return false;
if (Double.doubleToLongBits(longitude) != Double
.doubleToLongBits(other.longitude))
return false;
return true;
}
}

View File

@ -15,7 +15,7 @@ import fr.mobdev.blooddonation.activity.MainActivity;
import fr.mobdev.blooddonation.enums.Country;
import fr.mobdev.blooddonation.enums.SiteType;
import fr.mobdev.blooddonation.objects.BloodSite;
import fr.mobdev.blooddonation.objects.LatiLng;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
@ -29,12 +29,14 @@ import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import com.car2go.maps.model.LatLng;
public class AlarmReceiver extends BroadcastReceiver {
private static final long two_month_millis = 5184000000L;
private int NOTIFICATION = R.string.app_name;
private static List<BloodSite> newSite = new ArrayList<BloodSite>();
private static List<LatiLng> NECornerList = new ArrayList<LatiLng>();
private static List<BloodSite> newSite = new ArrayList<>();
private static List<LatLng> NECornerList = new ArrayList<>();
@Override
public void onReceive(Context context, Intent intent) {
if(NECornerList.size() > 0)
@ -65,7 +67,7 @@ public class AlarmReceiver extends BroadcastReceiver {
for(BloodSite site: newSite)
{
String text = new String();
String text="";
Calendar today = Calendar.getInstance();
today.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
today.set(Calendar.HOUR_OF_DAY, 0);
@ -123,7 +125,7 @@ public class AlarmReceiver extends BroadcastReceiver {
private void CheckDonation(final Context context)
{
LatiLng loc = Database.getInstance(context).getUserLastLocation();
LatLng loc = Database.getInstance(context).getUserLastLocation();
populateNeCornerList(loc,context);
NetworkListener listener = new NetworkListener() {
@ -137,8 +139,8 @@ public class AlarmReceiver extends BroadcastReceiver {
if(NECornerList.size() > 0)
{
LatiLng NECorner = NECornerList.get(0);
LatiLng SWCorner = new LatiLng(NECorner.latitude - 0.1, NECorner.longitude - 0.1);
LatLng NECorner = NECornerList.get(0);
LatLng SWCorner = new LatLng(NECorner.latitude - 0.1, NECorner.longitude - 0.1);
NetworkManager.getInstance(this, context).loadFromNet(Country.FRANCE, NECorner, SWCorner);
NECornerList.remove(0);
}
@ -146,8 +148,8 @@ public class AlarmReceiver extends BroadcastReceiver {
};
if(NECornerList.size() > 0)
{
LatiLng NECorner = NECornerList.get(0);
LatiLng SWCorner = new LatiLng(NECorner.latitude - 0.1, NECorner.longitude - 0.1);
LatLng NECorner = NECornerList.get(0);
LatLng SWCorner = new LatLng(NECorner.latitude - 0.1, NECorner.longitude - 0.1);
NetworkManager.getInstance(listener, context).loadFromNet(Country.FRANCE, NECorner, SWCorner);
NECornerList.remove(0);
}
@ -165,7 +167,7 @@ public class AlarmReceiver extends BroadcastReceiver {
checkForProximity(sites, context);
checkForDate(sites, context);
List<Long> notifications = Database.getInstance(context).getAllNotifications();
List<Long> newNotifications = new ArrayList<Long>();
List<Long> newNotifications = new ArrayList<>();
for(BloodSite site : sites)
{
if(site.getDate().compareTo(cal) < 0)
@ -253,7 +255,7 @@ public class AlarmReceiver extends BroadcastReceiver {
}*/
private static void checkForDate(List<BloodSite> sites, Context context) {
List<BloodSite> removeList = new ArrayList<BloodSite>();
List<BloodSite> removeList = new ArrayList<>();
for(BloodSite site: sites)
{
Calendar today = Calendar.getInstance();
@ -270,7 +272,7 @@ public class AlarmReceiver extends BroadcastReceiver {
sites.removeAll(removeList);
}
private void populateNeCornerList(LatiLng loc, Context context) {
private void populateNeCornerList(LatLng loc, Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int distanceTo = Integer.parseInt(prefs.getString("distance_to_loc", "5"));
int number = (int)(distanceTo/10.0f*2.0f);
@ -281,8 +283,8 @@ public class AlarmReceiver extends BroadcastReceiver {
{
for(int j = 0; j < number; j++)
{
int lon = 0;
int lat = 0;
int lon;
int lat;
if(i % 2 == 0)
lat = (-number)/2;
else
@ -293,7 +295,7 @@ public class AlarmReceiver extends BroadcastReceiver {
else
lon = (number+1)/2;
NECornerList.add(new LatiLng(lat * 0.1 + loc.latitude, lon * 0.1 + loc.longitude));//0.1° ~= 10km
NECornerList.add(new LatLng(lat * 0.1 + loc.latitude, lon * 0.1 + loc.longitude));//0.1° ~= 10km
}
}
}
@ -302,12 +304,12 @@ public class AlarmReceiver extends BroadcastReceiver {
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int distanceTo = Integer.parseInt(prefs.getString("distance_to_loc", "5"));
LatiLng lat = Database.getInstance(context).getUserLastLocation();
LatLng lat = Database.getInstance(context).getUserLastLocation();
Location loc = new Location("");
loc.setLatitude(lat.latitude);
loc.setLongitude(lat.longitude);
ArrayList<BloodSite> removeList = new ArrayList<BloodSite>();
ArrayList<BloodSite> removeList = new ArrayList<>();
for(BloodSite site : sites)
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

View File

@ -3,7 +3,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
android:orientation="vertical"
>
<TextView
android:id="@+id/textView2"
@ -13,46 +14,18 @@
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center_horizontal"
android:singleLine="false"
android:text="@string/dev_by"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:layout_marginRight="3dp"
android:layout_marginLeft="5dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="5dp"
android:contentDescription="@string/logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/logo"
android:background="@drawable/logo"/>
<!-- <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<TextView
android:id="@+id/mob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/mob"
android:textColor="#ff0000"
android:textSize="50sp"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/dev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dev"
android:textColor="#a0a0a0"
android:textSize="50sp"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout> -->
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
@ -72,18 +45,47 @@
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center_horizontal"
android:singleLine="false"
android:text="@string/launcher"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:layout_marginRight="3dp"
android:layout_marginLeft="5dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="5dp"
android:contentDescription="@string/launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/launcher"
android:background="@drawable/ic_launcher"/>
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="15dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center_horizontal"
android:text="@string/donate"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:layout_marginTop="20dp"
android:src="@drawable/liberapay"
android:id="@+id/donate"
android:contentDescription="@string/liberapay"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/licence"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/licence"
android:textAllCaps="false"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
</LinearLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
android:textColor="@color/colorPrimary"
android:text="@string/app_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
/>
<TextView
android:text="@string/blood_donation_licence"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"/>
<TextView
android:textColor="@color/colorPrimary"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
android:text="@string/anymaps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"/>
<TextView
android:text="@string/anymaps_licence"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".activity.MainActivity"
tools:openDrawer="start"
>
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/history_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"
/>
</android.support.design.widget.AppBarLayout>
<!-- The main content view -->
<RelativeLayout
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:id="@+id/mainview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-7913861416640945/5404600510" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_above="@+id/adView"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
<!-- The navigation drawer -->
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/main_drawer" />
</android.support.v4.widget.DrawerLayout>

View File

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/mainview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-7913861416640945/5404600510" />
<fragment
android:id="@+id/maps_mv_map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/adView"
android:layout_alignParentTop="true"
android:tag="Test" />
</RelativeLayout>
</FrameLayout>
<!-- The navigation drawer -->
<ListView
android:id="@+id/left_drawer"
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.support.v4.widget.DrawerLayout>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.car2go.maps.osm.MapView
android:id="@+id/maps_mv_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ImageButton
android:id="@+id/move_to_user_location"
android:contentDescription="@string/my_location"
android:src="@android:drawable/ic_menu_mylocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
/>
<LinearLayout
android:layout_alignParentBottom="true"
android:orientation="vertical"
android:id="@+id/info_window"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="5dp"
android:background="#FFFFFF"
>
<TextView
android:id="@+id/info_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/info_snippet"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>

View File

@ -9,7 +9,7 @@
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
/>
<Spinner
android:id="@+id/dep_spinner"
@ -17,20 +17,21 @@
android:layout_height="wrap_content"
android:entries="@array/dep_array"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
/>
<TextView
android:id="@+id/number_to_call"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:autoLink="phone"
/>
<Spinner
android:id="@+id/number_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
/>
</LinearLayout>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_del"
android:icon="@drawable/ic_action_delete"
android:title="@string/action_del"
android:showAsAction="ifRoom"/>
<item android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="@string/action_add"
android:showAsAction="ifRoom"/>
</menu>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/action_help"
android:icon="@drawable/what"
android:title="@string/action_help"
android:showAsAction="ifRoom"/>
</menu>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_data_displayed"
android:title="@string/blood_donation"
>
<menu>
<item
android:id="@+id/nav_my_donation"
android:title="@string/donations"
app:showAsAction="ifRoom"
/>
<item
android:id="@+id/nav_user_information"
android:title="@string/donation_info"
app:showAsAction="ifRoom"
/>
</menu>
</item>
<item
android:id="@+id/nav_tools"
android:title="@string/tools"
>
<menu>
<item
android:id="@+id/nav_legend"
android:title="@string/legend"
app:showAsAction="ifRoom"
/>
<item
android:id="@+id/nav_preferences"
android:title="@string/preference"
app:showAsAction="ifRoom"
/>
</menu>
</item>
<item
android:id="@+id/nav_contacts"
android:title="@string/contacts"
>
<menu>
<item
android:id="@+id/nav_post_don"
android:title="@string/post_numbers"
app:showAsAction="ifRoom"
/>
<item
android:id="@+id/nav_about"
android:title="@string/about"
app:showAsAction="ifRoom"
/>
</menu>
</item>
</menu>

View File

@ -1,8 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_notif"
android:icon="@drawable/notif"
android:title="@string/action_notif"
android:showAsAction="ifRoom"
app:showAsAction="ifRoom"
/>
<item android:id="@+id/action_help"
android:icon="@drawable/what"
android:title="@string/action_help"
app:showAsAction="ifRoom"
/>
<item android:id="@+id/action_del"
android:icon="@drawable/ic_action_delete"
android:title="@string/action_del"
app:showAsAction="ifRoom"
/>
<item android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="@string/action_add"
app:showAsAction="ifRoom"
/>
</menu>

View File

@ -1,11 +0,0 @@
<resources>
<!--
Base application theme for API 11+. This theme completely replaces
AppBaseTheme from res/values/styles.xml on API 11+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
<!-- API 11 theme customizations can go here. -->
</style>
</resources>

View File

@ -1,12 +0,0 @@
<resources>
<!--
Base application theme for API 14+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 14+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
</style>
</resources>

View File

@ -0,0 +1,8 @@
<resources>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>

View File

@ -0,0 +1,9 @@
<resources>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:titleTextColor">@android:color/black</item>
</style>
</resources>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#861416</color>
<color name="colorPrimaryDark">#CC6467</color>
<color name="colorAccent">#A2181A</color>
</resources>

View File

@ -19,7 +19,7 @@
<string name="contacts">Contacts</string>
<string name="post_numbers">Numéros post don</string>
<string name="about">À propos</string>
<string name="dev_by">Cette application a été développé par</string>
<string name="dev_by">Cette application a été développée par</string>
<string name="mob">MOB</string>
<string name="dev"> DEV</string>
<string name="web_url">http://mob-dev.fr</string>
@ -33,7 +33,7 @@
<string name="legend_plasma">Collecte de plasma</string>
<string name="legend_mixed">Collecte de sang et plasma</string>
<string name="close">Fermer</string>
<string name="change_region">Changer le département</string>
<string name="change_region">Autre département</string>
<string name="fix_region">Figer le choix du département</string>
<string name="no_phone_available">Aucun numéro n\'existe pour ce département, merci de sélectionner un autre département proche de chez vous.</string>
<string name="call">Appeler</string>
@ -57,7 +57,7 @@
<string name="confirm_donation">Confirmer</string>
<string name="confirm_title">Confirmation de don</string>
<string name="go_iti">Itinéraire</string>
<string name="add_agenda">Ajouter à l\'agenda</string>
<string name="add_agenda">Agenda</string>
<string name="details">Information</string>
<string name="address">Adresse</string>
<string name="info_title">Vos informations</string>
@ -71,7 +71,7 @@
<string name="distance_to_sum">Distance maximum entre l\'utilisateur et le centre de don utilisé pour la notification</string>
<string name="service_activ">Activer le service</string>
<string name="service_activ_sum">Le service est actif pour obtenir les lieux de don sans action de l\'utilisateur</string>
<string name="notif_title">Notification</string>
<string name="notif_title">Notifications</string>
<string name="service_title">Service</string>
<string name="localisation_title">Localisation</string>
<string name="deactivate_localisation_sum">Désactiver la localisation et utiliser la ville définie dans les informations donneur</string>
@ -81,6 +81,15 @@
<string name="show_all">Voir tout</string>
<string name="no_notif">Pas de Notifications</string>
<string name="clear">Supprimer tout</string>
<string name="title_activity_notifications">Centre de Notification</string>
<string name="liberapay">Lien vers la page pour soutenir le développement de l\'application https://liberapay.com/Schoumi</string>
<string name="licence">Licences</string>
<string name="donate">Pour soutenir le développement de l\'application, vous pouvez donner grâce à liberapay</string>
<string name="anymaps">AnyMaps</string>
<string name="anymaps_licence">Copyright 2017 car2go group GmbH\nReleased under the MIT license.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
<string name="blood_donation_licence">Copyright © 2017 Anthony Chomienne, anthony@mobdev.fr\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301, USA.</string>
<string name="my_location">Centrer sur ma position</string>
<string-array name="gender_array">
<item>Homme</item>
@ -211,9 +220,4 @@
<item>Don de plasma</item>
<item>Don de plaquette</item>
</string-array>
<string name="title_activity_notifications">Centre de Notification</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>

View File

@ -1,20 +1,19 @@
<resources>
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>
</resources>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--Replace placeholder ID with your tracking ID-->
<string name="ga_trackingId">UA-53500825-1</string>
<!--Enable automatic activity tracking-->
<bool name="ga_autoActivityTracking">true</bool>
<!--Enable automatic exception tracking-->
<bool name="ga_reportUncaughtExceptions">true</bool>
<bool name="ga_anonymizeIp">true</bool>
<screenName name="fr.mobdev.blooddonation.activity.MainActivity">MainActivity</screenName>
<screenName name="fr.mobdev.blooddonation.activity.DonationActivity">DonationActivity</screenName>
<screenName name="fr.mobdev.blooddonation.activity.DonationInfoActivity">DonationInfoActivity</screenName>
<screenName name="fr.mobdev.blooddonation.activity.AboutActivity">AboutActivity</screenName>
<screenName name="fr.mobdev.blooddonation.activity.PrefsActivity">PrefsActivity</screenName>
</resources>

View File

@ -4,12 +4,13 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
}

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Wed Jun 14 13:37:17 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip