ソースを参照

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

seavenois 10 年 前
コミット
bf0fa8878b
25 ファイル変更174 行追加159 行削除
  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>