소스 검색

Merge branch 'NotificationV1API'

seavenois 9 년 전
부모
커밋
f6e4791e75

+ 125 - 11
app/src/main/java/com/ivalentin/margolariak/AlarmReceiver.java

@@ -1,7 +1,6 @@
 package com.ivalentin.margolariak;
 
-//TODO: This doesn't work. Revise once the notification API is ready
-
+import android.app.Activity;
 import android.app.AlarmManager;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
@@ -41,9 +40,7 @@ public class AlarmReceiver extends BroadcastReceiver {
     @Override
 	@SuppressWarnings("deprecation")
     public void onReceive(Context context, Intent intent) {
-        
-    	Log.d("Alarm", "Received");
-		    	
+
 		//Open the preferences to be available several times later.
 		SharedPreferences preferences = context.getSharedPreferences(GM.PREFERENCES.PREFERNCES, Context.MODE_PRIVATE);
 		
@@ -55,11 +52,124 @@ public class AlarmReceiver extends BroadcastReceiver {
 			//Get the file
 			try{
 				fu = new FetchURL();
-				fu.Run(GM.API.SERVER + "/app/notifications.php");
-				Log.d("Alarm", "Fetched notifications");
+				fu.Run(GM.API.SERVER + GM.API.NOTIFICATION.PATH);
+				Log.d("NOTIFICATIONS", "Fetched notifications");
 
 				//Parse info
 				String o = fu.getOutput().toString();
+
+				//Open database
+				SQLiteDatabase db = context.openOrCreateDatabase(GM.DB.NAME, Activity.MODE_PRIVATE, null);
+				if (db.isReadOnly()){
+					Log.e("NOTIFICATIONS", "Database is locked and in read only mode.");
+					return;
+				}
+				Cursor cursor;
+
+				//Variables for parsing
+				String not, title_es, title_en, title_eu, text_es, text_en, text_eu, dtime, action;
+				int id, gm, duration;
+
+				//Variables for showinfg the notification
+				String lang = GM.getLang();
+				String title, text;
+
+				int counter = 0;
+				while (counter < 10 && o.contains("\"}")){
+
+					//Get the notifications
+					not = o.substring(o.indexOf("{\"") + 2, o.indexOf("\"}"));
+
+					//Extract data
+					id = Integer.valueOf(not.substring(not.indexOf("\"id\":") + 6, not.indexOf("\",")));
+					title_es = not.substring(not.indexOf("\"title_es\":") + 12, not.indexOf("\"", not.indexOf("\"title_es\":") + 13));
+					title_en = not.substring(not.indexOf("\"title_en\":") + 12, not.indexOf("\"", not.indexOf("\"title_en\":") + 13));
+					title_eu = not.substring(not.indexOf("\"title_eu\":") + 12, not.indexOf("\"", not.indexOf("\"title_eu\":") + 13));
+					text_es = not.substring(not.indexOf("\"text_es\":") + 11, not.indexOf("\"", not.indexOf("\"text_es\":") + 12));
+					text_en = not.substring(not.indexOf("\"text_en\":") + 11, not.indexOf("\"", not.indexOf("\"text_en\":") + 12));
+					text_eu = not.substring(not.indexOf("\"text_eu\":") + 11, not.indexOf("\"", not.indexOf("\"text_eu\":") + 12));
+					dtime = not.substring(not.indexOf("\"dtime\":") + 9, not.indexOf("\"", not.indexOf("\"dtime\":") + 10));
+					action = not.substring(not.indexOf("\"action\":") + 10, not.indexOf("\"", not.indexOf("\"action\":") + 11));
+					gm = Integer.valueOf(not.substring(not.indexOf("\"gm\":") + 6, not.indexOf("\"", not.indexOf("\"gm\":") + 7)));
+					duration = Integer.valueOf(not.substring(not.indexOf("\"duration\":") + 12, not.indexOf("\"", not.indexOf("\"duration\":") + 13)));
+
+
+					//Compare with the database
+					cursor = db.rawQuery("SELECT id FROM notification WHERE id = " + id + ";", null);
+					if (cursor.getCount() == 0) {
+						db.execSQL("INSERT INTO notification (id, title_es, title_en, title_eu, text_es, text_en, text_eu, dtime, internal, duration, action) VALUES " +
+								"(" + id + ", \"" + title_es + "\", \"" + title_en + "\", \"" + title_eu + "\", \"" + text_es + "\", \"" + text_en + "\", \"" + text_eu + "\", \"" + dtime + "\", " + gm + ", " + duration + ", \"" + action + "\");");
+
+						//TODO: Show notification;
+						switch (lang) {
+							case "en":
+								title = title_en;
+								text = text_en;
+								break;
+							case "eu":
+								title = title_eu;
+								text = text_eu;
+								break;
+							default:
+								title = title_es;
+								text = text_es;
+								break;
+						}
+
+						//Get the notification manager ready
+						NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+
+						//Variables to create intents for each notification
+						Intent resultIntent;
+						TaskStackBuilder stackBuilder;
+
+						//Send the notification.
+						NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
+								.setSmallIcon(R.drawable.ic_notification)
+								.setContentTitle(title)
+								.setAutoCancel(true)
+								.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
+								.setVibrate((new long[]{400, 400, 400}))
+								.setColor(context.getResources().getColor(R.color.background_notification))
+								.setSubText(context.getString(R.string.app_name))
+								.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
+								.setContentText(text);
+
+						// Creates an intent for an Activity to be launched from the notification.
+						resultIntent = new Intent(context, MainActivity.class);
+						resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+
+						//Set extras depending on type.
+						resultIntent.putExtra(GM.EXTRA.TEXT, text);
+						resultIntent.putExtra(GM.EXTRA.TITLE, title);
+						resultIntent.putExtra(GM.EXTRA.ACTION, action);
+
+						//Add the intent to the notification.
+						stackBuilder = TaskStackBuilder.create(context);
+						stackBuilder.addParentStack(MainActivity.class);
+
+						// Adds the Intent that starts the Activity to the top of the stack.
+						stackBuilder.addNextIntent(resultIntent);
+						PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+						mBuilder.setContentIntent(resultPendingIntent);
+
+						//Actually send the notification.
+						mNotificationManager.notify(id, mBuilder.build());
+
+					}
+					cursor.close();
+
+
+					o = o.substring(o.indexOf("\"}") + 3);
+					counter ++;
+				}
+				db.close();
+
+
+
+
+				//Parse info
+				/*String o = fu.getOutput().toString();
 				while (o.contains("<notification>")){
 					//Get non-language-dependant fields
 					String notification = o.substring(o.indexOf("<notification>") + 14, o.indexOf("</notification>"));
@@ -131,10 +241,13 @@ public class AlarmReceiver extends BroadcastReceiver {
 						}
 					}
 				o = o.substring(o.indexOf("</notification>") + 15);
-				}
+				}*/
+			}
+			catch(NumberFormatException ex) {
+				Log.e("NOTIFICATION", "Error parsing remote file: " + ex.toString());
 			}
-			catch(Exception ex) {
-				Log.e("Notification error", "Error fetching remote file: " + ex.toString());
+			catch (Exception ex){
+				Log.e("NOTIFICATION", "Error fetching notifications: " + ex.toString());
 			}
     	}
 
@@ -157,7 +270,8 @@ public class AlarmReceiver extends BroadcastReceiver {
 			PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
 
 			//Set the alarm cycle.
-			alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, GM.PERIOD_SYNC.FESTIVALS, GM.PERIOD_SYNC.NORMAL, alarmIntent);
+			//TODO: Set the most appropiate interval
+			alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, GM.PERIOD_SYNC.FESTIVALS, GM.PERIOD_SYNC.FESTIVALS, alarmIntent);
 
 			// Enable SampleBootReceiver to automatically restart the alarm when the device is rebooted.
 			ComponentName receiver = new ComponentName(context, BootReceiver.class);

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

@@ -826,7 +826,7 @@ final class GM {
 			/**
 			 * Path to the API.
 			 */
-			static final String PATH = "/API/v1/sync.php";
+			static final String PATH = "/API/v1/notifications.php";
 
 			/**
 			 * Keys fotr the API parameters.

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

@@ -554,6 +554,8 @@ public class MainActivity extends Activity {
 					lp.dimAmount = 0.4f;
 					dialog.getWindow().setAttributes(lp);
 
+					dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+
 					//Show dialog
 					dialog.show();
 				}

+ 23 - 8
app/src/main/res/layout/dialog_notification.xml

@@ -1,24 +1,39 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/section"
     android:orientation="vertical"
-    android:padding="7dp" >
+    android:background="@drawable/section"
+    android:layout_marginBottom="30dp"
+    android:layout_marginEnd="18dp"
+    android:layout_marginLeft="18dp"
+    android:layout_marginRight="18dp"
+    android:layout_marginStart="18dp"
+    android:layout_marginTop="35dp"
+    android:paddingBottom="15dp">
 
     <TextView
         android:id="@+id/tv_dialog_notification_title"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:ellipsize="end"
-        android:maxLines="2"
-        android:textAppearance="@android:style/TextAppearance.Large"
-        android:textStyle="bold"/>
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textStyle="bold"
+        android:background="@drawable/section_title"
+        android:paddingBottom="4dp"
+        android:paddingEnd="10dp"
+        android:paddingLeft="20dp"
+        android:paddingRight="10dp"
+        android:paddingStart="20dp"
+        android:paddingTop="4dp"
+        android:textColor="@color/section_title"/>
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical"
-        android:background="@drawable/entry">
+        android:background="@drawable/entry"
+        android:layout_margin="8dp"
+        android:padding="7dp">
 
         <TextView
             android:id="@+id/tv_dialog_notification_text"