Răsfoiți Sursa

LGM Location updates are now refreshed only while the app is running. The menu entry is hidden if there are no updates.

seavenois 10 ani în urmă
părinte
comite
bf0fa8878b
25 a modificat fișierele cu 174 adăugiri și 159 ștergeri
  1. 1 1
      app/build.gradle
  2. 3 1
      app/src/main/AndroidManifest.xml
  3. 2 2
      app/src/main/java/com/ivalentin/margolariak/ActivityFutureLayout.java
  4. 0 1
      app/src/main/java/com/ivalentin/margolariak/ActivityLayout.java
  5. 0 1
      app/src/main/java/com/ivalentin/margolariak/ActivityPastLayout.java
  6. 1 30
      app/src/main/java/com/ivalentin/margolariak/AlarmReceiver.java
  7. 0 5
      app/src/main/java/com/ivalentin/margolariak/AlbumLayout.java
  8. 0 1
      app/src/main/java/com/ivalentin/margolariak/BlogLayout.java
  9. 0 2
      app/src/main/java/com/ivalentin/margolariak/DownloadImage.java
  10. 6 0
      app/src/main/java/com/ivalentin/margolariak/GM.java
  11. 0 1
      app/src/main/java/com/ivalentin/margolariak/GalleryLayout.java
  12. 9 12
      app/src/main/java/com/ivalentin/margolariak/HomeLayout.java
  13. 2 4
      app/src/main/java/com/ivalentin/margolariak/HomeSectionLocation.java
  14. 3 3
      app/src/main/java/com/ivalentin/margolariak/LablancaLayout.java
  15. 5 12
      app/src/main/java/com/ivalentin/margolariak/LocationLayout.java
  16. 100 51
      app/src/main/java/com/ivalentin/margolariak/MainActivity.java
  17. 1 1
      app/src/main/java/com/ivalentin/margolariak/PostComment.java
  18. 4 3
      app/src/main/java/com/ivalentin/margolariak/ScheduleLayout.java
  19. 4 8
      app/src/main/java/com/ivalentin/margolariak/SettingsActivity.java
  20. 1 1
      app/src/main/java/com/ivalentin/margolariak/Sync.java
  21. 24 12
      app/src/main/res/layout/activity_main.xml
  22. 1 0
      app/src/main/res/layout/fragment_layout_location.xml
  23. 2 2
      app/src/main/res/values-en/strings.xml
  24. 2 2
      app/src/main/res/values-eu-rES/strings.xml
  25. 3 3
      app/src/main/res/values/strings.xml

+ 1 - 1
app/build.gradle

@@ -28,5 +28,5 @@ android {
 dependencies {
     //noinspection GradleDynamicVersion
     compile 'com.google.android.gms:play-services:+'
-    compile 'com.android.support:multidex:1.0.0'
+    compile 'com.android.support:multidex:1.0.1'
 }

+ 3 - 1
app/src/main/AndroidManifest.xml

@@ -62,7 +62,9 @@
             android:screenOrientation="portrait"
             android:label="@string/app_name">
         </activity>
-        
+        <activity android:name=".AboutActivity"/>
+        <activity android:name=".SponsorActivity"/>
+
         <receiver
             android:process=":remote"
             android:name="com.ivalentin.margolariak.AlarmReceiver"/>

+ 2 - 2
app/src/main/java/com/ivalentin/margolariak/ActivityFutureLayout.java

@@ -2,7 +2,6 @@ package com.ivalentin.margolariak;
 
 import android.annotation.SuppressLint;
 import android.app.Dialog;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.PackageManager;
 import android.database.Cursor;
@@ -217,7 +216,8 @@ public class ActivityFutureLayout extends Fragment implements OnMapReadyCallback
      *
      * @param id The event id
      */
-    private void showDialog(final int id){
+    @SuppressWarnings("ConstantConditions")
+	private void showDialog(final int id){
 
         //Create the dialog
         final Dialog dialog = new Dialog(getActivity());

+ 0 - 1
app/src/main/java/com/ivalentin/margolariak/ActivityLayout.java

@@ -2,7 +2,6 @@ package com.ivalentin.margolariak;
 
 
 import android.annotation.SuppressLint;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;

+ 0 - 1
app/src/main/java/com/ivalentin/margolariak/ActivityPastLayout.java

@@ -1,7 +1,6 @@
 package com.ivalentin.margolariak;
 
 import android.annotation.SuppressLint;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;

+ 1 - 30
app/src/main/java/com/ivalentin/margolariak/AlarmReceiver.java

@@ -1,9 +1,5 @@
 package com.ivalentin.margolariak;
 
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Locale;
-
 import android.app.AlarmManager;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
@@ -126,32 +122,6 @@ public class AlarmReceiver extends BroadcastReceiver {
 				Log.e("Notification error", "Error fetching remote file: " + ex.toString());
 			}
     	}
-		
-		//Get location
-		boolean result = false;
-		fu = new FetchURL();
-		fu.Run(GM.SERVER + "/app/location.php");
-		String lat = "", lon = "";
-		String o = fu.getOutput().toString();
-		Log.d("Alarm", "Fetched location");
-		if (o.contains("<location>none</location>"))
-			result = false;
-		if (o.contains("<lat>") && o.contains("<lon>")){
-			lat = o.substring(o.indexOf("<lat>") + 5, o.indexOf("</lat>"));
-			lon = o.substring(o.indexOf("<lon>") + 5, o.indexOf("</lon>"));
-			result = true;
-		}
-
-		SharedPreferences.Editor editor = settings.edit();
-		if (result){
-	    	editor.putLong(GM.PREF_GM_LATITUDE, Double.doubleToLongBits(Double.parseDouble(lat)));
-			editor.putLong(GM.PREF_GM_LONGITUDE, Double.doubleToLongBits(Double.parseDouble(lon)));
-			editor.putString(GM.PREF_GM_LOCATION, new SimpleDateFormat("yyyyMMddHHmmss", Locale.US).format(Calendar.getInstance().getTime()));
-		}
-		else{
-			editor.putString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION);
-		}
-		editor.apply();
 
 		//Perform a background sync
 		new Sync(context).execute();
@@ -175,4 +145,5 @@ public class AlarmReceiver extends BroadcastReceiver {
         PackageManager pm = context.getPackageManager();
         pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);           
     }
+
 }

+ 0 - 5
app/src/main/java/com/ivalentin/margolariak/AlbumLayout.java

@@ -1,17 +1,13 @@
 package com.ivalentin.margolariak;
 
 import android.annotation.SuppressLint;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.os.Build;
 import android.os.Bundle;
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
-import android.os.Environment;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -89,7 +85,6 @@ public class AlbumLayout extends Fragment {
         LayoutInflater factory = LayoutInflater.from(getActivity());
 
         String image;
-		Bitmap bmp;
         Cursor imageCursor = db.rawQuery("SELECT id, title_" + lang + " AS title, file, width, height FROM photo, photo_album WHERE photo = id AND album = " + id + " ORDER BY uploaded DESC;", null);
         while (imageCursor.moveToNext()){
             //Create a new row

+ 0 - 1
app/src/main/java/com/ivalentin/margolariak/BlogLayout.java

@@ -2,7 +2,6 @@ package com.ivalentin.margolariak;
 
 
 import android.annotation.SuppressLint;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;

+ 0 - 2
app/src/main/java/com/ivalentin/margolariak/DownloadImage.java

@@ -1,7 +1,5 @@
 package com.ivalentin.margolariak;
 
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.os.AsyncTask;
 import android.util.Log;
 import android.view.View;

+ 6 - 0
app/src/main/java/com/ivalentin/margolariak/GM.java

@@ -245,6 +245,12 @@ final class GM {
 
 	static final String KEY_PREFERENCE_FEEDBACK = "preference_key_feedback";
 
+	static final int INTERVAL_LOCATION = 240000; //4 min
+
+	static final int INTERVAL_SYNC_FESTIVALS = 600000; //10 min
+
+	static final int INTERVAL_SYNC_NO_FESTIVALS = 3600000; //60 min
+
 	/**
 	 * Name of the database
 	 */

+ 0 - 1
app/src/main/java/com/ivalentin/margolariak/GalleryLayout.java

@@ -2,7 +2,6 @@ package com.ivalentin.margolariak;
 
 
 import android.annotation.SuppressLint;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;

+ 9 - 12
app/src/main/java/com/ivalentin/margolariak/HomeLayout.java

@@ -30,14 +30,11 @@ import android.text.Html;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -141,7 +138,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 
 		//Asynchronously set up location section
 		//This will trigger onLocationChanged, that will trigger setUpLocation
-		new HomeSectionLocation(view, this.getActivity()).execute();
+		new HomeSectionLocation(view).execute();
 
 		//Set up schedule sections
 		setUpSchedule(1, view);
@@ -296,7 +293,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 				section.setOnClickListener(new OnClickListener() {
 					@Override
 					public void onClick(View v) {
-						((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE, false);
+						((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE);
 					}
 				});
 
@@ -304,7 +301,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 				section.setOnClickListener(new OnClickListener() {
 					@Override
 					public void onClick(View v) {
-						((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_SCHEDULE, false);
+						((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_SCHEDULE);
 					}
 				});
 			}
@@ -432,7 +429,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 			llSection.setOnClickListener(new OnClickListener() {
 				@Override
 				public void onClick(View v) {
-					((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA, false);
+					((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA);
 				}
 			});
 
@@ -500,7 +497,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 	 */
 	private boolean setUpLocation(Location location, View view) {
 		SharedPreferences preferences = view.getContext().getSharedPreferences(GM.PREF, Context.MODE_PRIVATE);
-		if (preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION) == false) {
+		if (!preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION)) {
 			try {
 				Double lat = Double.longBitsToDouble(preferences.getLong(GM.PREF_GM_LATITUDE, 0));
 				Double lon = Double.longBitsToDouble(preferences.getLong(GM.PREF_GM_LONGITUDE, 0));
@@ -539,7 +536,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 		llGallery.setOnClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				((MainActivity) getActivity()).loadSection(GM.SECTION_GALLERY, false);
+				((MainActivity) getActivity()).loadSection(GM.SECTION_GALLERY);
 			}
 		});
 
@@ -636,7 +633,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 		llActivitiesPast.setOnClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				((MainActivity) getActivity()).loadSection(GM.SECTION_ACTIVITIES, false);
+				((MainActivity) getActivity()).loadSection(GM.SECTION_ACTIVITIES);
 			}
 		});
 
@@ -782,7 +779,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 			llActivitiesFuture.setOnClickListener(new OnClickListener() {
 				@Override
 				public void onClick(View v) {
-					((MainActivity) getActivity()).loadSection(GM.SECTION_ACTIVITIES, false);
+					((MainActivity) getActivity()).loadSection(GM.SECTION_ACTIVITIES);
 				}
 			});
 
@@ -898,7 +895,7 @@ public class HomeLayout extends Fragment implements LocationListener {
 		llBlog.setOnClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				((MainActivity) getActivity()).loadSection(GM.SECTION_BLOG, false);
+				((MainActivity) getActivity()).loadSection(GM.SECTION_BLOG);
 			}
 		});
 

+ 2 - 4
app/src/main/java/com/ivalentin/margolariak/HomeSectionLocation.java

@@ -26,7 +26,6 @@ class HomeSectionLocation extends AsyncTask<Void, Void, Void> {
 	private boolean isLocationReported;
 	private LatLng coord;
 	private final View view;
-	private final Activity activity;
 
 	/**
 	 * Constructor.
@@ -35,9 +34,8 @@ class HomeSectionLocation extends AsyncTask<Void, Void, Void> {
 	 *
 	 * @see android.widget.ImageView
 	 */
-	public HomeSectionLocation(View v, Activity a) {
+	public HomeSectionLocation(View v) {
 		super();
-		this.activity = a;
 		this.view = v;
 	}
 
@@ -96,7 +94,7 @@ class HomeSectionLocation extends AsyncTask<Void, Void, Void> {
 			section.setOnClickListener(new View.OnClickListener(){
 				@Override
 				public void onClick(View v) {
-					((MainActivity) v.getContext()).loadSection(GM.SECTION_LOCATION, false);
+					((MainActivity) v.getContext()).loadSection(GM.SECTION_LOCATION);
 				}
 			});
 

+ 3 - 3
app/src/main/java/com/ivalentin/margolariak/LablancaLayout.java

@@ -45,7 +45,7 @@ public class LablancaLayout extends Fragment {
 	 * @see android.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
 	 */
 	@Override
-	@SuppressLint("InflateParams")
+	@SuppressLint({"InflateParams", "SwitchIntDef"})
 	@SuppressWarnings("ResultOfMethodCallIgnored")
 	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
@@ -189,14 +189,14 @@ public class LablancaLayout extends Fragment {
 		gmSchedule.setOnClickListener(new View.OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE, false);
+				((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE);
 			}
 		});
 
 		citySchedule.setOnClickListener(new View.OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_SCHEDULE, false);
+				((MainActivity) getActivity()).loadSection(GM.SECTION_LABLANCA_SCHEDULE);
 			}
 		});
 

+ 5 - 12
app/src/main/java/com/ivalentin/margolariak/LocationLayout.java

@@ -42,7 +42,7 @@ public class LocationLayout extends Fragment implements OnMapReadyCallback, Loca
 
 	//The map view
 	private MapView mapView;
-	MarkerOptions moGm;
+	private MarkerOptions moGm;
 
 	private LocationManager locationManager;
 
@@ -221,21 +221,14 @@ public class LocationLayout extends Fragment implements OnMapReadyCallback, Loca
 	public void onLocationChanged(Location location) {
 		//TODO: Read again the GM Location.
 		SharedPreferences preferences = v.getContext().getSharedPreferences(GM.PREF, Context.MODE_PRIVATE);
-		if (preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION) == false) {
+		if (!preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION)) {
 
 			Double lat = Double.longBitsToDouble(preferences.getLong(GM.PREF_GM_LATITUDE, 0));
 			Double lon = Double.longBitsToDouble(preferences.getLong(GM.PREF_GM_LONGITUDE, 0));
 			gmLocation = new LatLng(lat, lon);
-			if (gmLocation != null){
-				calCulateDistance(location);
-				if (moGm != null){
-					moGm.visible(true);
-				}
-			}
-			else{
-				if (moGm != null){
-					moGm.visible(false);
-				}
+						calCulateDistance(location);
+			if (moGm != null){
+				moGm.visible(true);
 			}
 		}
 	}

+ 100 - 51
app/src/main/java/com/ivalentin/margolariak/MainActivity.java

@@ -3,6 +3,9 @@ package com.ivalentin.margolariak;
 import java.io.File;
 import java.math.BigInteger;
 import java.security.SecureRandom;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
 
 import android.app.Activity;
 import android.app.Fragment;
@@ -32,6 +35,7 @@ import android.widget.PopupMenu;
 import android.widget.ProgressBar;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
+import android.os.Handler;
 
 /**
  * The main Activity of the app. It's actually the only activity, and it loads other fragments.
@@ -42,12 +46,59 @@ import android.widget.TextView;
 public class MainActivity extends Activity{
 
 	//Alarm to get location and notifications.
-	private AlarmReceiver alarm;
+	private AlarmReceiver notificationAlarm;
 
 	//The menu entries
-	RelativeLayout menuItem[];
-	TextView menuText[];
-	ImageView menuImage[];
+	private RelativeLayout menuItem[];
+	private TextView menuText[];
+	private ImageView menuImage[];
+
+	//Handler to periodically check for location updates
+	private final Handler locationHandler = new Handler();
+	// Code to check for location updates
+	private final Runnable checkForLocation = new Runnable() {
+		@Override
+		public void run() {
+
+			//Get location page and parse it
+			boolean result = false;
+			FetchURL fu = new FetchURL();
+			fu.Run(GM.SERVER + "/app/location.php");
+			String lat = "", lon = "";
+			String o = fu.getOutput().toString();
+			Log.d("Location", "Fetched location page");
+			if (o.contains("<location>none</location>"))
+				result = false;
+			if (o.contains("<lat>") && o.contains("<lon>")){
+				lat = o.substring(o.indexOf("<lat>") + 5, o.indexOf("</lat>"));
+				lon = o.substring(o.indexOf("<lon>") + 5, o.indexOf("</lon>"));
+				result = true;
+			}
+
+			SharedPreferences settings = getSharedPreferences(GM.PREF, Context.MODE_PRIVATE);
+			SharedPreferences.Editor editor = settings.edit();
+			if (result){
+				editor.putLong(GM.PREF_GM_LATITUDE, Double.doubleToLongBits(Double.parseDouble(lat)));
+				editor.putLong(GM.PREF_GM_LONGITUDE, Double.doubleToLongBits(Double.parseDouble(lon)));
+				editor.putString(GM.PREF_GM_LOCATION, new SimpleDateFormat("yyyyMMddHHmmss", Locale.US).format(Calendar.getInstance().getTime()));
+
+				//Show menu entry
+				if (menuItem[1] != null){
+					menuItem[1].setVisibility(View.VISIBLE);
+				}
+			}
+			else{
+				editor.putString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION);
+				if (menuItem[1] != null){
+					menuItem[1].setVisibility(View.GONE);
+				}
+			}
+			editor.apply();
+
+			//Repeat this the same runnable code block again another th specified interval
+			locationHandler.postDelayed(checkForLocation, GM.INTERVAL_LOCATION);
+		}
+	};
 
 	//Not referenced in code.
 	public void showMenu(View v) {
@@ -91,9 +142,8 @@ public class MainActivity extends Activity{
 	 * Loads a section in the main screen.
 	 * 
 	 * @param section Section identifier {@see GM}
-	 * @param fromSliderMenu Indicates if the call has been made from the slider menu, so it can be closed.
 	 */
-	public void loadSection (byte section, boolean fromSliderMenu){
+	public void loadSection (byte section){
 		FragmentManager fm = MainActivity.this.getFragmentManager();
 		FragmentTransaction ft = fm.beginTransaction();
 		Fragment fragment = null;
@@ -200,7 +250,7 @@ public class MainActivity extends Activity{
 	 * 
 	 * @see android.app.Activity#onCreate(android.os.Bundle)
 	 */
-	@SuppressWarnings("deprecation")
+	@SuppressWarnings("deprecation, ConstantConditions")
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 
@@ -223,9 +273,9 @@ public class MainActivity extends Activity{
 					runOnUiThread(new Runnable() {
 						@Override
 						public void run() {
-							alarm = new AlarmReceiver();
-							alarm.setAlarm(context);
-							alarm.onReceive(context, intent);
+							notificationAlarm = new AlarmReceiver();
+							notificationAlarm.setAlarm(context);
+							notificationAlarm.onReceive(context, intent);
 						}
 					});
 				} catch (InterruptedException e) {
@@ -266,62 +316,40 @@ public class MainActivity extends Activity{
 		menuImage[4] = (ImageView) menuItem[4].findViewById(R.id.iv_menu_blog);
 		menuImage[5] = (ImageView) menuItem[5].findViewById(R.id.iv_menu_gallery);
 
-		//Remove sscrollbars from the sections menu
+		//Remove scrollbars from the sections menu
 		HorizontalScrollView svMenu = (HorizontalScrollView) findViewById(R.id.sv_menu);
 		svMenu.setHorizontalScrollBarEnabled(false);
 
-		//Assign buttons for la blanca submenu
-		TextView menuLablancaItem[] = new TextView[2];
-		//menuLablancaItem[0] = (TextView) findViewById(R.id.menu_lablanca_schedule);
-		//menuLablancaItem[1] = (TextView) findViewById(R.id.menu_lablanca_gm_schedule);
-
 		//Set click listers for menu items
 		menuItem[0].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_HOME, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_HOME); }
 		});
 		menuItem[1].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_LOCATION, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_LOCATION); }
 		});
 		menuItem[2].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_LABLANCA, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_LABLANCA); }
 		});
 		menuItem[3].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_ACTIVITIES, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_ACTIVITIES); }
 		});
 		menuItem[4].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_BLOG, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_BLOG); }
 		});
 		menuItem[5].setOnClickListener(new OnClickListener() {
 			@Override
-			public void onClick(View v) { loadSection(GM.SECTION_GALLERY, true); }
+			public void onClick(View v) { loadSection(GM.SECTION_GALLERY); }
 		});
 
-
+		//Get preferences
 		SharedPreferences preferences = getSharedPreferences(GM.PREF, Context.MODE_PRIVATE);
-		if (preferences.getInt(GM.PREF_DB_FESTIVALS, 0) == 1) {
-			//Show the entries
-			//for (int i = 0; i < 2; i ++){
-			//	menuLablancaItem[i].setVisibility(View.VISIBLE);
-			//}
-		}
-//		menuLablancaItem[0].setOnClickListener(new OnClickListener() {
-//			@Override
-//			public void onClick(View v) {
-//				loadSection(GM.SECTION_LABLANCA_SCHEDULE, true);
-//			}
-//		});
-//
-//		menuLablancaItem[1].setOnClickListener(new OnClickListener() {
-//			@Override
-//			public void onClick(View v) {
-//				loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE, true);
-//			}
-//		});
+
+		//TODO: Read preferences. If there is a recent location, show the menu entry
 
 		//If the user code is not set, generate one
 		if (preferences.getString(GM.USER_CODE, "").length() == 0){
@@ -348,7 +376,7 @@ public class MainActivity extends Activity{
 			sync();
 			
 			//Load initial section
-			loadSection(GM.SECTION_HOME, false);
+			loadSection(GM.SECTION_HOME);
 			
 			//If the intent had extras (from notifications), do something
 			if (actionText != null){
@@ -406,14 +434,14 @@ public class MainActivity extends Activity{
 									@Override
 									public void onClick(View v) {
 										dialog.dismiss();
-										loadSection(GM.SECTION_LABLANCA, false);
+										loadSection(GM.SECTION_LABLANCA);
 									}
 								});
 								break;
 
 							case GM.EXTRA_ACTION_LOCATION:
 
-								if (preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION) == false) {
+								if (!preferences.getString(GM.PREF_GM_LOCATION, GM.DEFAULT_PREF_GM_LOCATION).equals(GM.DEFAULT_PREF_GM_LOCATION)) {
 									//Set up the action button if location is reported
 									btDialogAction.setVisibility(View.VISIBLE);
 									btDialogAction.setText(this.getApplicationContext().getString(R.string.notification_action_location));
@@ -421,7 +449,7 @@ public class MainActivity extends Activity{
 										@Override
 										public void onClick(View v) {
 											dialog.dismiss();
-											loadSection(GM.SECTION_LOCATION, false);
+											loadSection(GM.SECTION_LOCATION);
 										}
 									});
 
@@ -437,7 +465,7 @@ public class MainActivity extends Activity{
 									@Override
 									public void onClick(View v) {
 										dialog.dismiss();
-										loadSection(GM.SECTION_BLOG, false);
+										loadSection(GM.SECTION_BLOG);
 									}
 								});
 								break;
@@ -451,7 +479,7 @@ public class MainActivity extends Activity{
 									@Override
 									public void onClick(View v) {
 										dialog.dismiss();
-										loadSection(GM.SECTION_ACTIVITIES, false);
+										loadSection(GM.SECTION_ACTIVITIES);
 									}
 								});
 								break;
@@ -465,7 +493,7 @@ public class MainActivity extends Activity{
 									@Override
 									public void onClick(View v) {
 										dialog.dismiss();
-										loadSection(GM.SECTION_GALLERY, false);
+										loadSection(GM.SECTION_GALLERY);
 									}
 								});
 								break;
@@ -480,7 +508,7 @@ public class MainActivity extends Activity{
 										@Override
 										public void onClick(View v) {
 											dialog.dismiss();
-											loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE, false);
+											loadSection(GM.SECTION_LABLANCA_GM_SCHEDULE);
 										}
 									});
 								}
@@ -495,7 +523,7 @@ public class MainActivity extends Activity{
 										@Override
 										public void onClick(View v) {
 											dialog.dismiss();
-											loadSection(GM.SECTION_LABLANCA_SCHEDULE, false);
+											loadSection(GM.SECTION_LABLANCA_SCHEDULE);
 										}
 									});
 								}
@@ -590,6 +618,7 @@ public class MainActivity extends Activity{
 	 * A dialog will block the UI. 
 	 * It is intended to be used only when the database is empty.
 	 */
+	@SuppressWarnings("ConstantConditions")
 	private void initialSync(){
 		//Create a dialog
 		Dialog dialog = new Dialog(this);
@@ -633,6 +662,8 @@ public class MainActivity extends Activity{
 		}
 		catch (Exception ex){
 			Log.e("Error going back", "Finishing activity: " + ex.toString());
+			Log.e("RUNNABLE", "Finishing callback for location");
+			locationHandler.removeCallbacks(checkForLocation);
 			finish();
 			//super.onBackPressed();
 		}
@@ -653,5 +684,23 @@ public class MainActivity extends Activity{
 		}
 		return super.onKeyUp(keyCode, event);
 	}
+
+	@Override
+	public void onResume(){
+		locationHandler.post(checkForLocation);
+		super.onResume();
+	}
+
+	@Override
+	public void onPause(){
+		locationHandler.removeCallbacks(checkForLocation);
+		super.onPause();
+	}
+
+	@Override
+	public void onDestroy(){
+		locationHandler.removeCallbacks(checkForLocation);
+		super.onDestroy();
+	}
 	
 }

+ 1 - 1
app/src/main/java/com/ivalentin/margolariak/PostComment.java

@@ -122,7 +122,7 @@ class PostComment extends AsyncTask<String, String, Integer> {
 
             if (code == 200){
                 //Insert into local db
-                SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getDatabasePath(GM.DB_NAME).getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READWRITE);
+                SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getDatabasePath(GM.DB_NAME).getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
                 String table = "";
                 String item = "";
                 switch (type){

+ 4 - 3
app/src/main/java/com/ivalentin/margolariak/ScheduleLayout.java

@@ -18,7 +18,6 @@ import com.google.android.gms.maps.model.MarkerOptions;
 
 import android.annotation.SuppressLint;
 import android.app.Dialog;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface.OnShowListener;
@@ -126,7 +125,7 @@ public class ScheduleLayout extends Fragment implements OnMapReadyCallback{
 
 
 		//Get current date in the same format as retrieved from the database
-		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
 		Date today = Calendar.getInstance().getTime();
 		String curDate = df.format(today);
 
@@ -189,7 +188,8 @@ public class ScheduleLayout extends Fragment implements OnMapReadyCallback{
 	 * Populates the list of activities with the ones n the selected day.
 	 * 
 	 */
-	@SuppressLint("InflateParams") //Views are added from a loop: I can't specify the parent when inflating.
+	@SuppressLint({"InflateParams", "SwitchIntDef"})
+	//Views are added from a loop: I can't specify the parent when inflating.
 	private int populateSchedule() {
 
 		int eventCount = 0;
@@ -373,6 +373,7 @@ public class ScheduleLayout extends Fragment implements OnMapReadyCallback{
 	 * 
 	 * @param id The event id
 	 */
+	@SuppressWarnings("ConstantConditions")
 	private void showDialog(final int id){
 		
 		//Create the dialog

+ 4 - 8
app/src/main/java/com/ivalentin/margolariak/SettingsActivity.java

@@ -1,14 +1,10 @@
 package com.ivalentin.margolariak;
 
-import android.app.Notification;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
-import android.util.Log;
-import android.widget.Toast;
-
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 
@@ -54,13 +50,13 @@ public class SettingsActivity extends PreferenceActivity {
 
 		//Set up Notification preference
 		CheckBoxPreference prefNotification = (CheckBoxPreference) getPreferenceManager().findPreference(GM.KEY_PREFERENCE_NOTIFICATION);
-		if (prefSync.isChecked() == false){
+		if (!prefSync.isChecked()){
 			prefNotification.setEnabled(false);
 		}
 		else {
 			prefNotification.setEnabled(true);
-			if(prefSync.isChecked() == false){
-
+			if(!prefSync.isChecked()){
+				//TODO
 			}
 			if (prefNotification.isChecked()) {
 				prefNotification.setSummary(getString(R.string.preferences_sync_notifications_on));
@@ -85,7 +81,7 @@ public class SettingsActivity extends PreferenceActivity {
 		//Set up data preference
 		long bgData = sp.getLong(GM.STORAGE_TRAFFIC_BG_RECEIVED, 0) + sp.getLong(GM.STORAGE_TRAFFIC_BG_SENT, 0);
 		long fgData = sp.getLong(GM.STORAGE_TRAFFIC_FG_RECEIVED, 0) + sp.getLong(GM.STORAGE_TRAFFIC_FG_SENT, 0);
-		String value = "";
+		String value;
 		if (bgData < 1500){
 			value = bgData + getString(R.string.Kb);
 		}

+ 1 - 1
app/src/main/java/com/ivalentin/margolariak/Sync.java

@@ -108,7 +108,7 @@ class Sync extends AsyncTask<Void, Void, Void> {
 				dial.show();
 			}
 			else{
-				activity.loadSection(GM.SECTION_HOME, false);
+				activity.loadSection(GM.SECTION_HOME);
 			}
 		}
 		Log.d("Sync", "Full sync finished");

+ 24 - 12
app/src/main/res/layout/activity_main.xml

@@ -1,5 +1,7 @@
 <LinearLayout
 	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
 	android:layout_width="match_parent"
 	android:layout_height="fill_parent"
 	android:orientation="vertical">
@@ -59,13 +61,15 @@
 		</LinearLayout>
 
 		<ImageButton
-			android:layout_width="wrap_content"
-			android:layout_height="wrap_content"
-			android:src="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
+			android:layout_width="40dp"
+			android:layout_height="match_parent"
+			android:src="@drawable/ic_expand"
 			android:contentDescription="@string/tutorial_menu"
 			android:onClick="showMenu"
 			android:layout_weight=".2"
-			android:id="@+id/bt_menu"/>
+			android:id="@+id/bt_menu"
+			app:srcCompat="@drawable/ic_expand"
+			android:background="#00000000"/>
 
 		<ProgressBar
 			android:id="@+id/pb_sync"
@@ -87,7 +91,8 @@
 		android:scrollIndicators="none"
 		android:requiresFadingEdge="horizontal"
 		android:fadingEdgeLength="125dp"
-		android:background="@color/background_bar_gradient">
+		android:background="@color/background_bar_gradient"
+		tools:ignore="UnusedAttribute">
 
 		<LinearLayout
 			android:orientation="horizontal"
@@ -125,7 +130,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 			<RelativeLayout
@@ -157,7 +163,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 			<RelativeLayout
@@ -189,7 +196,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 			<RelativeLayout
@@ -221,7 +229,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 			<RelativeLayout
@@ -253,7 +262,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 			<RelativeLayout
@@ -285,7 +295,8 @@
 					android:layout_alignParentEnd="false"
 					android:layout_alignParentLeft="false"
 					android:layout_alignParentRight="false"
-					android:layout_alignParentBottom="true"/>
+					android:layout_alignParentBottom="true"
+					tools:ignore="ContentDescription"/>
 			</RelativeLayout>
 
 		</LinearLayout>
@@ -299,7 +310,8 @@
 		<FrameLayout
 			android:id="@+id/activity_main_content_fragment"
 			android:layout_width="match_parent"
-			android:layout_height="match_parent">
+			android:layout_height="match_parent"
+			tools:ignore="ScrollViewSize">
 
 		</FrameLayout>
 	</ScrollView>

+ 1 - 0
app/src/main/res/layout/fragment_layout_location.xml

@@ -24,6 +24,7 @@
 			android:id="@+id/textView2"
 			android:textStyle="bold"
 			android:layout_marginLeft="10dp"
+			android:layout_marginStart="10dp"
 			android:textColor="@color/section_title"/>
 
 		<LinearLayout

+ 2 - 2
app/src/main/res/values-en/strings.xml

@@ -154,12 +154,12 @@
 	<string name="dialog_sync_text_4">Afinando la tuba&#8230;</string>
 	<string name="dialog_sync_text_5">Margolari camina pa\'lante, margolari camina pa\'trás.</string>
 	<string name="dialog_sync_text_6">Ari ari ari!</string>
-	<string name="dialog_sync_text_7">Llegando tarde...</string>
+	<string name="dialog_sync_text_7">Llegando tarde</string>
 	<string name="dialog_sync_text_8">¿Cabe más gente en el Foro Margolari?</string>
 	<string name="dialog_sync_failed_title">Synchronization failed</string>
 	<string name="dialog_sync_failed_text">Couldn\'t download content.\n\nMake sure you have a network connection and try again.</string>
 	<string name="dialog_sync_failed_close">Close</string>
 	<string name="lablanca_nofestivals">Las Fiestas de La Blanca. Esos días, del 4 al 9 de agosto, en los que Vitoria-Gasteiz se transforma. Se llena de color y alegría, y en cada esquina puedes encontrar actividades y espectáculos. Todos las estamos esperando.\n\nPor desgracia, aún hay que esperar más.\n\nNosotros ya estamos trabajando en ello. Tan pronto como vayamos sabiendo más, aquí iremos publicando nuestro programa y otra información sobre las fiestas.</string>
-	<string name="home_section_location_text_calculating">Calculating distance...</string>
+	<string name="home_section_location_text_calculating">Calculating distance</string>
 
 </resources>

+ 2 - 2
app/src/main/res/values-eu-rES/strings.xml

@@ -159,12 +159,12 @@
 	<string name="dialog_sync_text_4">Afinando la tuba&#8230;</string>
 	<string name="dialog_sync_text_5">Margolari camina pa\'lante, margolari camina pa\'trás.</string>
 	<string name="dialog_sync_text_6">Ari ari ari!</string>
-	<string name="dialog_sync_text_7">Llegando tarde...</string>
+	<string name="dialog_sync_text_7">Llegando tarde</string>
 	<string name="dialog_sync_text_8">¿Cabe más gente en el Foro Margolari?</string>
 	<string name="dialog_sync_failed_text">No se pudierdon descargar los contenidos\n\nAsegúrate de que dispones de conexión a internet e inténtalo de nuevo.</string>
 	<string name="lablanca_nofestivals">Las Fiestas de La Blanca. Esos días, del 4 al 9 de agosto, en los que Vitoria-Gasteiz se transforma. Se llena de color y alegría, y en cada esquina puedes encontrar actividades y espectáculos. Todos las estamos esperando.\n\nPor desgracia, aún hay que esperar más.\n\nNosotros ya estamos trabajando en ello. Tan pronto como vayamos sabiendo más, aquí iremos publicando nuestro programa y otra información sobre las fiestas.</string>
 	<string name="settings_notification_off">No recibir notificaciones</string>
 	<string name="settings_notification_on">Recibir notificaciones</string>
-	<string name="home_section_location_text_calculating">Calculando distancia...</string>
+	<string name="home_section_location_text_calculating">Calculando distancia</string>
 
 </resources>

+ 3 - 3
app/src/main/res/values/strings.xml

@@ -124,7 +124,7 @@
 	<string name="dialog_sync_text_4">Afinando la tuba&#8230;</string>
 	<string name="dialog_sync_text_5">Margolari camina pa\'lante, margolari camina pa\'trás.</string>
 	<string name="dialog_sync_text_6">Ari ari ari!</string>
-	<string name="dialog_sync_text_7">Llegando tarde...</string>
+	<string name="dialog_sync_text_7">Llegando tarde</string>
 	<string name="dialog_sync_text_8">¿Cabe más gente en el Foro Margolari?</string>
 	<string name="gallery_albums">Albums</string>
 	<string name="gallery_upload">Subir fotos</string>
@@ -138,7 +138,7 @@
 	<string name="home_section_gmschedule">Programa Margolari</string>
 	<string name="home_section_location_text_short" tools:ignore="PluralsCandidate">¡Están a solo %1$d metros de ti! (Unos %2$d minutos andando)</string>
 	<string name="home_section_location_text_long">¡Están a solo %1$s kilometros de ti!</string>
-	<string name="home_section_location_text_calculating">Calculando distancia...</string>
+	<string name="home_section_location_text_calculating">Calculando distancia</string>
 	<string name="lablanca_date_august">%1$s de agosto</string>
 	<string name="lablanca_date_july">%1$s de julio</string>
 	<string name="lablanca_prices">Precios</string>
@@ -171,7 +171,7 @@
 	<string name="settings_license">Licencia</string>
 	<string name="settings_license_content"><![CDATA[Copyright 2016 Iñigo Valentin<br/><br/>This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free Software Foundation.<br/><br/>This 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 at http://www.gnu.org/licenses/.<br/><br/>The name "Gasteizko Margolariak" and its logotype are property of Gasteizko Margolariak.<br/><br/><br/><div style="background-color:#bbbbbb;padding:6px;border-radius:5px;border-style:solid;border-width:2px;border-color:#333333;text-align:center;">You can get the source code for this project at <a href="https://github.com/Seavenois/GM">Github</a></div>]]></string>
 	<string name="settings_privacy">Privacidad</string>
-	<string name="settings_privacy_content"><![CDATA[En Gasteizko Margolariak respetamos tu privacidad. No guardamos NINGÚN dato de nuestros usuarios, incluyendo información personal, localización, hábitos de compra, preferencias sexuales, color favorito, nombre de su primer amor… NINGUNO.<br/><br/>Para que nos creas, te explicamos lo que sí almacenamos:<br/><br/><ul><li>Un código de usuario, generado aleatoriamente, único para tu dispositivo. Esto es necesario para sincronizar la aplicación con nuestra base de datos y poder descargar los últimos posts, actividades... Pero esta hecho de tal manera que no podamos identificarte como persona a través de ese código.</li><li>Al publicar un comentario en una entrada o una foto, guardaremos temporalmente (120 minutos, lo justo para procesar información) tu dirección IP. Esto nos es súper útil para saber cuántas personas diferentes publican comentarios, y tampoco nos permite identificarte como persona.</li></ul>]]></string>
+	<string name="settings_privacy_content"><![CDATA[En Gasteizko Margolariak respetamos tu privacidad. No guardamos NINGÚN dato de nuestros usuarios, incluyendo información personal, localización, hábitos de compra, preferencias sexuales, color favorito, nombre de su primer amor… NINGUNO.<br/><br/>Para que nos creas, te explicamos lo que sí almacenamos:<br/><br/><ul><li>Un código de usuario, generado aleatoriamente, único para tu dispositivo. Esto es necesario para sincronizar la aplicación con nuestra base de datos y poder descargar los últimos posts, actividades Pero esta hecho de tal manera que no podamos identificarte como persona a través de ese código.</li><li>Al publicar un comentario en una entrada o una foto, guardaremos temporalmente (120 minutos, lo justo para procesar información) tu dirección IP. Esto nos es súper útil para saber cuántas personas diferentes publican comentarios, y tampoco nos permite identificarte como persona.</li></ul>]]></string>
 	<string name="settings_transparency">Transparencia</string>
 	<string name="settings_transparency_content"><![CDATA[¿Te preocupa saber dónde va tu dinero? En Gasteizko Margolariak queremos que estés tranquilo.<br/><br/>Muchas de nuestras actividades son gratuitas. Otras, como las fiestas de La Blanca, tienen una cuota de inscripción. Gasteizko Margolariak no es una empresa, es una Asociación Cultural, y como tal, no tenemos beneficios.<br/><br/>Queremos ser transparentes, y por eso, empezando en 2016, pondremos a tu disposición nuestras cuentas de manera online, para que sepas que cada euro se reinvierte en tí.]]></string>
 	<string name="lablanca_nofestivals">Las Fiestas de La Blanca. Esos días, del 4 al 9 de agosto, en los que Vitoria-Gasteiz se transforma. Se llena de color y alegría, y en cada esquina puedes encontrar actividades y espectáculos. Todos las estamos esperando.\n\nPor desgracia, aún hay que esperar más.\n\nNosotros ya estamos trabajando en ello. Tan pronto como vayamos sabiendo más, aquí iremos publicando nuestro programa y otra información sobre las fiestas.</string>