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

## 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.READ_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.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
android:name="android.hardware.touchscreen"
@ -49,7 +52,6 @@
<activity
android:name="es.ugr.swad.swadroid.SWADMain"
android:icon="@drawable/ic_launcher_swadroid"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -366,6 +368,26 @@
android:resource="@xml/sync_notifications" />
</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
android:name="androidx.core.content.FileProvider"
android:authorities="es.ugr.swad.swadroid.fileprovider"

View File

@ -267,6 +267,10 @@ public class Constants {
* Request code for PERMISSION_MULTIPLE permissions
*/
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
*/

View File

@ -19,11 +19,14 @@
package es.ugr.swad.swadroid;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@ -43,6 +46,10 @@ import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
@ -50,6 +57,7 @@ import java.util.List;
import java.util.Map;
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.MenuExpandableListActivity;
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.downloads.DownloadsManager;
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.information.Information;
import es.ugr.swad.swadroid.modules.login.Login;
import es.ugr.swad.swadroid.modules.login.LoginActivity;
import es.ugr.swad.swadroid.modules.messages.Messages;
@ -166,6 +174,11 @@ public class SWADMain extends MenuExpandableListActivity {
initializeMainViews();
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
lastVersion = Preferences.getLastVersion();
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)
* @see android.app.Activity#onResume()

View File

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

View File

@ -19,7 +19,6 @@
package es.ugr.swad.swadroid.modules.notifications;
import android.accounts.Account;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Notification;
import android.app.PendingIntent;
@ -28,9 +27,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@ -42,6 +39,8 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.ksoap2.serialization.SoapObject;
import java.util.ArrayList;
@ -142,48 +141,44 @@ public class Notifications extends Module implements
/**
* 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
*/
private int SEEN_GROUP_ID = 1;
private final int SEEN_GROUP_ID = 1;
/**
* ListView click listener
*/
private OnChildClickListener clickListener = new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
TextView notifCode = (TextView) v.findViewById(R.id.notifCode);
TextView code = (TextView) v.findViewById(R.id.eventCode);
TextView type = (TextView) v.findViewById(R.id.eventType);
TextView userPhoto = (TextView) v.findViewById(R.id.eventUserPhoto);
TextView sender = (TextView) v.findViewById(R.id.eventSender);
TextView course = (TextView) v.findViewById(R.id.eventLocation);
TextView summary = (TextView) v.findViewById(R.id.eventSummary);
TextView content = (TextView) v.findViewById(R.id.eventText);
TextView date = (TextView) v.findViewById(R.id.eventDate);
TextView time = (TextView) v.findViewById(R.id.eventTime);
TextView seenLocalText = (TextView) v.findViewById(R.id.seenLocal);
private final OnChildClickListener clickListener = (parent, v, groupPosition, childPosition, id) -> {
TextView notifCode = v.findViewById(R.id.notifCode);
TextView code = v.findViewById(R.id.eventCode);
TextView type = v.findViewById(R.id.eventType);
TextView userPhoto = v.findViewById(R.id.eventUserPhoto);
TextView sender = v.findViewById(R.id.eventSender);
TextView course = v.findViewById(R.id.eventLocation);
TextView summary = v.findViewById(R.id.eventSummary);
TextView content = v.findViewById(R.id.eventText);
TextView date = v.findViewById(R.id.eventDate);
TextView time = v.findViewById(R.id.eventTime);
TextView seenLocalText = v.findViewById(R.id.seenLocal);
Intent activity = new Intent(getApplicationContext(),
NotificationItem.class);
activity.putExtra("notifCode", notifCode.getText().toString());
activity.putExtra("eventCode", code.getText().toString());
activity.putExtra("notificationType", type.getText().toString());
activity.putExtra("userPhoto", userPhoto.getText().toString());
activity.putExtra("sender", sender.getText().toString());
activity.putExtra("course", course.getText().toString());
activity.putExtra("summary", summary.getText().toString());
activity.putExtra("content", content.getText().toString());
activity.putExtra("date", date.getText().toString());
activity.putExtra("time", time.getText().toString());
activity.putExtra("seenLocal", seenLocalText.getText().toString());
startActivity(activity);
return true;
}
Intent activity = new Intent(getApplicationContext(),
NotificationItem.class);
activity.putExtra("notifCode", notifCode.getText().toString());
activity.putExtra("eventCode", code.getText().toString());
activity.putExtra("notificationType", type.getText().toString());
activity.putExtra("userPhoto", userPhoto.getText().toString());
activity.putExtra("sender", sender.getText().toString());
activity.putExtra("course", course.getText().toString());
activity.putExtra("summary", summary.getText().toString());
activity.putExtra("content", content.getText().toString());
activity.putExtra("date", date.getText().toString());
activity.putExtra("time", time.getText().toString());
activity.putExtra("seenLocal", seenLocalText.getText().toString());
startActivity(activity);
return true;
};
/**
@ -280,9 +275,9 @@ public class Notifications extends Module implements
refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container_expandablelist);
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);
mBirthdayTextView = (TextView) findViewById(R.id.notifyTextView);
mBirthdayTextView = findViewById(R.id.notifyTextView);
groupItem = new ArrayList<>();
childItem = new ArrayList<>();
@ -331,7 +326,7 @@ public class Notifications extends Module implements
refreshScreen();
}
/*
* (non-Javadoc)
*
@ -406,12 +401,12 @@ public class Notifications extends Module implements
notifCount = 0;
for (int i = 0; i < numNotif; i++) {
SoapObject pii = (SoapObject) soap.getProperty(i);
Long notifCode = Long.valueOf(pii.getProperty("notifCode")
long notifCode = Long.parseLong(pii.getProperty("notifCode")
.toString());
Long eventCode = Long.valueOf(pii.getProperty(
long eventCode = Long.parseLong(pii.getProperty(
"eventCode").toString());
String eventType = pii.getProperty("eventType").toString();
Long eventTime = Long.valueOf(pii.getProperty("eventTime")
long eventTime = Long.parseLong(pii.getProperty("eventTime")
.toString());
String userNickname = pii.getProperty("userNickname")
.toString();
@ -424,7 +419,7 @@ public class Notifications extends Module implements
String userPhoto = pii.getProperty("userPhoto").toString();
String location = pii.getProperty("location").toString();
String summary = pii.getProperty("summary").toString();
Integer status = Integer.valueOf(pii.getProperty("status")
int status = Integer.parseInt(pii.getProperty("status")
.toString());
String content = pii.getProperty("content").toString();
boolean notifReadSWAD = (status >= 4);
@ -587,17 +582,14 @@ public class Notifications extends Module implements
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_markAllRead:
if (item.getItemId() == R.id.action_markAllRead) {
dbHelper.updateAllNotifications("seenLocal",
Utils.parseBoolString(true));
sendReadNotifications();
refreshScreen();
return true;
default:
return super.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
/*
@ -638,76 +630,8 @@ public class Notifications extends Module implements
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() {
refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
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.modules.login.Login;
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.webservices.IWebserviceClient;
import es.ugr.swad.swadroid.webservices.SOAPClient;
@ -72,8 +71,6 @@ import es.ugr.swad.swadroid.webservices.SOAPClient;
*/
public class NotificationsSyncAdapterService extends Service {
private static final String TAG = "NotificationsSyncAdapterService";
private static Preferences prefs;
private static SecureConnection conn;
private static SyncAdapterImpl sSyncAdapter = null;
private static int notifCount;
private static DataBaseHelper dbHelper;
@ -81,14 +78,9 @@ public class NotificationsSyncAdapterService extends Service {
private static String METHOD_NAME = "";
private static Object result;
private static String errorMessage = "";
private static boolean isConnected;
private static boolean isDebuggable;
public static final String START_SYNC = "es.ugr.swad.swadroid.sync.start";
public static final String STOP_SYNC = "es.ugr.swad.swadroid.sync.stop";
/**
* Application context
*/
private static Context mCtx;
public NotificationsSyncAdapterService() {
super();
@ -100,7 +92,6 @@ public class NotificationsSyncAdapterService extends Service {
public SyncAdapterImpl(Context context) {
super(context, true);
mContext = context;
mCtx = context;
}
@Override
@ -187,7 +178,6 @@ public class NotificationsSyncAdapterService extends Service {
*/
@Override
public void onCreate() {
isConnected = Utils.connectionAvailable(this);
// Check if debug mode is enabled
try {
getPackageManager().getApplicationInfo(
@ -198,7 +188,6 @@ public class NotificationsSyncAdapterService extends Service {
}
try {
prefs = new Preferences(this);
dbHelper = new DataBaseHelper(this);
//Initialize webservices client
webserviceClient = null;
@ -206,19 +195,57 @@ public class NotificationsSyncAdapterService extends Service {
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();
}
@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)
* @see android.app.Service#onStartCommand(android.content.Intent, int, int)
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
// return START_NOT_STICKY - we want this Service to be left running
// unless explicitly stopped, and it's process is killed, we want it to
// be restarted
return START_STICKY;
return START_REDELIVER_INTENT;
}
@Override
@ -342,10 +369,10 @@ public class NotificationsSyncAdapterService extends Service {
notifCount = 0;
for (int i = 0; i < numNotif; i++) {
SoapObject pii = (SoapObject) soap.getProperty(i);
Long notifCode = Long.valueOf(pii.getProperty("notifCode").toString());
Long eventCode = Long.valueOf(pii.getProperty("eventCode").toString());
long notifCode = Long.parseLong(pii.getProperty("notifCode").toString());
long eventCode = Long.parseLong(pii.getProperty("eventCode").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 userSurname1 = pii.getProperty("userSurname1").toString();
String userSurname2 = pii.getProperty("userSurname2").toString();
@ -353,7 +380,7 @@ public class NotificationsSyncAdapterService extends Service {
String userPhoto = pii.getProperty("userPhoto").toString();
String location = pii.getProperty("location").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();
boolean notifReadSWAD = (status >= 4);
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;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
@ -85,22 +83,6 @@ public class Preferences {
* Rate preference name
*/
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
*/
@ -177,7 +159,6 @@ public class Preferences {
/**
* Constructor
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public Preferences(Context ctx) {
getPreferences(ctx);

View File

@ -82,22 +82,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
* Rate preference
*/
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
*/
@ -180,10 +164,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
logOutPref = findPreference(Preferences.LOGOUTPREF);
currentVersionPref = findPreference(Preferences.CURRENTVERSIONPREF);
ratePref = findPreference(Preferences.RATEPREF);
twitterPref = findPreference(Preferences.TWITTERPREF);
facebookPref = findPreference(Preferences.FACEBOOKPREF);
telegramPref = findPreference(Preferences.TELEGRAMPREF);
blogPref = findPreference(Preferences.BLOGPREF);
sharePref = findPreference(Preferences.SHAREPREF);
privacyPolicyPref = findPreference(Preferences.PRIVACYPOLICYPREF);
syncTimePref = findPreference(Preferences.SYNCTIMEPREF);
@ -191,10 +171,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
//syncTimeLocationPref = findPreference(Preferences.SYNCLOCATIONTIMEPREF);
ratePref.setOnPreferenceChangeListener(this);
twitterPref.setOnPreferenceChangeListener(this);
facebookPref.setOnPreferenceChangeListener(this);
telegramPref.setOnPreferenceChangeListener(this);
blogPref.setOnPreferenceChangeListener(this);
sharePref.setOnPreferenceChangeListener(this);
privacyPolicyPref.setOnPreferenceChangeListener(this);
syncEnablePref.setOnPreferenceChangeListener(this);
@ -229,54 +205,6 @@ public class PreferencesActivity extends PreferenceActivity implements OnPrefere
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() {
/**
* Called when a preference is selected.

View File

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

View File

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

View File

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

View File

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

View File

@ -66,26 +66,6 @@
android:key="sharePref"
android:summary="@string/shareBodyMsg"
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
android:defaultValue=""
android:key="privacyPolicyPref"