Add support for background notification download when power save mode is enabled (#411)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

## What changes were proposed in this pull request?

* Add support for background notification download when power save mode is enabled (Fixes #408)
* Remove social links

## How was this patch tested?

Manually.

Co-authored-by: Amab <juanmi1982@gmail.com>
Reviewed-on: #411
This commit is contained in:
Marown 2022-12-18 14:48:17 +01:00
parent 41abd55f43
commit dcd264adb4
14 changed files with 476 additions and 491 deletions

View File

@ -14,9 +14,12 @@
<uses-permission android:name="android.permission.USE_CREDENTIALS" android:maxSdkVersion="22" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" android:maxSdkVersion="22" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-feature <uses-feature
android:name="android.hardware.touchscreen" android:name="android.hardware.touchscreen"
@ -49,7 +52,6 @@
<activity <activity
android:name="es.ugr.swad.swadroid.SWADMain" android:name="es.ugr.swad.swadroid.SWADMain"
android:icon="@drawable/ic_launcher_swadroid" android:icon="@drawable/ic_launcher_swadroid"
android:label="@string/app_name"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -366,6 +368,26 @@
android:resource="@xml/sync_notifications" /> android:resource="@xml/sync_notifications" />
</service> </service>
<receiver
android:name="es.ugr.swad.swadroid.modules.notifications.RestarterNotificationsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.REBOOT" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_RESTARTED" />
<action android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="es.ugr.swad.swadroid.fileprovider" android:authorities="es.ugr.swad.swadroid.fileprovider"

View File

@ -267,6 +267,10 @@ public class Constants {
* Request code for PERMISSION_MULTIPLE permissions * Request code for PERMISSION_MULTIPLE permissions
*/ */
public static final int PERMISSION_MULTIPLE = 102; public static final int PERMISSION_MULTIPLE = 102;
/**
* Request code for POST_NOTIFICATIONS permission
*/
public static final int PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 103;
/** /**
* Prefix tag name for Logcat * Prefix tag name for Logcat
*/ */

View File

@ -19,11 +19,14 @@
package es.ugr.swad.swadroid; package es.ugr.swad.swadroid;
import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -43,6 +46,10 @@ import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -50,6 +57,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import es.ugr.swad.swadroid.database.DataBaseHelper; import es.ugr.swad.swadroid.database.DataBaseHelper;
import es.ugr.swad.swadroid.gui.AlertNotificationFactory;
import es.ugr.swad.swadroid.gui.DialogFactory; import es.ugr.swad.swadroid.gui.DialogFactory;
import es.ugr.swad.swadroid.gui.MenuExpandableListActivity; import es.ugr.swad.swadroid.gui.MenuExpandableListActivity;
import es.ugr.swad.swadroid.gui.ProgressScreen; import es.ugr.swad.swadroid.gui.ProgressScreen;
@ -59,8 +67,8 @@ import es.ugr.swad.swadroid.model.Model;
import es.ugr.swad.swadroid.modules.courses.Courses; import es.ugr.swad.swadroid.modules.courses.Courses;
import es.ugr.swad.swadroid.modules.downloads.DownloadsManager; import es.ugr.swad.swadroid.modules.downloads.DownloadsManager;
import es.ugr.swad.swadroid.modules.groups.MyGroupsManager; import es.ugr.swad.swadroid.modules.groups.MyGroupsManager;
import es.ugr.swad.swadroid.modules.information.Information;
import es.ugr.swad.swadroid.modules.indoorlocation.IndoorLocation; import es.ugr.swad.swadroid.modules.indoorlocation.IndoorLocation;
import es.ugr.swad.swadroid.modules.information.Information;
import es.ugr.swad.swadroid.modules.login.Login; import es.ugr.swad.swadroid.modules.login.Login;
import es.ugr.swad.swadroid.modules.login.LoginActivity; import es.ugr.swad.swadroid.modules.login.LoginActivity;
import es.ugr.swad.swadroid.modules.messages.Messages; import es.ugr.swad.swadroid.modules.messages.Messages;
@ -166,6 +174,11 @@ public class SWADMain extends MenuExpandableListActivity {
initializeMainViews(); initializeMainViews();
try { try {
// Create Notifications channel
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
AlertNotificationFactory.createNotificationChanel(this);
}
//Check if this is the first run after an install or upgrade //Check if this is the first run after an install or upgrade
lastVersion = Preferences.getLastVersion(); lastVersion = Preferences.getLastVersion();
currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
@ -191,6 +204,20 @@ public class SWADMain extends MenuExpandableListActivity {
} }
} }
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
@Override
protected void onStart() {
super.onStart();
// Check Android 13 permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
Constants.PERMISSIONS_REQUEST_POST_NOTIFICATIONS);
}
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see android.app.Activity#onResume() * @see android.app.Activity#onResume()

View File

@ -19,118 +19,150 @@
package es.ugr.swad.swadroid.gui; package es.ugr.swad.swadroid.gui;
import static es.ugr.swad.swadroid.utils.NotificationUtils.SWADROID_CHANNEL_ID;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import es.ugr.swad.swadroid.modules.notifications.Notifications;
import es.ugr.swad.swadroid.utils.NotificationUtils; import es.ugr.swad.swadroid.utils.NotificationUtils;
import static es.ugr.swad.swadroid.utils.NotificationUtils.SWADROID_CHANNEL_ID;
/** /**
* Class for create notification alerts. * Class for create notification alerts.
* *
* @author Juan Miguel Boyero Corral <juanmi1982@gmail.com> * @author Juan Miguel Boyero Corral <juanmi1982@gmail.com>
*/ */
public class AlertNotificationFactory { public class AlertNotificationFactory {
public static NotificationCompat.Builder createAlertNotificationBuilder(Context context, String contentTitle, String contentText, public static final String CHANNEL_NAME = "Background Service";
String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon, public static NotificationCompat.Builder createAlertNotificationBuilder(Context context, String contentTitle, String contentText,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce) { String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce) {
int flags = 0;
NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context, SWADROID_CHANNEL_ID) int flags = 0;
.setAutoCancel(autocancel)
.setSmallIcon(smallIcon) NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context, SWADROID_CHANNEL_ID)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), largeIcon)) .setAutoCancel(autocancel)
.setContentTitle(contentTitle) .setSmallIcon(smallIcon)
.setContentText(contentText) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), largeIcon))
.setTicker(ticker) .setContentTitle(contentTitle)
.setOngoing(ongoing) .setContentText(contentText)
.setOnlyAlertOnce(onlyAlertOnce) .setTicker(ticker)
.setWhen(System.currentTimeMillis()); .setOngoing(ongoing)
//.setLights(Color.GREEN, 500, 500); .setOnlyAlertOnce(onlyAlertOnce)
.setWhen(System.currentTimeMillis());
//.setLights(Color.GREEN, 500, 500);
//Launch activity on alert click //Launch activity on alert click
if(pendingIntent != null) { if (pendingIntent != null) {
notifBuilder.setContentIntent(pendingIntent); notifBuilder.setContentIntent(pendingIntent);
} }
//Add sound, vibration and lights //Add sound, vibration and lights
flags |= Notification.DEFAULT_SOUND; flags |= Notification.DEFAULT_SOUND;
flags |= Notification.DEFAULT_VIBRATE; flags |= Notification.DEFAULT_VIBRATE;
flags |= Notification.DEFAULT_LIGHTS; flags |= Notification.DEFAULT_LIGHTS;
notifBuilder.setDefaults(flags);
return notifBuilder;
}
public static NotificationCompat.Builder createProgressNotificationBuilder(Context context, String contentTitle, String contentText,
String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce, int maxProgress, int progress, boolean indeterminate) {
NotificationCompat.Builder notifBuilder = createAlertNotificationBuilder(context,
contentTitle,
contentText,
ticker,
pendingIntent,
smallIcon,
largeIcon,
autocancel,
ongoing,
onlyAlertOnce);
notifBuilder.setProgress(maxProgress, progress, indeterminate);
return notifBuilder;
}
public static Notification createAlertNotification(Context context, String contentTitle, String contentText,
String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce) {
NotificationCompat.Builder notifBuilder = createAlertNotificationBuilder(context, notifBuilder.setDefaults(flags);
contentTitle,
contentText, return notifBuilder;
ticker, }
pendingIntent,
smallIcon, public static NotificationCompat.Builder createProgressNotificationBuilder(Context context, String contentTitle, String contentText,
largeIcon, String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
autocancel, boolean autocancel, boolean ongoing, boolean onlyAlertOnce, int maxProgress, int progress, boolean indeterminate) {
ongoing,
onlyAlertOnce); NotificationCompat.Builder notifBuilder = createAlertNotificationBuilder(context,
contentTitle,
contentText,
ticker,
pendingIntent,
smallIcon,
largeIcon,
autocancel,
ongoing,
onlyAlertOnce);
notifBuilder.setProgress(maxProgress, progress, indeterminate);
return notifBuilder;
}
public static Notification createAlertNotification(Context context, String contentTitle, String contentText,
String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce) {
NotificationCompat.Builder notifBuilder = createAlertNotificationBuilder(context,
contentTitle,
contentText,
ticker,
pendingIntent,
smallIcon,
largeIcon,
autocancel,
ongoing,
onlyAlertOnce);
//Create alert //Create alert
return notifBuilder.build(); return notifBuilder.build();
} }
public static Notification createProgressNotification(Context context, String contentTitle, String contentText,
String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
boolean autocancel, boolean ongoing, boolean onlyAlertOnce, int maxProgress, int progress, boolean indeterminate) {
NotificationCompat.Builder notifBuilder = createProgressNotificationBuilder(context, public static Notification createProgressNotification(Context context, String contentTitle, String contentText,
contentTitle, String ticker, PendingIntent pendingIntent, int smallIcon, int largeIcon,
contentText, boolean autocancel, boolean ongoing, boolean onlyAlertOnce, int maxProgress, int progress, boolean indeterminate) {
ticker,
pendingIntent, NotificationCompat.Builder notifBuilder = createProgressNotificationBuilder(context,
smallIcon, contentTitle,
largeIcon, contentText,
autocancel, ticker,
ongoing, pendingIntent,
onlyAlertOnce, smallIcon,
maxProgress, largeIcon,
progress, autocancel,
indeterminate); ongoing,
onlyAlertOnce,
maxProgress,
progress,
indeterminate);
//Create alert //Create alert
return notifBuilder.build(); return notifBuilder.build();
} }
public static void showAlertNotification(Context context, Notification notif, int notifId) { public static Notification createBackgroundNotification(Context context, String contentTitle, int smallIcon, int largeIcon, PendingIntent pendingIntent) {
NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context, SWADROID_CHANNEL_ID)
.setOngoing(true)
.setSmallIcon(smallIcon)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), largeIcon))
.setContentTitle(contentTitle)
.setPriority(NotificationManager.IMPORTANCE_HIGH)
.setCategory(Notification.CATEGORY_SERVICE)
.setContentIntent(pendingIntent);
//Create alert
return notifBuilder.build();
}
@RequiresApi(Build.VERSION_CODES.O)
public static void createNotificationChanel(Context context) {
NotificationChannel channel = new NotificationChannel(SWADROID_CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
channel.setLightColor(Color.BLUE);
manager.createNotificationChannel(channel);
}
public static void showAlertNotification(Context context, Notification notif, int notifId) {
NotificationManager notifManager; NotificationManager notifManager;
//Obtain a reference to the notification service //Obtain a reference to the notification service
@ -144,5 +176,5 @@ public class AlertNotificationFactory {
//Send alert //Send alert
notifManager.notify(notifId, notif); notifManager.notify(notifId, notif);
} }
} }

View File

@ -19,7 +19,6 @@
package es.ugr.swad.swadroid.modules.notifications; package es.ugr.swad.swadroid.modules.notifications;
import android.accounts.Account; import android.accounts.Account;
import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -28,9 +27,7 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -42,6 +39,8 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapObject;
import java.util.ArrayList; import java.util.ArrayList;
@ -142,48 +141,44 @@ public class Notifications extends Module implements
/** /**
* Id for the not seen notifications group * Id for the not seen notifications group
*/ */
private int NOT_SEEN_GROUP_ID = 0; private final int NOT_SEEN_GROUP_ID = 0;
/** /**
* Id for the seen notifications group * Id for the seen notifications group
*/ */
private int SEEN_GROUP_ID = 1; private final int SEEN_GROUP_ID = 1;
/** /**
* ListView click listener * ListView click listener
*/ */
private OnChildClickListener clickListener = new OnChildClickListener() { private final OnChildClickListener clickListener = (parent, v, groupPosition, childPosition, id) -> {
@Override
public boolean onChildClick(ExpandableListView parent, View v, TextView notifCode = v.findViewById(R.id.notifCode);
int groupPosition, int childPosition, long id) { TextView code = v.findViewById(R.id.eventCode);
TextView type = v.findViewById(R.id.eventType);
TextView notifCode = (TextView) v.findViewById(R.id.notifCode); TextView userPhoto = v.findViewById(R.id.eventUserPhoto);
TextView code = (TextView) v.findViewById(R.id.eventCode); TextView sender = v.findViewById(R.id.eventSender);
TextView type = (TextView) v.findViewById(R.id.eventType); TextView course = v.findViewById(R.id.eventLocation);
TextView userPhoto = (TextView) v.findViewById(R.id.eventUserPhoto); TextView summary = v.findViewById(R.id.eventSummary);
TextView sender = (TextView) v.findViewById(R.id.eventSender); TextView content = v.findViewById(R.id.eventText);
TextView course = (TextView) v.findViewById(R.id.eventLocation); TextView date = v.findViewById(R.id.eventDate);
TextView summary = (TextView) v.findViewById(R.id.eventSummary); TextView time = v.findViewById(R.id.eventTime);
TextView content = (TextView) v.findViewById(R.id.eventText); TextView seenLocalText = v.findViewById(R.id.seenLocal);
TextView date = (TextView) v.findViewById(R.id.eventDate);
TextView time = (TextView) v.findViewById(R.id.eventTime);
TextView seenLocalText = (TextView) v.findViewById(R.id.seenLocal);
Intent activity = new Intent(getApplicationContext(), Intent activity = new Intent(getApplicationContext(),
NotificationItem.class); NotificationItem.class);
activity.putExtra("notifCode", notifCode.getText().toString()); activity.putExtra("notifCode", notifCode.getText().toString());
activity.putExtra("eventCode", code.getText().toString()); activity.putExtra("eventCode", code.getText().toString());
activity.putExtra("notificationType", type.getText().toString()); activity.putExtra("notificationType", type.getText().toString());
activity.putExtra("userPhoto", userPhoto.getText().toString()); activity.putExtra("userPhoto", userPhoto.getText().toString());
activity.putExtra("sender", sender.getText().toString()); activity.putExtra("sender", sender.getText().toString());
activity.putExtra("course", course.getText().toString()); activity.putExtra("course", course.getText().toString());
activity.putExtra("summary", summary.getText().toString()); activity.putExtra("summary", summary.getText().toString());
activity.putExtra("content", content.getText().toString()); activity.putExtra("content", content.getText().toString());
activity.putExtra("date", date.getText().toString()); activity.putExtra("date", date.getText().toString());
activity.putExtra("time", time.getText().toString()); activity.putExtra("time", time.getText().toString());
activity.putExtra("seenLocal", seenLocalText.getText().toString()); activity.putExtra("seenLocal", seenLocalText.getText().toString());
startActivity(activity); startActivity(activity);
return true; return true;
}
}; };
/** /**
@ -280,9 +275,9 @@ public class Notifications extends Module implements
refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container_expandablelist); refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container_expandablelist);
list = (ExpandableListView) findViewById(R.id.expandablelist_pulltorefresh); list = (ExpandableListView) findViewById(R.id.expandablelist_pulltorefresh);
emptyNotifTextView = (TextView) findViewById(R.id.list_item_title); emptyNotifTextView = findViewById(R.id.list_item_title);
mBirthdayLayout = (LinearLayout) findViewById(R.id.notify_layout); mBirthdayLayout = (LinearLayout) findViewById(R.id.notify_layout);
mBirthdayTextView = (TextView) findViewById(R.id.notifyTextView); mBirthdayTextView = findViewById(R.id.notifyTextView);
groupItem = new ArrayList<>(); groupItem = new ArrayList<>();
childItem = new ArrayList<>(); childItem = new ArrayList<>();
@ -331,7 +326,7 @@ public class Notifications extends Module implements
refreshScreen(); refreshScreen();
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -406,12 +401,12 @@ public class Notifications extends Module implements
notifCount = 0; notifCount = 0;
for (int i = 0; i < numNotif; i++) { for (int i = 0; i < numNotif; i++) {
SoapObject pii = (SoapObject) soap.getProperty(i); SoapObject pii = (SoapObject) soap.getProperty(i);
Long notifCode = Long.valueOf(pii.getProperty("notifCode") long notifCode = Long.parseLong(pii.getProperty("notifCode")
.toString()); .toString());
Long eventCode = Long.valueOf(pii.getProperty( long eventCode = Long.parseLong(pii.getProperty(
"eventCode").toString()); "eventCode").toString());
String eventType = pii.getProperty("eventType").toString(); String eventType = pii.getProperty("eventType").toString();
Long eventTime = Long.valueOf(pii.getProperty("eventTime") long eventTime = Long.parseLong(pii.getProperty("eventTime")
.toString()); .toString());
String userNickname = pii.getProperty("userNickname") String userNickname = pii.getProperty("userNickname")
.toString(); .toString();
@ -424,7 +419,7 @@ public class Notifications extends Module implements
String userPhoto = pii.getProperty("userPhoto").toString(); String userPhoto = pii.getProperty("userPhoto").toString();
String location = pii.getProperty("location").toString(); String location = pii.getProperty("location").toString();
String summary = pii.getProperty("summary").toString(); String summary = pii.getProperty("summary").toString();
Integer status = Integer.valueOf(pii.getProperty("status") int status = Integer.parseInt(pii.getProperty("status")
.toString()); .toString());
String content = pii.getProperty("content").toString(); String content = pii.getProperty("content").toString();
boolean notifReadSWAD = (status >= 4); boolean notifReadSWAD = (status >= 4);
@ -587,17 +582,14 @@ public class Notifications extends Module implements
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { if (item.getItemId() == R.id.action_markAllRead) {
case R.id.action_markAllRead:
dbHelper.updateAllNotifications("seenLocal", dbHelper.updateAllNotifications("seenLocal",
Utils.parseBoolString(true)); Utils.parseBoolString(true));
sendReadNotifications(); sendReadNotifications();
refreshScreen(); refreshScreen();
return true; return true;
default:
return super.onOptionsItemSelected(item);
} }
return super.onOptionsItemSelected(item);
} }
/* /*
@ -638,76 +630,8 @@ public class Notifications extends Module implements
refreshLayout.setEnabled(enable); refreshLayout.setEnabled(enable);
} }
}); });
/*
* Create a ListView-specific touch listener. ListViews are given special treatment because
* by default they handle touches for their list items... i.e. they're in charge of drawing
* the pressed state (the list selector), handling list item clicks, etc.
*
* Requires Android 3.1 (HONEYCOMB_MR1) or newer
*/
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
SwipeListViewTouchListener touchListener =
new SwipeListViewTouchListener(
list,
new SwipeListViewTouchListener.OnSwipeCallback() {
@Override
public void onSwipeLeft(ListView listView, int [] reverseSortedPositions) {
if(reverseSortedPositions.length > 0) {
swipeItem(reverseSortedPositions[0]);
}
}
@Override
public void onSwipeRight(ListView listView, int [] reverseSortedPositions) {
if(reverseSortedPositions.length > 0) {
swipeItem(reverseSortedPositions[0]);
}
}
@Override
public void onStartSwipe() {
disableSwipe();
}
@Override
public void onStopSwipe() {
enableSwipe();
}
},
true,
true);
list.setOnTouchListener(touchListener);
// Setting this scroll listener is required to ensure that during ListView scrolling,
// we don't look for swipes.
list.setOnScrollListener(touchListener.makeScrollListener(refreshLayout));
} else {
Log.w(TAG, "SwipeListViewTouchListener requires Android 3.1 (HONEYCOMB_MR1) or newer");
list.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean enable = false;
if(list != null && list.getChildCount() > 0){
// check if the first item of the list is visible
boolean firstItemVisible = list.getFirstVisiblePosition() == 0;
// check if the top of the first item is visible
boolean topOfFirstItemVisible = list.getChildAt(0).getTop() == 0;
// enabling or disabling the refresh layout
enable = firstItemVisible && topOfFirstItemVisible;
}
refreshLayout.setEnabled(enable);
}
});
}*/
} }
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private void setAppearance() { private void setAppearance() {
refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light, android.R.color.holo_green_light,

View File

@ -59,7 +59,6 @@ import es.ugr.swad.swadroid.model.SWADNotification;
import es.ugr.swad.swadroid.model.User; import es.ugr.swad.swadroid.model.User;
import es.ugr.swad.swadroid.modules.login.Login; import es.ugr.swad.swadroid.modules.login.Login;
import es.ugr.swad.swadroid.preferences.Preferences; import es.ugr.swad.swadroid.preferences.Preferences;
import es.ugr.swad.swadroid.ssl.SecureConnection;
import es.ugr.swad.swadroid.utils.Utils; import es.ugr.swad.swadroid.utils.Utils;
import es.ugr.swad.swadroid.webservices.IWebserviceClient; import es.ugr.swad.swadroid.webservices.IWebserviceClient;
import es.ugr.swad.swadroid.webservices.SOAPClient; import es.ugr.swad.swadroid.webservices.SOAPClient;
@ -72,8 +71,6 @@ import es.ugr.swad.swadroid.webservices.SOAPClient;
*/ */
public class NotificationsSyncAdapterService extends Service { public class NotificationsSyncAdapterService extends Service {
private static final String TAG = "NotificationsSyncAdapterService"; private static final String TAG = "NotificationsSyncAdapterService";
private static Preferences prefs;
private static SecureConnection conn;
private static SyncAdapterImpl sSyncAdapter = null; private static SyncAdapterImpl sSyncAdapter = null;
private static int notifCount; private static int notifCount;
private static DataBaseHelper dbHelper; private static DataBaseHelper dbHelper;
@ -81,14 +78,9 @@ public class NotificationsSyncAdapterService extends Service {
private static String METHOD_NAME = ""; private static String METHOD_NAME = "";
private static Object result; private static Object result;
private static String errorMessage = ""; private static String errorMessage = "";
private static boolean isConnected;
private static boolean isDebuggable; private static boolean isDebuggable;
public static final String START_SYNC = "es.ugr.swad.swadroid.sync.start"; public static final String START_SYNC = "es.ugr.swad.swadroid.sync.start";
public static final String STOP_SYNC = "es.ugr.swad.swadroid.sync.stop"; public static final String STOP_SYNC = "es.ugr.swad.swadroid.sync.stop";
/**
* Application context
*/
private static Context mCtx;
public NotificationsSyncAdapterService() { public NotificationsSyncAdapterService() {
super(); super();
@ -100,7 +92,6 @@ public class NotificationsSyncAdapterService extends Service {
public SyncAdapterImpl(Context context) { public SyncAdapterImpl(Context context) {
super(context, true); super(context, true);
mContext = context; mContext = context;
mCtx = context;
} }
@Override @Override
@ -187,7 +178,6 @@ public class NotificationsSyncAdapterService extends Service {
*/ */
@Override @Override
public void onCreate() { public void onCreate() {
isConnected = Utils.connectionAvailable(this);
// Check if debug mode is enabled // Check if debug mode is enabled
try { try {
getPackageManager().getApplicationInfo( getPackageManager().getApplicationInfo(
@ -198,7 +188,6 @@ public class NotificationsSyncAdapterService extends Service {
} }
try { try {
prefs = new Preferences(this);
dbHelper = new DataBaseHelper(this); dbHelper = new DataBaseHelper(this);
//Initialize webservices client //Initialize webservices client
webserviceClient = null; webserviceClient = null;
@ -206,19 +195,57 @@ public class NotificationsSyncAdapterService extends Service {
Log.e(TAG, "Error initializing database and preferences", e); Log.e(TAG, "Error initializing database and preferences", e);
} }
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
Log.i(TAG, "Starting persistent notification in custom foreground mode");
startCustomForeground();
} else {
Log.i(TAG, "Starting persistent notification in standard foreground mode");
startForeground(1, new Notification());
}
super.onCreate(); super.onCreate();
} }
@Override
public void onDestroy() {
super.onDestroy();
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("restartNotificationsService");
broadcastIntent.setClass(this, RestarterNotificationsReceiver.class);
this.sendBroadcast(broadcastIntent);
}
private void startCustomForeground() {
Intent notificationIntent = new Intent(this, Notifications.class);
PendingIntent pendingIntent;
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//single top to avoid creating many activity stacks queue
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
pendingIntent = PendingIntent.getActivity(this,
0,
notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
Notification notification = AlertNotificationFactory.createBackgroundNotification(
this,
getString(R.string.appRunningBackground),
R.drawable.ic_launcher_swadroid_notif,
R.drawable.ic_launcher_swadroid,
pendingIntent);
startForeground(2, notification);
}
/* (non-Javadoc) /* (non-Javadoc)
* @see android.app.Service#onStartCommand(android.content.Intent, int, int) * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
*/ */
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId); super.onStartCommand(intent, flags, startId);
// return START_NOT_STICKY - we want this Service to be left running return START_REDELIVER_INTENT;
// unless explicitly stopped, and it's process is killed, we want it to
// be restarted
return START_STICKY;
} }
@Override @Override
@ -342,10 +369,10 @@ public class NotificationsSyncAdapterService extends Service {
notifCount = 0; notifCount = 0;
for (int i = 0; i < numNotif; i++) { for (int i = 0; i < numNotif; i++) {
SoapObject pii = (SoapObject) soap.getProperty(i); SoapObject pii = (SoapObject) soap.getProperty(i);
Long notifCode = Long.valueOf(pii.getProperty("notifCode").toString()); long notifCode = Long.parseLong(pii.getProperty("notifCode").toString());
Long eventCode = Long.valueOf(pii.getProperty("eventCode").toString()); long eventCode = Long.parseLong(pii.getProperty("eventCode").toString());
String eventType = pii.getProperty("eventType").toString(); String eventType = pii.getProperty("eventType").toString();
Long eventTime = Long.valueOf(pii.getProperty("eventTime").toString()); long eventTime = Long.parseLong(pii.getProperty("eventTime").toString());
String userNickname = pii.getProperty("userNickname").toString(); String userNickname = pii.getProperty("userNickname").toString();
String userSurname1 = pii.getProperty("userSurname1").toString(); String userSurname1 = pii.getProperty("userSurname1").toString();
String userSurname2 = pii.getProperty("userSurname2").toString(); String userSurname2 = pii.getProperty("userSurname2").toString();
@ -353,7 +380,7 @@ public class NotificationsSyncAdapterService extends Service {
String userPhoto = pii.getProperty("userPhoto").toString(); String userPhoto = pii.getProperty("userPhoto").toString();
String location = pii.getProperty("location").toString(); String location = pii.getProperty("location").toString();
String summary = pii.getProperty("summary").toString(); String summary = pii.getProperty("summary").toString();
Integer status = Integer.valueOf(pii.getProperty("status").toString()); int status = Integer.parseInt(pii.getProperty("status").toString());
String content = pii.getProperty("content").toString(); String content = pii.getProperty("content").toString();
boolean notifReadSWAD = (status >= 4); boolean notifReadSWAD = (status >= 4);
boolean notifCancelled = (status >= 8); boolean notifCancelled = (status >= 8);

View File

@ -0,0 +1,48 @@
/*
* This file is part of SWADroid.
*
* Copyright (C) 2010 Juan Miguel Boyero Corral <juanmi1982@gmail.com>
*
* SWADroid is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SWADroid 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.
*
* You should have received a copy of the GNU General Public License
* along with SWADroid. If not, see <http://www.gnu.org/licenses/>.
*/
package es.ugr.swad.swadroid.modules.notifications;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
/**
* Restarter for NotificationsSyncAdapterService service.
*
* @author Juan Miguel Boyero Corral <juanmi1982@gmail.com>
*/
public class RestarterNotificationsReceiver extends BroadcastReceiver {
private static final String TAG = "RestarterNotificationsReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Service tried to stop");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, NotificationsSyncAdapterService.class));
} else {
context.startService(new Intent(context, NotificationsSyncAdapterService.class));
}
Log.i(TAG, "Service restarted");
}
}

View File

@ -18,11 +18,9 @@
*/ */
package es.ugr.swad.swadroid.preferences; package es.ugr.swad.swadroid.preferences;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
@ -85,22 +83,6 @@ public class Preferences {
* Rate preference name * Rate preference name
*/ */
public static final String RATEPREF = "ratePref"; public static final String RATEPREF = "ratePref";
/**
* Twitter preference name
*/
public static final String TWITTERPREF = "twitterPref";
/**
* Facebook preference name
*/
public static final String FACEBOOKPREF = "facebookPref";
/**
* Telegram preference name
*/
public static final String TELEGRAMPREF = "telegramPref";
/**
* Blog preference name
*/
public static final String BLOGPREF = "blogPref";
/** /**
* Share preference name * Share preference name
*/ */
@ -177,7 +159,6 @@ public class Preferences {
/** /**
* Constructor * Constructor
*/ */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public Preferences(Context ctx) { public Preferences(Context ctx) {
getPreferences(ctx); getPreferences(ctx);

View File

@ -82,22 +82,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
* Rate preference * Rate preference
*/ */
private static Preference ratePref; private static Preference ratePref;
/**
* Twitter preference
*/
private static Preference twitterPref;
/**
* Facebook preference
*/
private static Preference facebookPref;
/**
* Telegram preference
*/
private static Preference telegramPref;
/**
* Blog preference
*/
private static Preference blogPref;
/** /**
* Share preference * Share preference
*/ */
@ -180,10 +164,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
logOutPref = findPreference(Preferences.LOGOUTPREF); logOutPref = findPreference(Preferences.LOGOUTPREF);
currentVersionPref = findPreference(Preferences.CURRENTVERSIONPREF); currentVersionPref = findPreference(Preferences.CURRENTVERSIONPREF);
ratePref = findPreference(Preferences.RATEPREF); ratePref = findPreference(Preferences.RATEPREF);
twitterPref = findPreference(Preferences.TWITTERPREF);
facebookPref = findPreference(Preferences.FACEBOOKPREF);
telegramPref = findPreference(Preferences.TELEGRAMPREF);
blogPref = findPreference(Preferences.BLOGPREF);
sharePref = findPreference(Preferences.SHAREPREF); sharePref = findPreference(Preferences.SHAREPREF);
privacyPolicyPref = findPreference(Preferences.PRIVACYPOLICYPREF); privacyPolicyPref = findPreference(Preferences.PRIVACYPOLICYPREF);
syncTimePref = findPreference(Preferences.SYNCTIMEPREF); syncTimePref = findPreference(Preferences.SYNCTIMEPREF);
@ -191,10 +171,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
//syncTimeLocationPref = findPreference(Preferences.SYNCLOCATIONTIMEPREF); //syncTimeLocationPref = findPreference(Preferences.SYNCLOCATIONTIMEPREF);
ratePref.setOnPreferenceChangeListener(this); ratePref.setOnPreferenceChangeListener(this);
twitterPref.setOnPreferenceChangeListener(this);
facebookPref.setOnPreferenceChangeListener(this);
telegramPref.setOnPreferenceChangeListener(this);
blogPref.setOnPreferenceChangeListener(this);
sharePref.setOnPreferenceChangeListener(this); sharePref.setOnPreferenceChangeListener(this);
privacyPolicyPref.setOnPreferenceChangeListener(this); privacyPolicyPref.setOnPreferenceChangeListener(this);
syncEnablePref.setOnPreferenceChangeListener(this); syncEnablePref.setOnPreferenceChangeListener(this);
@ -229,54 +205,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
return true; return true;
} }
}); });
twitterPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
/**
* Called when a preference is selected.
* @param preference Preference selected.
*/
public boolean onPreferenceClick(Preference preference) {
Intent urlIntent = new Intent(Intent.ACTION_VIEW);
urlIntent.setData(Uri.parse(getString(R.string.twitterURL)));
startActivity(urlIntent);
return true;
}
});
facebookPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
/**
* Called when a preference is selected.
* @param preference Preference selected.
*/
public boolean onPreferenceClick(Preference preference) {
Intent urlIntent = new Intent(Intent.ACTION_VIEW);
urlIntent.setData(Uri.parse(getString(R.string.facebookURL)));
startActivity(urlIntent);
return true;
}
});
telegramPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
/**
* Called when a preference is selected.
* @param preference Preference selected.
*/
public boolean onPreferenceClick(Preference preference) {
Intent urlIntent = new Intent(Intent.ACTION_VIEW);
urlIntent.setData(Uri.parse(getString(R.string.telegramURL)));
startActivity(urlIntent);
return true;
}
});
blogPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
/**
* Called when a preference is selected.
* @param preference Preference selected.
*/
public boolean onPreferenceClick(Preference preference) {
Intent urlIntent = new Intent(Intent.ACTION_VIEW);
urlIntent.setData(Uri.parse(getString(R.string.blogURL)));
startActivity(urlIntent);
return true;
}
});
sharePref.setOnPreferenceClickListener(new OnPreferenceClickListener() { sharePref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
/** /**
* Called when a preference is selected. * Called when a preference is selected.

View File

@ -18,22 +18,27 @@
</head> </head>
<body bgcolor="white"> <body bgcolor="white">
<!--<h4>1.6.0 (upcoming)</h4> <!--<h4>1.6.0</h4>
<ul> <ul>
<li type="disc">Añadido módulo para localización en interiores</li> <li type="disc">Añadido módulo para localización en interiores</li>
</ul>--> </ul>-->
<h4>1.5.8 (2022-05-23)</h4> <h4>1.5.9</h4>
<ul>
<li type="disc">Añadido soporte para la descarga de notificaciones en segundo plano cuando la optimización de batería está habilitada</li>
</ul>
<h4>1.5.8<h4>
<ul> <ul>
<li type="disc">Corregida descarga de notificaciones en Android 12 (S)</li> <li type="disc">Corregida descarga de notificaciones en Android 12 (S)</li>
</ul> </ul>
<h4>1.5.7 (2020-12-19)</h4> <h4>1.5.7<h4>
<ul> <ul>
<li type="disc">Corregida descarga de archivos en Android R</li> <li type="disc">Corregida descarga de archivos en Android R</li>
</ul> </ul>
<h4>1.5.6 (2019-11-05)</h4> <h4>1.5.6<h4>
<ul> <ul>
<li type="disc"> <li type="disc">
<strong>Pasar lista:</strong> <strong>Pasar lista:</strong>
@ -41,13 +46,13 @@
</li> </li>
</ul> </ul>
<h4>1.5.5 (2019-07-08)</h4> <h4>1.5.5<h4>
<ul> <ul>
<li type="disc">Añadido soporte para Android-Q</li> <li type="disc">Añadido soporte para Android-Q</li>
<li type="disc">Corregidas erratas en el historial de cambios</li> <li type="disc">Corregidas erratas en el historial de cambios</li>
</ul> </ul>
<h4>1.5.4 (2018-02-25)</h4> <h4>1.5.4<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc"> <li type="disc">
@ -56,7 +61,7 @@
</li> </li>
</ul> </ul>
<h4>1.5.3 (2017-10-25)</h4> <h4>1.5.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida compatibilidad con el sistema de notificaciones de Android <li type="disc">A&ntilde;adida compatibilidad con el sistema de notificaciones de Android
@ -64,7 +69,7 @@
</li> </li>
</ul> </ul>
<h4>1.5.2 (2017-02-12)</h4> <h4>1.5.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida pol&iacute;tica de privacidad de datos en la pantalla de <li type="disc">A&ntilde;adida pol&iacute;tica de privacidad de datos en la pantalla de
@ -78,12 +83,12 @@
Calificaciones, ahora se encuentran en la nueva carpeta Archivos Calificaciones, ahora se encuentran en la nueva carpeta Archivos
</li> </li>
</ul> </ul>
<h4>1.5.1 (2017-01-21)</h4> <h4>1.5.1<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error unparseable date: &quot;anyType{}&quot;(at offset 0)</li> <li type="disc">Corregido error unparseable date: &quot;anyType{}&quot;(at offset 0)</li>
</ul> </ul>
<h4>1.5.0 (2016-09-01)</h4> <h4>1.5.0<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc"> <li type="disc">
@ -91,7 +96,7 @@
A&ntilde;adida b&uacute;squeda de destinatarios A&ntilde;adida b&uacute;squeda de destinatarios
</li> </li>
</ul> </ul>
<h4>1.4.0 (2016-07-25)</h4> <h4>1.4.0<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc"> <li type="disc">
@ -107,7 +112,7 @@
Corregida consulta de calificaciones desde el rol estudiante Corregida consulta de calificaciones desde el rol estudiante
</li> </li>
</ul> </ul>
<h4>1.3.4 (2016-07-17)</h4> <h4>1.3.4<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc"> <li type="disc">
@ -129,7 +134,7 @@
Mejoras menores Mejoras menores
</li> </li>
</ul> </ul>
<h4>1.3.3 (2016-01-31)</h4> <h4>1.3.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidas notificaciones sociales</li> <li type="disc">A&ntilde;adidas notificaciones sociales</li>
@ -142,12 +147,12 @@
mayor a 30 d&iacute;as mayor a 30 d&iacute;as
</li> </li>
</ul> </ul>
<h4>1.3.2 (2016-01-06)</h4> <h4>1.3.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida gesti&oacute;n de permisos en Android 6.0 Marshmallow</li> <li type="disc">A&ntilde;adida gesti&oacute;n de permisos en Android 6.0 Marshmallow</li>
</ul> </ul>
<h4>1.3.1 (2015-12-06)</h4> <h4>1.3.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Mejoras en las pantallas de identificaci&oacute;n y creaci&oacute;n de <li type="disc">Mejoras en las pantallas de identificaci&oacute;n y creaci&oacute;n de
@ -155,7 +160,7 @@
</li> </li>
<li type="disc">Ahora las notificaciones canceladas no se descargan durante la sincronizaci&oacute;n</li> <li type="disc">Ahora las notificaciones canceladas no se descargan durante la sincronizaci&oacute;n</li>
</ul> </ul>
<h4>1.3 (2015-09-03)</h4> <h4>1.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida creaci&oacute;n de cuentas de usuario</li> <li type="disc">A&ntilde;adida creaci&oacute;n de cuentas de usuario</li>
@ -166,13 +171,13 @@
y tests (parcial en tests) y tests (parcial en tests)
</li> </li>
</ul> </ul>
<h4>1.2.4 (2015-03-15)</h4> <h4>1.2.4<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Reducido retardo entre escaneos de c&oacute;digos a un segundo</li> <li type="disc">Reducido retardo entre escaneos de c&oacute;digos a un segundo</li>
<li type="disc">Ahora el m&oacute;dulo de descargas requiere Android 3.0 o superior</li> <li type="disc">Ahora el m&oacute;dulo de descargas requiere Android 3.0 o superior</li>
</ul> </ul>
<h4>1.2.3 (2014-11-30)</h4> <h4>1.2.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido soporte para escaneo de c&oacute;digos de barras en el <li type="disc">A&ntilde;adido soporte para escaneo de c&oacute;digos de barras en el
@ -186,7 +191,7 @@
</li> </li>
<li type="disc">Reducido retardo entre escaneos de c&oacute;digos a 2 segundos</li> <li type="disc">Reducido retardo entre escaneos de c&oacute;digos a 2 segundos</li>
</ul> </ul>
<h4>1.2.2 (2014-11-26)</h4> <h4>1.2.2<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Deshabilitado el deslizamiento lateral de las notificaciones</li> <li type="disc">Deshabilitado el deslizamiento lateral de las notificaciones</li>
@ -201,7 +206,7 @@
correctamente correctamente
</li> </li>
</ul> </ul>
<h4>1.2.1 (2014-11-24)</h4> <h4>1.2.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Ahora se pueden enviar listados de asistencias vac&iacute;os para marcar <li type="disc">Ahora se pueden enviar listados de asistencias vac&iacute;os para marcar
@ -212,7 +217,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido refresco en pantalla del listado de asistencias</li> <li type="disc">Corregido refresco en pantalla del listado de asistencias</li>
</ul> </ul>
<h4>1.2 (2014-11-23)</h4> <h4>1.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidas felicitaciones de cumplea&ntilde;os</li> <li type="disc">A&ntilde;adidas felicitaciones de cumplea&ntilde;os</li>
@ -220,19 +225,19 @@
las asistencias a SWAD las asistencias a SWAD
</li> </li>
</ul> </ul>
<h4>1.1.4 (2014-11-11)</h4> <h4>1.1.4<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregida descarga de notificaciones por modificaciones en SWAD</li> <li type="disc">Corregida descarga de notificaciones por modificaciones en SWAD</li>
</ul> </ul>
<h4>1.1.3 (2014-10-05)</h4> <h4>1.1.3<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregida actualizaci&oacute;n err&oacute;nea de las notificaciones al <li type="disc">Corregida actualizaci&oacute;n err&oacute;nea de las notificaciones al
desplazar hacia arriba la lista desplazar hacia arriba la lista
</li> </li>
</ul> </ul>
<h4>1.1.2 (2014-09-18)</h4> <h4>1.1.2<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Mejoras en los mensajes de error</li> <li type="disc">Mejoras en los mensajes de error</li>
@ -244,7 +249,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregidos errores tipogr&aacute;ficos en el historial de cambios</li> <li type="disc">Corregidos errores tipogr&aacute;ficos en el historial de cambios</li>
</ul> </ul>
<h4>1.1.1 (2014-09-16)</h4> <h4>1.1.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Ahora el desplazamiento lateral de las notificaciones s&oacute;lo est&aacute; <li type="disc">Ahora el desplazamiento lateral de las notificaciones s&oacute;lo est&aacute;
@ -257,7 +262,7 @@
desplazar la lista hacia arriba sin estar en la parte superior de la misma desplazar la lista hacia arriba sin estar en la parte superior de la misma
</li> </li>
</ul> </ul>
<h4>1.1 (2014-09-08)</h4> <h4>1.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Ahora las notificaciones se agrupan en <li type="disc">Ahora las notificaciones se agrupan en
@ -293,7 +298,7 @@
aplicaci&oacute;n aplicaci&oacute;n
</li> </li>
</ul> </ul>
<h4>1.0 (2014-03-26)</h4> <h4>1.0<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">Nueva interfaz gr&aacute;fica estilo Holo</li> <li type="disc">Nueva interfaz gr&aacute;fica estilo Holo</li>
@ -316,7 +321,7 @@
</li> </li>
<li type="disc">Eliminados los idiomas no utilizados por los usuarios</li> <li type="disc">Eliminados los idiomas no utilizados por los usuarios</li>
</ul> </ul>
<h4>0.13 (2014-02-02)</h4> <h4>0.13<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida pantalla de identificaci&oacute;n</li> <li type="disc">A&ntilde;adida pantalla de identificaci&oacute;n</li>
@ -327,7 +332,7 @@
2.3 o superior cuando la sincronizaci&oacute;n autom&aacute;tica est&aacute; activada 2.3 o superior cuando la sincronizaci&oacute;n autom&aacute;tica est&aacute; activada
</li> </li>
</ul> </ul>
<h4>0.12.7 (2013-12-14)</h4> <h4>0.12.7<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida informaci&oacute;n de las notificaciones vistas en SWAD al <li type="disc">A&ntilde;adida informaci&oacute;n de las notificaciones vistas en SWAD al
@ -344,7 +349,7 @@
</li> </li>
<li type="disc">Corregido error al recuperar la configuraci&oacute;n de los tests</li> <li type="disc">Corregido error al recuperar la configuraci&oacute;n de los tests</li>
</ul> </ul>
<h4>0.12.6 (2013-11-24)</h4> <h4>0.12.6<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido control de las notificaciones vistas</li> <li type="disc">A&ntilde;adido control de las notificaciones vistas</li>
@ -366,17 +371,17 @@
</li> </li>
<li type="disc">Corregido color de fondo negro al deslizar el listado de notificaciones</li> <li type="disc">Corregido color de fondo negro al deslizar el listado de notificaciones</li>
</ul> </ul>
<h4>0.12.5 (2013-11-10)</h4> <h4>0.12.5<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error que imped&iacute;a responder mensajes</li> <li type="disc">Corregido error que imped&iacute;a responder mensajes</li>
</ul> </ul>
<h4>0.12.4 (2013-11-09)</h4> <h4>0.12.4<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error que imped&iacute;a consultar las sesiones de pr&aacute;cticas</li> <li type="disc">Corregido error que imped&iacute;a consultar las sesiones de pr&aacute;cticas</li>
</ul> </ul>
<h4>0.12.3 (2013-11-09)</h4> <h4>0.12.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido sistema de actualizaci&oacute;n "Arrastrar-para-actualizar" <li type="disc">A&ntilde;adido sistema de actualizaci&oacute;n "Arrastrar-para-actualizar"
@ -420,13 +425,13 @@
</li> </li>
<li type="disc">Corregido error en la selección del n&uacute;mero de preguntas de test</li> <li type="disc">Corregido error en la selección del n&uacute;mero de preguntas de test</li>
</ul> </ul>
<h4>0.12.2 (2013-06-19)</h4> <h4>0.12.2<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Actualizadas las comunicaciones con el servidor</li> <li type="disc">Actualizadas las comunicaciones con el servidor</li>
</ul> </ul>
<h4>0.12.1 (2013-06-09)</h4> <h4>0.12.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidas notificaciones de foros</li> <li type="disc">A&ntilde;adidas notificaciones de foros</li>
@ -455,7 +460,7 @@
<li type="disc">Corregida la detecci&oacute;n del valor nulo en la respuesta del servidor <li type="disc">Corregida la detecci&oacute;n del valor nulo en la respuesta del servidor
</li> </li>
</ul> </ul>
<h4>0.12 (2013-04-20)</h4> <h4>0.12<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidos los nuevos tipos de notificaci&oacute;n de Documentos, <li type="disc">A&ntilde;adidos los nuevos tipos de notificaci&oacute;n de Documentos,
@ -500,7 +505,7 @@
dispositivos dispositivos
</li> </li>
</ul> </ul>
<h4>0.11.3 (2013-03-03)</h4> <h4>0.11.3<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Ahora se muestra el servidor por defecto cuando el campo "Servidor" se deja <li type="disc">Ahora se muestra el servidor por defecto cuando el campo "Servidor" se deja
@ -514,7 +519,7 @@
asignaturas ante un cambio de configuraci&oacute;n asignaturas ante un cambio de configuraci&oacute;n
</li> </li>
</ul> </ul>
<h4>0.11.2 (2013-02-24)</h4> <h4>0.11.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido bot&oacute;n de actualizaci&oacute;n de las asignaturas en la <li type="disc">A&ntilde;adido bot&oacute;n de actualizaci&oacute;n de las asignaturas en la
@ -539,7 +544,7 @@
<li type="disc">Corregido comportamiento an&oacute;malo de los checkboxes en Android 4.2 <li type="disc">Corregido comportamiento an&oacute;malo de los checkboxes en Android 4.2
</li> </li>
</ul> </ul>
<h4>0.11.1 (2013-01-26)</h4> <h4>0.11.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida compatibilidad con pantallas t&aacute;ctiles b&aacute;sicas <li type="disc">A&ntilde;adida compatibilidad con pantallas t&aacute;ctiles b&aacute;sicas
@ -568,7 +573,7 @@
descriptores de los tests descriptores de los tests
</li> </li>
</ul> </ul>
<h4>0.11 (2012-12-15)</h4> <h4>0.11<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo de Descargas</li> <li type="disc">A&ntilde;adido m&oacute;dulo de Descargas</li>
@ -580,7 +585,7 @@
opciones de SWAD opciones de SWAD
</li> </li>
</ul> </ul>
<h4>0.10.1 (2012-11-17)</h4> <h4>0.10.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida compatibilidad con Android 4.2</li> <li type="disc">A&ntilde;adida compatibilidad con Android 4.2</li>
@ -603,7 +608,7 @@
asunto asunto
</li> </li>
</ul> </ul>
<h4>0.10 (2012-11-09)</h4> <h4>0.10<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo de inscripci&oacute;n a grupos</li> <li type="disc">A&ntilde;adido m&oacute;dulo de inscripci&oacute;n a grupos</li>
@ -620,7 +625,7 @@
<li type="disc">Corregido error en la comprobaci&oacute;n de la conexi&oacute;n a Internet <li type="disc">Corregido error en la comprobaci&oacute;n de la conexi&oacute;n a Internet
</li> </li>
</ul> </ul>
<h4>0.9.3 (2012-07-20)</h4> <h4>0.9.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido soporte para carpetas en la URL del servidor</li> <li type="disc">A&ntilde;adido soporte para carpetas en la URL del servidor</li>
@ -629,14 +634,14 @@
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">mMjoras en los mensajes de error</li> <li type="disc">mMjoras en los mensajes de error</li>
</ul> </ul>
<h4>0.9.2 (2012-07-10)</h4> <h4>0.9.2<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">La caracter&iacute;stica camera.autofocus ahora es opcional para corregir <li type="disc">La caracter&iacute;stica camera.autofocus ahora es opcional para corregir
incompatibilidades con algunos dispositivos incompatibilidades con algunos dispositivos
</li> </li>
</ul> </ul>
<h4>0.9.1 (2012-07-09)</h4> <h4>0.9.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido soporte pana DNI con letra (primera y &uacute;ltima posici&oacute;n) <li type="disc">A&ntilde;adido soporte pana DNI con letra (primera y &uacute;ltima posici&oacute;n)
@ -648,19 +653,19 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido soporte para pantallas grandes</li> <li type="disc">Corregido soporte para pantallas grandes</li>
</ul> </ul>
<h4>0.9 (2012-07-01)</h4> <h4>0.9<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo para pasar lista</li> <li type="disc">A&ntilde;adido m&oacute;dulo para pasar lista</li>
</ul> </ul>
<h4>0.8.1 (2012-05-20)</h4> <h4>0.8.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida opci&oacute;n para responder mensajes desde su notificaci&oacute;n <li type="disc">A&ntilde;adida opci&oacute;n para responder mensajes desde su notificaci&oacute;n
abierta abierta
</li> </li>
</ul> </ul>
<h4>0.8 (2012-05-01)</h4> <h4>0.8<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida sincronizaci&oacute;n autom&aacute;tica de las <li type="disc">A&ntilde;adida sincronizaci&oacute;n autom&aacute;tica de las
@ -691,7 +696,7 @@
<li type="disc">Corregido bug HTML en el campo "location" de las notificaciones</li> <li type="disc">Corregido bug HTML en el campo "location" de las notificaciones</li>
<li type="disc">Corregido error en la etiqueta br de las notificaciones</li> <li type="disc">Corregido error en la etiqueta br de las notificaciones</li>
</ul> </ul>
<h4>0.7.2 (2012-02-22)</h4> <h4>0.7.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidas alertas de notificaciones en la barra de estado</li> <li type="disc">A&ntilde;adidas alertas de notificaciones en la barra de estado</li>
@ -701,7 +706,7 @@
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Optimizadas las consultas a la base de datos</li> <li type="disc">Optimizadas las consultas a la base de datos</li>
</ul> </ul>
<h4>0.7.1 (2012-01-11)</h4> <h4>0.7.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Mejorada la velocidad de renderizado de las calificaciones</li> <li type="disc">Mejorada la velocidad de renderizado de las calificaciones</li>
@ -710,14 +715,14 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregidos errores de renderizado en las calificaciones</li> <li type="disc">Corregidos errores de renderizado en las calificaciones</li>
</ul> </ul>
<h4>0.7 (2012-01-10)</h4> <h4>0.7<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida visualizaci&oacute;n de las calificaciones al pulsar sobre la <li type="disc">A&ntilde;adida visualizaci&oacute;n de las calificaciones al pulsar sobre la
notificaci&oacute;n asociada notificaci&oacute;n asociada
</li> </li>
</ul> </ul>
<h4>0.6.2 (2011-12-09)</h4> <h4>0.6.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido enlace al blog de la aplicaci&oacute;n en la pantalla de <li type="disc">A&ntilde;adido enlace al blog de la aplicaci&oacute;n en la pantalla de
@ -732,7 +737,7 @@
</li> </li>
<li type="disc">Cambios menores en los mensajes de error</li> <li type="disc">Cambios menores en los mensajes de error</li>
</ul> </ul>
<h4>0.6.1 (2011-11-16)</h4> <h4>0.6.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido enlace a la p&aacute;gina de Google+ de la <li type="disc">A&ntilde;adido enlace a la p&aacute;gina de Google+ de la
@ -747,7 +752,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido el funcionamiento del men&uacute; de opciones</li> <li type="disc">Corregido el funcionamiento del men&uacute; de opciones</li>
</ul> </ul>
<h4>0.6 (2011-11-06)</h4> <h4>0.6<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida compatibilidad con Android 4.0</li> <li type="disc">A&ntilde;adida compatibilidad con Android 4.0</li>
@ -759,7 +764,7 @@
</li> </li>
<li type="disc">A&ntilde;adido autor de SWAD en la pantalla de configuraci&oacute;n</li> <li type="disc">A&ntilde;adido autor de SWAD en la pantalla de configuraci&oacute;n</li>
</ul> </ul>
<h4>0.5.2 (2011-09-29)</h4> <h4>0.5.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido el nombre real de los destinatarios en el mensaje "Mensaje <li type="disc">A&ntilde;adido el nombre real de los destinatarios en el mensaje "Mensaje
@ -774,12 +779,12 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error en la descarga de las preguntas de test</li> <li type="disc">Corregido error en la descarga de las preguntas de test</li>
</ul> </ul>
<h4>0.5.1 (2011-09-26)</h4> <h4>0.5.1<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error al responder mensajes</li> <li type="disc">Corregido error al responder mensajes</li>
</ul> </ul>
<h4>0.5 (2011-09-26)</h4> <h4>0.5<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo de env&iacute;o de mensajes</li> <li type="disc">A&ntilde;adido m&oacute;dulo de env&iacute;o de mensajes</li>
@ -788,17 +793,17 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correcciones menores</li> <li type="disc">Correcciones menores</li>
</ul> </ul>
<h4>0.4.5 (2011-07-08)</h4> <h4>0.4.5<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Optimizada la descarga de las preguntas de test</li> <li type="disc">Optimizada la descarga de las preguntas de test</li>
</ul> </ul>
<h4>0.4.4 (2011-07-05)</h4> <h4>0.4.4<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correccoines menores</li> <li type="disc">Correccoines menores</li>
</ul> </ul>
<h4>0.4.3 (2011-06-15)</h4> <h4>0.4.3<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">mejorada la vissualizaci&oacute;n de los tests</li> <li type="disc">mejorada la vissualizaci&oacute;n de los tests</li>
@ -807,7 +812,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correcciones menores</li> <li type="disc">Correcciones menores</li>
</ul> </ul>
<h4>0.4.2 (2011-06-15)</h4> <h4>0.4.2<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Ahora las preguntas no contestadas punt&uacute;an como 0</li> <li type="disc">Ahora las preguntas no contestadas punt&uacute;an como 0</li>
@ -816,7 +821,7 @@
</li> </li>
<li type="disc">mejoras en la cisualizaci&oacute;n de los tests</li> <li type="disc">mejoras en la cisualizaci&oacute;n de los tests</li>
</ul> </ul>
<h4>0.4.1 (2011-06-14)</h4> <h4>0.4.1<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Se permiten puntuacioes negativas en los tests</li> <li type="disc">Se permiten puntuacioes negativas en los tests</li>
@ -825,7 +830,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correcifo error al descargar las preguntas de test</li> <li type="disc">Correcifo error al descargar las preguntas de test</li>
</ul> </ul>
<h4>0.4 (2011-06-13)</h4> <h4>0.4<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo de Tests</li> <li type="disc">A&ntilde;adido m&oacute;dulo de Tests</li>
@ -834,7 +839,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correcciones menores</li> <li type="disc">Correcciones menores</li>
</ul> </ul>
<h4>0.3.10 (2011-05-19)</h4> <h4>0.3.10<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidas notificaciones de actividades, encuestas y notificaciones <li type="disc">A&ntilde;adidas notificaciones de actividades, encuestas y notificaciones
@ -848,28 +853,28 @@
</li> </li>
<li type="disc">A&ntilde;adido mensaje de error de credenciales err&oacute;neas</li> <li type="disc">A&ntilde;adido mensaje de error de credenciales err&oacute;neas</li>
</ul> </ul>
<h4>0.3.9 (2011-05-03)</h4> <h4>0.3.9<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error de campos vac&iacute;os en las notificaciones</li> <li type="disc">Corregido error de campos vac&iacute;os en las notificaciones</li>
</ul> </ul>
<h4>0.3.8 (2011-04-27)</h4> <h4>0.3.8<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error al borrar las notificaciones antiguas</li> <li type="disc">Corregido error al borrar las notificaciones antiguas</li>
</ul> </ul>
<h4>0.3.7 (2011-04-14)</h4> <h4>0.3.7<h4>
<ul> <ul>
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregido error en el apellido de las notificaciones</li> <li type="disc">Corregido error en el apellido de las notificaciones</li>
</ul> </ul>
<h4>0.3.6 (2011-04-13)</h4> <h4>0.3.6<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adidos detalles de las notificaciones</li> <li type="disc">A&ntilde;adidos detalles de las notificaciones</li>
<li type="disc">A&ntilde;adido mensaje de actualizaci&oacute;n de la aplicaci&oacute;n</li> <li type="disc">A&ntilde;adido mensaje de actualizaci&oacute;n de la aplicaci&oacute;n</li>
</ul> </ul>
<h4>0.3.5 (2011-04-05)</h4> <h4>0.3.5<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida barra de acci&oacute;n</li> <li type="disc">A&ntilde;adida barra de acci&oacute;n</li>
@ -882,7 +887,7 @@
<li type="disc">Mejorada la interfaz de usuario</li> <li type="disc">Mejorada la interfaz de usuario</li>
<li type="disc">Mejoras de rendimiento</li> <li type="disc">Mejoras de rendimiento</li>
</ul> </ul>
<h4>0.3.4 (2011-03-27)</h4> <h4>0.3.4<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Mejorada la interfaz de usuario</li> <li type="disc">Mejorada la interfaz de usuario</li>
@ -891,12 +896,12 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregidos errores menores en los mensajes de error</li> <li type="disc">Corregidos errores menores en los mensajes de error</li>
</ul> </ul>
<h4>0.3.3 (2011-03-27)</h4> <h4>0.3.3<h4>
<ul> <ul>
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">Redise&ntilde;ada la interfaz de usuario</li> <li type="disc">Redise&ntilde;ada la interfaz de usuario</li>
</ul> </ul>
<h4>0.3.2 (2011-03-24)</h4> <h4>0.3.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido cuadro de di&aacute;logo de primer inicio de la aplicaci&oacute;n</li> <li type="disc">A&ntilde;adido cuadro de di&aacute;logo de primer inicio de la aplicaci&oacute;n</li>
@ -905,7 +910,7 @@
<lh class="update">[ACTUALIZACIONES]</lh> <lh class="update">[ACTUALIZACIONES]</lh>
<li type="disc">mejorada la pantalla de configuraci&oacute;n</li> <li type="disc">mejorada la pantalla de configuraci&oacute;n</li>
</ul> </ul>
<h4>0.3.1 (2011-03-21)</h4> <h4>0.3.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido guardado autom&aacute;tico de la configuraci&oacute;n</li> <li type="disc">A&ntilde;adido guardado autom&aacute;tico de la configuraci&oacute;n</li>
@ -921,13 +926,13 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Corregidos problemas de compatibilidad con algunos dispositivos</li> <li type="disc">Corregidos problemas de compatibilidad con algunos dispositivos</li>
</ul> </ul>
<h4>0.3 (2011-03-08)</h4> <h4>0.3<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido m&oacute;dulo de Notificaciones</li> <li type="disc">A&ntilde;adido m&oacute;dulo de Notificaciones</li>
<li type="disc">A&ntilde;adida compatibilidad con Android 3.0 Honeycomb</li> <li type="disc">A&ntilde;adida compatibilidad con Android 3.0 Honeycomb</li>
</ul> </ul>
<h4>0.2.2 (2011-01-18)</h4> <h4>0.2.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida comprobaci&oacute;n de la conexi&oacute;n a Internet</li> <li type="disc">A&ntilde;adida comprobaci&oacute;n de la conexi&oacute;n a Internet</li>
@ -944,13 +949,13 @@
<li type="disc">Corregidos los iconos del lanzador</li> <li type="disc">Corregidos los iconos del lanzador</li>
<li type="disc">Corregidos problemas de compatibilidad con Android 1.6</li> <li type="disc">Corregidos problemas de compatibilidad con Android 1.6</li>
</ul> </ul>
<h4>0.2.1 (2010-12-15)</h4> <h4>0.2.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida compatibilidad con Android 2.3 Gingerbread</li> <li type="disc">A&ntilde;adida compatibilidad con Android 2.3 Gingerbread</li>
<li type="disc">Completado el m&oacute;dulo de Login</li> <li type="disc">Completado el m&oacute;dulo de Login</li>
</ul> </ul>
<h4>0.2 (2010-12-08)</h4> <h4>0.2<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adido cierre de sesi&oacute;n autom&aacute;tico cuando se modifica <li type="disc">A&ntilde;adido cierre de sesi&oacute;n autom&aacute;tico cuando se modifica
@ -958,7 +963,7 @@
</li> </li>
<li type="disc">A&ntilde;adida base de datos inicial</li> <li type="disc">A&ntilde;adida base de datos inicial</li>
</ul> </ul>
<h4>0.1.1 (2010-11-06)</h4> <h4>0.1.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">A&ntilde;adida imagen de fondo en la pantalla principal</li> <li type="disc">A&ntilde;adida imagen de fondo en la pantalla principal</li>
@ -967,7 +972,7 @@
<lh class="fix">[CORRECCIONES]</lh> <lh class="fix">[CORRECCIONES]</lh>
<li type="disc">Correcciones menores en la pantalla principal</li> <li type="disc">Correcciones menores en la pantalla principal</li>
</ul> </ul>
<h4>0.1 (2010-11-03)</h4> <h4>0.1<h4>
<ul> <ul>
<lh class="new">[NOVEDADES]</lh> <lh class="new">[NOVEDADES]</lh>
<li type="disc">Versi&oacute;n inicial</li> <li type="disc">Versi&oacute;n inicial</li>

View File

@ -18,22 +18,27 @@
</head> </head>
<body bgcolor="white"><!-- <body bgcolor="white"><!--
<h4>1.6.0 (upcoming)</h4> <h4>1.6.0</h4>
<ul> <ul>
<li type="disc">Added indoor location module</li> <li type="disc">Added indoor location module</li>
</ul>--> </ul>-->
<h4>1.5.8 (2022-05-23)</h4> <h4>1.5.9</h4>
<ul>
<li type="disc">Added support for background notification download when power save mode is enabled</li>
</ul>
<h4>1.5.8<h4>
<ul> <ul>
<li type="disc">Fixed notifications downloads on Android 12 (S)</li> <li type="disc">Fixed notifications downloads on Android 12 (S)</li>
</ul> </ul>
<h4>1.5.7 (2020-12-19)</h4> <h4>1.5.7<h4>
<ul> <ul>
<li type="disc">Fixed file downloads on Android R</li> <li type="disc">Fixed file downloads on Android R</li>
</ul> </ul>
<h4>1.5.6 (2019-11-05)</h4> <h4>1.5.6<h4>
<ul> <ul>
<li type="disc"> <li type="disc">
<strong>Rollcall:</strong> <strong>Rollcall:</strong>
@ -41,13 +46,13 @@
</li> </li>
</ul> </ul>
<h4>1.5.5 (2019-07-08)</h4> <h4>1.5.5<h4>
<ul> <ul>
<li type="disc">Added support for Android-Q</li> <li type="disc">Added support for Android-Q</li>
<li type="disc">Fixed CHANGELOG typos</li> <li type="disc">Fixed CHANGELOG typos</li>
</ul> </ul>
<h4>1.5.4 (2018-02-25)</h4> <h4>1.5.4<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc"> <li type="disc">
@ -56,13 +61,13 @@
</li> </li>
</ul> </ul>
<h4>1.5.3 (2017-10-25)</h4> <h4>1.5.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added compatibility for Android Oreo notifications system</li> <li type="disc">Added compatibility for Android Oreo notifications system</li>
</ul> </ul>
<h4>1.5.2 (2017-02-12)</h4> <h4>1.5.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added privacy policy in Preferences screen</li> <li type="disc">Added privacy policy in Preferences screen</li>
@ -73,12 +78,12 @@
files, such as Documents, Shared and Marks, are now available in the new Files folder files, such as Documents, Shared and Marks, are now available in the new Files folder
</li> </li>
</ul> </ul>
<h4>1.5.1 (2017-01-21)</h4> <h4>1.5.1<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed unparseable date: &quot;anyType{}&quot;(at offset 0) error</li> <li type="disc">Fixed unparseable date: &quot;anyType{}&quot;(at offset 0) error</li>
</ul> </ul>
<h4>1.5.0 (2016-09-01)</h4> <h4>1.5.0<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc"> <li type="disc">
@ -86,7 +91,7 @@
Added search of recipients Added search of recipients
</li> </li>
</ul> </ul>
<h4>1.4.0 (2016-07-25)</h4> <h4>1.4.0<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc"> <li type="disc">
@ -101,7 +106,7 @@
Fixed consultation of marks from the student role Fixed consultation of marks from the student role
</li> </li>
</ul> </ul>
<h4>1.3.4 (2016-07-17)</h4> <h4>1.3.4<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc"> <li type="disc">
@ -122,7 +127,7 @@
Minor improvements Minor improvements
</li> </li>
</ul> </ul>
<h4>1.3.3 (2016-01-31)</h4> <h4>1.3.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added social notifications</li> <li type="disc">Added social notifications</li>
@ -133,18 +138,18 @@
Now notifications are automatically removed with greater age than 30 days Now notifications are automatically removed with greater age than 30 days
</li> </li>
</ul> </ul>
<h4>1.3.2 (2016-01-06)</h4> <h4>1.3.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added permission management on Android 6.0 Marshmallow</li> <li type="disc">Added permission management on Android 6.0 Marshmallow</li>
</ul> </ul>
<h4>1.3.1 (2015-12-06)</h4> <h4>1.3.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improvements on login screen and create account screen</li> <li type="disc">Improvements on login screen and create account screen</li>
<li type="disc">Now canceled notifications are not downloaded during synchronization</li> <li type="disc">Now canceled notifications are not downloaded during synchronization</li>
</ul> </ul>
<h4>1.3 (2015-09-03)</h4> <h4>1.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added creation of user accounts</li> <li type="disc">Added creation of user accounts</li>
@ -154,13 +159,13 @@
(partial in tests) (partial in tests)
</li> </li>
</ul> </ul>
<h4>1.2.4 (2015-03-15)</h4> <h4>1.2.4<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Changed scan delay of codes to one second</li> <li type="disc">Changed scan delay of codes to one second</li>
<li type="disc">Now the Downloads module requires Android 3.0 or higher</li> <li type="disc">Now the Downloads module requires Android 3.0 or higher</li>
</ul> </ul>
<h4>1.2.3 (2014-11-30)</h4> <h4>1.2.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added support for barcode scanning in rollcall module</li> <li type="disc">Added support for barcode scanning in rollcall module</li>
@ -170,7 +175,7 @@
<li type="disc">Now the events list is sorted in rollcall module</li> <li type="disc">Now the events list is sorted in rollcall module</li>
<li type="disc">Changed scan delay of codes to 2 seconds</li> <li type="disc">Changed scan delay of codes to 2 seconds</li>
</ul> </ul>
<h4>1.2.2 (2014-11-26)</h4> <h4>1.2.2<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Disabled lateral sliding of notifications</li> <li type="disc">Disabled lateral sliding of notifications</li>
@ -181,7 +186,7 @@
<li type="disc">Fixed screen refresh of users and attendances lists</li> <li type="disc">Fixed screen refresh of users and attendances lists</li>
<li type="disc">Now the relationship between events and courses is handled properly</li> <li type="disc">Now the relationship between events and courses is handled properly</li>
</ul> </ul>
<h4>1.2.1 (2014-11-24)</h4> <h4>1.2.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Now you can send empty attendance listings to mark all attendees as <li type="disc">Now you can send empty attendance listings to mark all attendees as
@ -192,23 +197,23 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed screen refresh of attendances list</li> <li type="disc">Fixed screen refresh of attendances list</li>
</ul> </ul>
<h4>1.2 (2014-11-23)</h4> <h4>1.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added birthday greetings</li> <li type="disc">Added birthday greetings</li>
<li type="disc">Added rollcall module with sending of attendances to SWAD</li> <li type="disc">Added rollcall module with sending of attendances to SWAD</li>
</ul> </ul>
<h4>1.1.4 (2014-11-11)</h4> <h4>1.1.4<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed download of notifications due to changes in SWAD</li> <li type="disc">Fixed download of notifications due to changes in SWAD</li>
</ul> </ul>
<h4>1.1.3 (2014-10-05)</h4> <h4>1.1.3<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed wrong update of notifications when sliding up the list</li> <li type="disc">Fixed wrong update of notifications when sliding up the list</li>
</ul> </ul>
<h4>1.1.2 (2014-09-18)</h4> <h4>1.1.2<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improvements in error messages</li> <li type="disc">Improvements in error messages</li>
@ -220,7 +225,7 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed typos in changelog</li> <li type="disc">Fixed typos in changelog</li>
</ul> </ul>
<h4>1.1.1 (2014-09-16)</h4> <h4>1.1.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Now the lateral sliding of the notifications is only available for Android <li type="disc">Now the lateral sliding of the notifications is only available for Android
@ -233,7 +238,7 @@
without being on top of it without being on top of it
</li> </li>
</ul> </ul>
<h4>1.1 (2014-09-08)</h4> <h4>1.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Now the notifications are grouped into <li type="disc">Now the notifications are grouped into
@ -260,7 +265,7 @@
</li> </li>
<li type="disc">Fixed crash for open downloaded files with no apps to open with</li> <li type="disc">Fixed crash for open downloaded files with no apps to open with</li>
</ul> </ul>
<h4>1.0 (2014-03-26)</h4> <h4>1.0<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">New GUI Holo style</li> <li type="disc">New GUI Holo style</li>
@ -276,7 +281,7 @@
<li type="disc">Disabled rollcall module (pending redesign and integration with SWAD)</li> <li type="disc">Disabled rollcall module (pending redesign and integration with SWAD)</li>
<li type="disc">Removed unused languages</li> <li type="disc">Removed unused languages</li>
</ul> </ul>
<h4>0.13 (2014-02-02)</h4> <h4>0.13<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added login screen</li> <li type="disc">Added login screen</li>
@ -287,7 +292,7 @@
when automatic synchronization is enabled when automatic synchronization is enabled
</li> </li>
</ul> </ul>
<h4>0.12.7 (2013-12-14)</h4> <h4>0.12.7<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added info of seen notifications from SWAD on notifications download</li> <li type="disc">Added info of seen notifications from SWAD on notifications download</li>
@ -300,7 +305,7 @@
<li type="disc">Fixed error retrieving the list of students on the rollcall module</li> <li type="disc">Fixed error retrieving the list of students on the rollcall module</li>
<li type="disc">Fixed error retrieving the tests configuration</li> <li type="disc">Fixed error retrieving the tests configuration</li>
</ul> </ul>
<h4>0.12.6 (2013-11-24)</h4> <h4>0.12.6<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added management of seen notifications</li> <li type="disc">Added management of seen notifications</li>
@ -317,17 +322,17 @@
<li type="disc">Fixed black background color when the notifications list is being pulled <li type="disc">Fixed black background color when the notifications list is being pulled
</li> </li>
</ul> </ul>
<h4>0.12.5 (2013-11-10)</h4> <h4>0.12.5<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug that prevented replying messages</li> <li type="disc">Fixed bug that prevented replying messages</li>
</ul> </ul>
<h4>0.12.4 (2013-11-09)</h4> <h4>0.12.4<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug that prevented consulting practice sessions</li> <li type="disc">Fixed bug that prevented consulting practice sessions</li>
</ul> </ul>
<h4>0.12.3 (2013-11-09)</h4> <h4>0.12.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added pull-to-refresh update system to the notifications</li> <li type="disc">Added pull-to-refresh update system to the notifications</li>
@ -357,12 +362,12 @@
<li type="disc">Fixed a bug when trying to download an user picture from an empty URL</li> <li type="disc">Fixed a bug when trying to download an user picture from an empty URL</li>
<li type="disc">Fixed display bug on number of questions input of the tests</li> <li type="disc">Fixed display bug on number of questions input of the tests</li>
</ul> </ul>
<h4>0.12.2 (2013-06-19)</h4> <h4>0.12.2<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Updated communications with server</li> <li type="disc">Updated communications with server</li>
</ul> </ul>
<h4>0.12.1 (2013-06-09)</h4> <h4>0.12.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added forumPostCourse notification type</li> <li type="disc">Added forumPostCourse notification type</li>
@ -387,7 +392,7 @@
<li type="disc">Fixed error messages display</li> <li type="disc">Fixed error messages display</li>
<li type="disc">Modified NULL value detection in server response</li> <li type="disc">Modified NULL value detection in server response</li>
</ul> </ul>
<h4>0.12 (2013-04-20)</h4> <h4>0.12<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added new notification types "documentFile", "sharedFile", "enrollment" and <li type="disc">Added new notification types "documentFile", "sharedFile", "enrollment" and
@ -429,7 +434,7 @@
</li> </li>
<li type="disc">Fixed non decimal keyboard type for decimal numbers on some devices</li> <li type="disc">Fixed non decimal keyboard type for decimal numbers on some devices</li>
</ul> </ul>
<h4>0.11.3 (2013-03-03)</h4> <h4>0.11.3<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Shows default server in preference summary when the preference value is <li type="disc">Shows default server in preference summary when the preference value is
@ -443,7 +448,7 @@
preferences change preferences change
</li> </li>
</ul> </ul>
<h4>0.11.2 (2013-02-24)</h4> <h4>0.11.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added refresh button on main screen to update courses without clean the <li type="disc">Added refresh button on main screen to update courses without clean the
@ -466,7 +471,7 @@
behaviour is exactly the opposite in Android 4.2) behaviour is exactly the opposite in Android 4.2)
</li> </li>
</ul> </ul>
<h4>0.11.1 (2013-01-26)</h4> <h4>0.11.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added compatibility with screens with basic touch capabilities</li> <li type="disc">Added compatibility with screens with basic touch capabilities</li>
@ -492,7 +497,7 @@
descriptors descriptors
</li> </li>
</ul> </ul>
<h4>0.11 (2012-12-15)</h4> <h4>0.11<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added downloads module</li> <li type="disc">Added downloads module</li>
@ -504,7 +509,7 @@
functions in SWAD functions in SWAD
</li> </li>
</ul> </ul>
<h4>0.10.1 (2012-11-17)</h4> <h4>0.10.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added Android 4.2 compatibility</li> <li type="disc">Added Android 4.2 compatibility</li>
@ -521,7 +526,7 @@
<li type="disc">Fixed available choose for groups with real membership</li> <li type="disc">Fixed available choose for groups with real membership</li>
<li type="disc">Fixed problem with uppercase letter in notifications without summary</li> <li type="disc">Fixed problem with uppercase letter in notifications without summary</li>
</ul> </ul>
<h4>0.10 (2012-11-09)</h4> <h4>0.10<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added module for enrollment to course groups</li> <li type="disc">Added module for enrollment to course groups</li>
@ -539,7 +544,7 @@
<li type="disc">Fixed some bugs in course selection spinner</li> <li type="disc">Fixed some bugs in course selection spinner</li>
<li type="disc">Fixed bug when checking available connections</li> <li type="disc">Fixed bug when checking available connections</li>
</ul> </ul>
<h4>0.9.3 (2012-07-20)</h4> <h4>0.9.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added folders support in server URL</li> <li type="disc">Added folders support in server URL</li>
@ -548,14 +553,14 @@
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved error messages</li> <li type="disc">Improved error messages</li>
</ul> </ul>
<h4>0.9.2 (2012-07-10)</h4> <h4>0.9.2<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">camera.autofocus feature marked as optional in order to fix device <li type="disc">camera.autofocus feature marked as optional in order to fix device
incompatibilities incompatibilities
</li> </li>
</ul> </ul>
<h4>0.9.1 (2012-07-09)</h4> <h4>0.9.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added DNI with letter (first and last) support and DNI with zeros support <li type="disc">Added DNI with letter (first and last) support and DNI with zeros support
@ -566,17 +571,17 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed xlarge screens support</li> <li type="disc">Fixed xlarge screens support</li>
</ul> </ul>
<h4>0.9 (2012-07-01)</h4> <h4>0.9<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added RollCall module</li> <li type="disc">Added RollCall module</li>
</ul> </ul>
<h4>0.8.1 (2012-05-20)</h4> <h4>0.8.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added message replys from open notifications</li> <li type="disc">Added message replys from open notifications</li>
</ul> </ul>
<h4>0.8 (2012-05-01)</h4> <h4>0.8<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added automatic synchronization of notifications</li> <li type="disc">Added automatic synchronization of notifications</li>
@ -597,7 +602,7 @@
<li type="disc">Fixed HTML bug in location field of notifications</li> <li type="disc">Fixed HTML bug in location field of notifications</li>
<li type="disc">Fixed br tag bug in notifications</li> <li type="disc">Fixed br tag bug in notifications</li>
</ul> </ul>
<h4>0.7.2 (2012-02-22)</h4> <h4>0.7.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added notification alerts on status bar</li> <li type="disc">Added notification alerts on status bar</li>
@ -607,7 +612,7 @@
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved query statements</li> <li type="disc">Improved query statements</li>
</ul> </ul>
<h4>0.7.1 (2012-01-11)</h4> <h4>0.7.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved rendering speed in marks function</li> <li type="disc">Improved rendering speed in marks function</li>
@ -616,12 +621,12 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed rendering errors in marks function</li> <li type="disc">Fixed rendering errors in marks function</li>
</ul> </ul>
<h4>0.7 (2012-01-10)</h4> <h4>0.7<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added marks function in notifications module</li> <li type="disc">Added marks function in notifications module</li>
</ul> </ul>
<h4>0.6.2 (2011-12-09)</h4> <h4>0.6.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added Blog URL to preferences screen</li> <li type="disc">Added Blog URL to preferences screen</li>
@ -632,7 +637,7 @@
<li type="disc">Reinitialized last course selected on database cleaning</li> <li type="disc">Reinitialized last course selected on database cleaning</li>
<li type="disc">Minor changes on error messages</li> <li type="disc">Minor changes on error messages</li>
</ul> </ul>
<h4>0.6.1 (2011-11-16)</h4> <h4>0.6.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added Google+ account to preferences screen</li> <li type="disc">Added Google+ account to preferences screen</li>
@ -645,7 +650,7 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed menu operation in all activities</li> <li type="disc">Fixed menu operation in all activities</li>
</ul> </ul>
<h4>0.6 (2011-11-06)</h4> <h4>0.6<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added Android 4.0 compatibility</li> <li type="disc">Added Android 4.0 compatibility</li>
@ -653,7 +658,7 @@
<li type="disc">Added clean database option to application menu</li> <li type="disc">Added clean database option to application menu</li>
<li type="disc">Added name of SWAD's creator to author preferences</li> <li type="disc">Added name of SWAD's creator to author preferences</li>
</ul> </ul>
<h4>0.5.2 (2011-09-29)</h4> <h4>0.5.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added real names of receivers in "Message Sent" toast</li> <li type="disc">Added real names of receivers in "Message Sent" toast</li>
@ -666,12 +671,12 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug on test questions syncronization</li> <li type="disc">Fixed bug on test questions syncronization</li>
</ul> </ul>
<h4>0.5.1 (2011-09-26)</h4> <h4>0.5.1<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug in reply messages function</li> <li type="disc">Fixed bug in reply messages function</li>
</ul> </ul>
<h4>0.5 (2011-09-26)</h4> <h4>0.5<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added messages module</li> <li type="disc">Added messages module</li>
@ -680,17 +685,17 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Minor fixes</li> <li type="disc">Minor fixes</li>
</ul> </ul>
<h4>0.4.5 (2011-07-08)</h4> <h4>0.4.5<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Optimized questions syncronization</li> <li type="disc">Optimized questions syncronization</li>
</ul> </ul>
<h4>0.4.4 (2011-07-05)</h4> <h4>0.4.4<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Minor fixes</li> <li type="disc">Minor fixes</li>
</ul> </ul>
<h4>0.4.3 (2011-06-15)</h4> <h4>0.4.3<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved tests GUI</li> <li type="disc">Improved tests GUI</li>
@ -699,7 +704,7 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Minor fixes</li> <li type="disc">Minor fixes</li>
</ul> </ul>
<h4>0.4.2 (2011-06-15)</h4> <h4>0.4.2<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Now not answered questions score as 0</li> <li type="disc">Now not answered questions score as 0</li>
@ -708,7 +713,7 @@
</li> </li>
<li type="disc">Improved tests GUI</li> <li type="disc">Improved tests GUI</li>
</ul> </ul>
<h4>0.4.1 (2011-06-14)</h4> <h4>0.4.1<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Allowed negative scores on tests</li> <li type="disc">Allowed negative scores on tests</li>
@ -717,7 +722,7 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug on questions syncronization</li> <li type="disc">Fixed bug on questions syncronization</li>
</ul> </ul>
<h4>0.4 (2011-06-13)</h4> <h4>0.4<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added tests module</li> <li type="disc">Added tests module</li>
@ -726,7 +731,7 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Minor fixes</li> <li type="disc">Minor fixes</li>
</ul> </ul>
<h4>0.3.10 (2011-05-19)</h4> <h4>0.3.10<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added assignment, survey and unknown notifications</li> <li type="disc">Added assignment, survey and unknown notifications</li>
@ -734,28 +739,28 @@
<li type="disc">Added forced relogin if connection time exceeds a certain period</li> <li type="disc">Added forced relogin if connection time exceeds a certain period</li>
<li type="disc">Added incorrect user or password error message</li> <li type="disc">Added incorrect user or password error message</li>
</ul> </ul>
<h4>0.3.9 (2011-05-03)</h4> <h4>0.3.9<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed empty fields bug on notifications module</li> <li type="disc">Fixed empty fields bug on notifications module</li>
</ul> </ul>
<h4>0.3.8 (2011-04-27)</h4> <h4>0.3.8<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed bug on cleaning old notifications</li> <li type="disc">Fixed bug on cleaning old notifications</li>
</ul> </ul>
<h4>0.3.7 (2011-04-14)</h4> <h4>0.3.7<h4>
<ul> <ul>
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed notifications bug in surname</li> <li type="disc">Fixed notifications bug in surname</li>
</ul> </ul>
<h4>0.3.6 (2011-04-13)</h4> <h4>0.3.6<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added notification details</li> <li type="disc">Added notification details</li>
<li type="disc">Added upgrade dialog</li> <li type="disc">Added upgrade dialog</li>
</ul> </ul>
<h4>0.3.5 (2011-04-05)</h4> <h4>0.3.5<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added action bar</li> <li type="disc">Added action bar</li>
@ -766,7 +771,7 @@
<li type="disc">Improved GUI</li> <li type="disc">Improved GUI</li>
<li type="disc">Improved performance</li> <li type="disc">Improved performance</li>
</ul> </ul>
<h4>0.3.4 (2011-03-27)</h4> <h4>0.3.4<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved GUI</li> <li type="disc">Improved GUI</li>
@ -775,12 +780,12 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed minor errors on error messages</li> <li type="disc">Fixed minor errors on error messages</li>
</ul> </ul>
<h4>0.3.3 (2011-03-27)</h4> <h4>0.3.3<h4>
<ul> <ul>
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Redesigned GUI</li> <li type="disc">Redesigned GUI</li>
</ul> </ul>
<h4>0.3.2 (2011-03-24)</h4> <h4>0.3.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added first run dialog</li> <li type="disc">Added first run dialog</li>
@ -789,7 +794,7 @@
<lh class="update">[UPDATES]</lh> <lh class="update">[UPDATES]</lh>
<li type="disc">Improved preferences screen</li> <li type="disc">Improved preferences screen</li>
</ul> </ul>
<h4>0.3.1 (2011-03-21)</h4> <h4>0.3.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added automatic saving of preferences</li> <li type="disc">Added automatic saving of preferences</li>
@ -804,13 +809,13 @@
<lh class="fix">[FIXES]</lh> <lh class="fix">[FIXES]</lh>
<li type="disc">Fixed compatibility issues with some devices</li> <li type="disc">Fixed compatibility issues with some devices</li>
</ul> </ul>
<h4>0.3 (2011-03-08)</h4> <h4>0.3<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added notifications module</li> <li type="disc">Added notifications module</li>
<li type="disc">Added Android 3.0 Honeycomb compatibility</li> <li type="disc">Added Android 3.0 Honeycomb compatibility</li>
</ul> </ul>
<h4>0.2.2 (2011-01-18)</h4> <h4>0.2.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added connection check</li> <li type="disc">Added connection check</li>
@ -827,19 +832,19 @@
<li type="disc">Fixed launcher icons</li> <li type="disc">Fixed launcher icons</li>
<li type="disc">Fixed Android 1.6 compatibility issues</li> <li type="disc">Fixed Android 1.6 compatibility issues</li>
</ul> </ul>
<h4>0.2.1 (2010-12-15)</h4> <h4>0.2.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added Android 2.3 Gingerbread compatibility</li> <li type="disc">Added Android 2.3 Gingerbread compatibility</li>
<li type="disc">Completed login module</li> <li type="disc">Completed login module</li>
</ul> </ul>
<h4>0.2 (2010-12-08)</h4> <h4>0.2<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added auto logout when user id or password changes</li> <li type="disc">Added auto logout when user id or password changes</li>
<li type="disc">Added initial database</li> <li type="disc">Added initial database</li>
</ul> </ul>
<h4>0.1.1 (2010-11-06)</h4> <h4>0.1.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">Added background image to main activity</li> <li type="disc">Added background image to main activity</li>
@ -848,7 +853,7 @@
<lh class="fix">[Fixes]</lh> <lh class="fix">[Fixes]</lh>
<li type="disc">Minor fixes on main screen</li> <li type="disc">Minor fixes on main screen</li>
</ul> </ul>
<h4>0.1 (2010-11-03)</h4> <h4>0.1<h4>
<ul> <ul>
<lh class="new">[NEW]</lh> <lh class="new">[NEW]</lh>
<li type="disc">First release</li> <li type="disc">First release</li>

View File

@ -356,4 +356,5 @@
<string name="checkIn">Hora</string> <string name="checkIn">Hora</string>
<string name="lostLocation">Ubicación no encontrada</string> <string name="lostLocation">Ubicación no encontrada</string>
<string name="nearestLocation">Punto de acceso inalámbrico más cercano</string> <string name="nearestLocation">Punto de acceso inalámbrico más cercano</string>
<string name="appRunningBackground">SWADroid se está ejecutando</string>
</resources> </resources>

View File

@ -372,4 +372,5 @@
<string name="checkIn">Time</string> <string name="checkIn">Time</string>
<string name="lostLocation">Location not found</string> <string name="lostLocation">Location not found</string>
<string name="nearestLocation">Nearest wireless access point</string> <string name="nearestLocation">Nearest wireless access point</string>
<string name="appRunningBackground">SWADroid is running</string>
</resources> </resources>

View File

@ -66,26 +66,6 @@
android:key="sharePref" android:key="sharePref"
android:summary="@string/shareBodyMsg" android:summary="@string/shareBodyMsg"
android:title="@string/shareTitle_menu" /> android:title="@string/shareTitle_menu" />
<Preference
android:defaultValue=""
android:key="blogPref"
android:summary="@string/blogURL"
android:title="@string/blogTitle" />
<Preference
android:defaultValue=""
android:key="twitterPref"
android:summary="@string/twitterUser"
android:title="@string/twitterTitle" />
<Preference
android:defaultValue=""
android:key="facebookPref"
android:summary="@string/facebookURL"
android:title="@string/facebookTitle" />
<Preference
android:defaultValue=""
android:key="telegramPref"
android:summary="@string/telegramURL"
android:title="@string/telegramTitle" />
<Preference <Preference
android:defaultValue="" android:defaultValue=""
android:key="privacyPolicyPref" android:key="privacyPolicyPref"