|
@@ -30,6 +30,7 @@ import java.util.Map;
|
|
|
|
|
|
import org.apache.jackrabbit.webdav.DavException;
|
|
import org.apache.jackrabbit.webdav.DavException;
|
|
|
|
|
|
|
|
+import com.owncloud.android.MainApp;
|
|
import com.owncloud.android.R;
|
|
import com.owncloud.android.R;
|
|
import com.owncloud.android.authentication.AuthenticatorActivity;
|
|
import com.owncloud.android.authentication.AuthenticatorActivity;
|
|
import com.owncloud.android.datamodel.FileDataStorageManager;
|
|
import com.owncloud.android.datamodel.FileDataStorageManager;
|
|
@@ -58,23 +59,31 @@ import android.support.v4.app.NotificationCompat;
|
|
* Implementation of {@link AbstractThreadedSyncAdapter} responsible for synchronizing
|
|
* Implementation of {@link AbstractThreadedSyncAdapter} responsible for synchronizing
|
|
* ownCloud files.
|
|
* ownCloud files.
|
|
*
|
|
*
|
|
- * Performs a full synchronization of the account recieved in {@link #onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)}.
|
|
|
|
|
|
+ * Performs a full synchronization of the account recieved in {@link #onPerformSync(Account, Bundle,
|
|
|
|
+ * String, ContentProviderClient, SyncResult)}.
|
|
*/
|
|
*/
|
|
public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
|
|
|
|
private final static String TAG = FileSyncAdapter.class.getSimpleName();
|
|
private final static String TAG = FileSyncAdapter.class.getSimpleName();
|
|
|
|
|
|
- /** Maximum number of failed folder synchronizations that are supported before finishing the synchronization operation */
|
|
|
|
|
|
+ /** Maximum number of failed folder synchronizations that are supported before finishing
|
|
|
|
+ * the synchronization operation */
|
|
private static final int MAX_FAILED_RESULTS = 3;
|
|
private static final int MAX_FAILED_RESULTS = 3;
|
|
|
|
|
|
|
|
|
|
- public static final String EVENT_FULL_SYNC_START = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_START";
|
|
|
|
- public static final String EVENT_FULL_SYNC_END = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_END";
|
|
|
|
- public static final String EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED";
|
|
|
|
- //public static final String EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED";
|
|
|
|
|
|
+ public static final String EVENT_FULL_SYNC_START = FileSyncAdapter.class.getName() +
|
|
|
|
+ ".EVENT_FULL_SYNC_START";
|
|
|
|
+ public static final String EVENT_FULL_SYNC_END = FileSyncAdapter.class.getName() +
|
|
|
|
+ ".EVENT_FULL_SYNC_END";
|
|
|
|
+ public static final String EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED =
|
|
|
|
+ FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED";
|
|
|
|
+ //public static final String EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED =
|
|
|
|
+ // FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED";
|
|
|
|
|
|
- public static final String EXTRA_ACCOUNT_NAME = FileSyncAdapter.class.getName() + ".EXTRA_ACCOUNT_NAME";
|
|
|
|
- public static final String EXTRA_FOLDER_PATH = FileSyncAdapter.class.getName() + ".EXTRA_FOLDER_PATH";
|
|
|
|
|
|
+ public static final String EXTRA_ACCOUNT_NAME = FileSyncAdapter.class.getName() +
|
|
|
|
+ ".EXTRA_ACCOUNT_NAME";
|
|
|
|
+ public static final String EXTRA_FOLDER_PATH = FileSyncAdapter.class.getName() +
|
|
|
|
+ ".EXTRA_FOLDER_PATH";
|
|
public static final String EXTRA_RESULT = FileSyncAdapter.class.getName() + ".EXTRA_RESULT";
|
|
public static final String EXTRA_RESULT = FileSyncAdapter.class.getName() + ".EXTRA_RESULT";
|
|
|
|
|
|
|
|
|
|
@@ -84,7 +93,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
/** Flag made 'true' when a request to cancel the synchronization is received */
|
|
/** Flag made 'true' when a request to cancel the synchronization is received */
|
|
private boolean mCancellation;
|
|
private boolean mCancellation;
|
|
|
|
|
|
- /** When 'true' the process was requested by the user through the user interface; when 'false', it was requested automatically by the system */
|
|
|
|
|
|
+ /** When 'true' the process was requested by the user through the user interface;
|
|
|
|
+ * when 'false', it was requested automatically by the system */
|
|
private boolean mIsManualSync;
|
|
private boolean mIsManualSync;
|
|
|
|
|
|
/** Counter for failed operations in the synchronization process */
|
|
/** Counter for failed operations in the synchronization process */
|
|
@@ -99,7 +109,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
/** Counter of failed operations in synchronization of kept-in-sync files */
|
|
/** Counter of failed operations in synchronization of kept-in-sync files */
|
|
private int mFailsInFavouritesFound;
|
|
private int mFailsInFavouritesFound;
|
|
|
|
|
|
- /** Map of remote and local paths to files that where locally stored in a location out of the ownCloud folder and couldn't be copied automatically into it */
|
|
|
|
|
|
+ /** Map of remote and local paths to files that where locally stored in a location out
|
|
|
|
+ * of the ownCloud folder and couldn't be copied automatically into it */
|
|
private Map<String, String> mForgottenLocalFiles;
|
|
private Map<String, String> mForgottenLocalFiles;
|
|
|
|
|
|
/** {@link SyncResult} instance to return to the system when the synchronization finish */
|
|
/** {@link SyncResult} instance to return to the system when the synchronization finish */
|
|
@@ -155,19 +166,22 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
try {
|
|
try {
|
|
this.initClientForCurrentAccount();
|
|
this.initClientForCurrentAccount();
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
- /// the account is unknown for the Synchronization Manager, unreachable this context, or can not be authenticated; don't try this again
|
|
|
|
|
|
+ /// the account is unknown for the Synchronization Manager, unreachable this context,
|
|
|
|
+ // or can not be authenticated; don't try this again
|
|
mSyncResult.tooManyRetries = true;
|
|
mSyncResult.tooManyRetries = true;
|
|
notifyFailedSynchronization();
|
|
notifyFailedSynchronization();
|
|
return;
|
|
return;
|
|
} catch (AccountsException e) {
|
|
} catch (AccountsException e) {
|
|
- /// the account is unknown for the Synchronization Manager, unreachable this context, or can not be authenticated; don't try this again
|
|
|
|
|
|
+ /// the account is unknown for the Synchronization Manager, unreachable this context,
|
|
|
|
+ // or can not be authenticated; don't try this again
|
|
mSyncResult.tooManyRetries = true;
|
|
mSyncResult.tooManyRetries = true;
|
|
notifyFailedSynchronization();
|
|
notifyFailedSynchronization();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
Log_OC.d(TAG, "Synchronization of ownCloud account " + account.name + " starting");
|
|
Log_OC.d(TAG, "Synchronization of ownCloud account " + account.name + " starting");
|
|
- sendLocalBroadcast(EVENT_FULL_SYNC_START, null, null); // message to signal the start of the synchronization to the UI
|
|
|
|
|
|
+ sendLocalBroadcast(EVENT_FULL_SYNC_START, null, null); // message to signal the start
|
|
|
|
+ // of the synchronization to the UI
|
|
|
|
|
|
try {
|
|
try {
|
|
updateOCVersion();
|
|
updateOCVersion();
|
|
@@ -176,16 +190,19 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
synchronizeFolder(getStorageManager().getFileByPath(OCFile.ROOT_PATH));
|
|
synchronizeFolder(getStorageManager().getFileByPath(OCFile.ROOT_PATH));
|
|
|
|
|
|
} else {
|
|
} else {
|
|
- Log_OC.d(TAG, "Leaving synchronization before synchronizing the root folder because cancelation request");
|
|
|
|
|
|
+ Log_OC.d(TAG, "Leaving synchronization before synchronizing the root folder " +
|
|
|
|
+ "because cancelation request");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
} finally {
|
|
} finally {
|
|
- // it's important making this although very unexpected errors occur; that's the reason for the finally
|
|
|
|
|
|
+ // it's important making this although very unexpected errors occur;
|
|
|
|
+ // that's the reason for the finally
|
|
|
|
|
|
if (mFailedResultsCounter > 0 && mIsManualSync) {
|
|
if (mFailedResultsCounter > 0 && mIsManualSync) {
|
|
/// don't let the system synchronization manager retries MANUAL synchronizations
|
|
/// don't let the system synchronization manager retries MANUAL synchronizations
|
|
- // (be careful: "MANUAL" currently includes the synchronization requested when a new account is created and when the user changes the current account)
|
|
|
|
|
|
+ // (be careful: "MANUAL" currently includes the synchronization requested when
|
|
|
|
+ // a new account is created and when the user changes the current account)
|
|
mSyncResult.tooManyRetries = true;
|
|
mSyncResult.tooManyRetries = true;
|
|
|
|
|
|
/// notify the user about the failure of MANUAL synchronization
|
|
/// notify the user about the failure of MANUAL synchronization
|
|
@@ -197,7 +214,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
if (mForgottenLocalFiles.size() > 0) {
|
|
if (mForgottenLocalFiles.size() > 0) {
|
|
notifyForgottenLocalFiles();
|
|
notifyForgottenLocalFiles();
|
|
}
|
|
}
|
|
- sendLocalBroadcast(EVENT_FULL_SYNC_END, null, mLastFailedResult); // message to signal the end to the UI
|
|
|
|
|
|
+ sendLocalBroadcast(EVENT_FULL_SYNC_END, null, mLastFailedResult); // message to signal
|
|
|
|
+ // the end to the UI
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -210,7 +228,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
* locally saved.
|
|
* locally saved.
|
|
*
|
|
*
|
|
* See {@link #onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)}
|
|
* See {@link #onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)}
|
|
- * and {@link #synchronizeFolder(String, long)}.
|
|
|
|
|
|
+ * and {@link #synchronizeFolder(OCFile)}.
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void onSyncCanceled() {
|
|
public void onSyncCanceled() {
|
|
@@ -261,14 +279,14 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
}
|
|
}
|
|
*/
|
|
*/
|
|
// folder synchronization
|
|
// folder synchronization
|
|
- RefreshFolderOperation synchFolderOp = new RefreshFolderOperation( folder,
|
|
|
|
- mCurrentSyncTime,
|
|
|
|
- true,
|
|
|
|
- mIsShareSupported,
|
|
|
|
- false,
|
|
|
|
- getStorageManager(),
|
|
|
|
- getAccount(),
|
|
|
|
- getContext()
|
|
|
|
|
|
+ RefreshFolderOperation synchFolderOp = new RefreshFolderOperation( folder,
|
|
|
|
+ mCurrentSyncTime,
|
|
|
|
+ true,
|
|
|
|
+ mIsShareSupported,
|
|
|
|
+ false,
|
|
|
|
+ getStorageManager(),
|
|
|
|
+ getAccount(),
|
|
|
|
+ getContext()
|
|
);
|
|
);
|
|
RemoteOperationResult result = synchFolderOp.execute(getClient());
|
|
RemoteOperationResult result = synchFolderOp.execute(getClient());
|
|
|
|
|
|
@@ -289,7 +307,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
if (result.isSuccess()) {
|
|
if (result.isSuccess()) {
|
|
// synchronize children folders
|
|
// synchronize children folders
|
|
List<OCFile> children = synchFolderOp.getChildren();
|
|
List<OCFile> children = synchFolderOp.getChildren();
|
|
- fetchChildren(folder, children, synchFolderOp.getRemoteFolderChanged()); // beware of the 'hidden' recursion here!
|
|
|
|
|
|
+ // beware of the 'hidden' recursion here!
|
|
|
|
+ fetchChildren(folder, children, synchFolderOp.getRemoteFolderChanged());
|
|
}
|
|
}
|
|
|
|
|
|
} else {
|
|
} else {
|
|
@@ -312,11 +331,12 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Checks if a failed result should terminate the synchronization process immediately, according to
|
|
|
|
- * OUR OWN POLICY
|
|
|
|
|
|
+ * Checks if a failed result should terminate the synchronization process immediately,
|
|
|
|
+ * according to OUR OWN POLICY
|
|
*
|
|
*
|
|
* @param failedResult Remote operation result to check.
|
|
* @param failedResult Remote operation result to check.
|
|
- * @return 'True' if the result should immediately finish the synchronization
|
|
|
|
|
|
+ * @return 'True' if the result should immediately finish the
|
|
|
|
+ * synchronization
|
|
*/
|
|
*/
|
|
private boolean isFinisher(RemoteOperationResult failedResult) {
|
|
private boolean isFinisher(RemoteOperationResult failedResult) {
|
|
if (failedResult != null) {
|
|
if (failedResult != null) {
|
|
@@ -347,23 +367,29 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
syncDown = (parentEtagChanged || etag == null || etag.length() == 0);
|
|
syncDown = (parentEtagChanged || etag == null || etag.length() == 0);
|
|
if(syncDown) { */
|
|
if(syncDown) { */
|
|
synchronizeFolder(newFile);
|
|
synchronizeFolder(newFile);
|
|
- //sendLocalBroadcast(EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED, parent.getRemotePath(), null);
|
|
|
|
|
|
+ //sendLocalBroadcast(EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED, parent.getRemotePath(),
|
|
|
|
+ // null);
|
|
//}
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (mCancellation && i <files.size()) Log_OC.d(TAG, "Leaving synchronization before synchronizing " + files.get(i).getRemotePath() + " due to cancelation request");
|
|
|
|
|
|
+ if (mCancellation && i <files.size()) Log_OC.d(TAG,
|
|
|
|
+ "Leaving synchronization before synchronizing " + files.get(i).getRemotePath() +
|
|
|
|
+ " due to cancelation request");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Sends a message to any application component interested in the progress of the synchronization.
|
|
|
|
|
|
+ * Sends a message to any application component interested in the progress of the
|
|
|
|
+ * synchronization.
|
|
*
|
|
*
|
|
* @param event Event in the process of synchronization to be notified.
|
|
* @param event Event in the process of synchronization to be notified.
|
|
* @param dirRemotePath Remote path of the folder target of the event occurred.
|
|
* @param dirRemotePath Remote path of the folder target of the event occurred.
|
|
- * @param result Result of an individual {@ SynchronizeFolderOperation}, if completed; may be null.
|
|
|
|
|
|
+ * @param result Result of an individual {@ SynchronizeFolderOperation},
|
|
|
|
+ * if completed; may be null.
|
|
*/
|
|
*/
|
|
- private void sendLocalBroadcast(String event, String dirRemotePath, RemoteOperationResult result) {
|
|
|
|
|
|
+ private void sendLocalBroadcast(String event, String dirRemotePath,
|
|
|
|
+ RemoteOperationResult result) {
|
|
Log_OC.d(TAG, "Send broadcast " + event);
|
|
Log_OC.d(TAG, "Send broadcast " + event);
|
|
Intent intent = new Intent(event);
|
|
Intent intent = new Intent(event);
|
|
intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, getAccount().name);
|
|
intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, getAccount().name);
|
|
@@ -394,7 +420,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
// let the user update credentials with one click
|
|
// let the user update credentials with one click
|
|
Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class);
|
|
Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class);
|
|
updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount());
|
|
updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount());
|
|
- updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
|
|
|
|
|
|
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION,
|
|
|
|
+ AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND);
|
|
updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND);
|
|
@@ -402,7 +429,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
.setTicker(i18n(R.string.sync_fail_ticker_unauthorized))
|
|
.setTicker(i18n(R.string.sync_fail_ticker_unauthorized))
|
|
.setContentTitle(i18n(R.string.sync_fail_ticker_unauthorized))
|
|
.setContentTitle(i18n(R.string.sync_fail_ticker_unauthorized))
|
|
.setContentIntent(PendingIntent.getActivity(
|
|
.setContentIntent(PendingIntent.getActivity(
|
|
- getContext(), (int)System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT
|
|
|
|
|
|
+ getContext(), (int)System.currentTimeMillis(), updateAccountCredentials,
|
|
|
|
+ PendingIntent.FLAG_ONE_SHOT
|
|
))
|
|
))
|
|
.setContentText(i18n(R.string.sync_fail_content_unauthorized, getAccount().name));
|
|
.setContentText(i18n(R.string.sync_fail_content_unauthorized, getAccount().name));
|
|
} else {
|
|
} else {
|
|
@@ -417,7 +445,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Notifies the user about conflicts and strange fails when trying to synchronize the contents of kept-in-sync files.
|
|
|
|
|
|
+ * Notifies the user about conflicts and strange fails when trying to synchronize the contents
|
|
|
|
+ * of kept-in-sync files.
|
|
*
|
|
*
|
|
* By now, we won't consider a failed synchronization.
|
|
* By now, we won't consider a failed synchronization.
|
|
*/
|
|
*/
|
|
@@ -432,7 +461,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
getContext(), (int) System.currentTimeMillis(), new Intent(), 0
|
|
getContext(), (int) System.currentTimeMillis(), new Intent(), 0
|
|
))
|
|
))
|
|
.setContentTitle(i18n(R.string.sync_fail_in_favourites_ticker))
|
|
.setContentTitle(i18n(R.string.sync_fail_in_favourites_ticker))
|
|
- .setContentText(i18n(R.string.sync_fail_in_favourites_content, mFailedResultsCounter + mConflictsFound, mConflictsFound));
|
|
|
|
|
|
+ .setContentText(i18n(R.string.sync_fail_in_favourites_content,
|
|
|
|
+ mFailedResultsCounter + mConflictsFound, mConflictsFound));
|
|
|
|
|
|
showNotification(R.string.sync_fail_in_favourites_ticker, notificationBuilder);
|
|
showNotification(R.string.sync_fail_in_favourites_ticker, notificationBuilder);
|
|
} else {
|
|
} else {
|
|
@@ -452,13 +482,15 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Notifies the user about local copies of files out of the ownCloud local directory that were 'forgotten' because
|
|
|
|
- * copying them inside the ownCloud local directory was not possible.
|
|
|
|
|
|
+ * Notifies the user about local copies of files out of the ownCloud local directory that
|
|
|
|
+ * were 'forgotten' because copying them inside the ownCloud local directory was not possible.
|
|
*
|
|
*
|
|
- * We don't want links to files out of the ownCloud local directory (foreign files) anymore. It's easy to have
|
|
|
|
- * synchronization problems if a local file is linked to more than one remote file.
|
|
|
|
|
|
+ * We don't want links to files out of the ownCloud local directory (foreign files) anymore.
|
|
|
|
+ * It's easy to have synchronization problems if a local file is linked to more than one
|
|
|
|
+ * remote file.
|
|
*
|
|
*
|
|
- * We won't consider a synchronization as failed when foreign files can not be copied to the ownCloud local directory.
|
|
|
|
|
|
+ * We won't consider a synchronization as failed when foreign files can not be copied to
|
|
|
|
+ * the ownCloud local directory.
|
|
*/
|
|
*/
|
|
private void notifyForgottenLocalFiles() {
|
|
private void notifyForgottenLocalFiles() {
|
|
NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
|
|
NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
|
|
@@ -480,7 +512,8 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
|
|
getContext(), (int) System.currentTimeMillis(), explanationIntent, 0
|
|
getContext(), (int) System.currentTimeMillis(), explanationIntent, 0
|
|
))
|
|
))
|
|
.setContentTitle(i18n(R.string.sync_foreign_files_forgotten_ticker))
|
|
.setContentTitle(i18n(R.string.sync_foreign_files_forgotten_ticker))
|
|
- .setContentText(i18n(R.string.sync_foreign_files_forgotten_content, mForgottenLocalFiles.size(), i18n(R.string.app_name)));
|
|
|
|
|
|
+ .setContentText(i18n(R.string.sync_foreign_files_forgotten_content,
|
|
|
|
+ mForgottenLocalFiles.size(), i18n(R.string.app_name)));
|
|
|
|
|
|
showNotification(R.string.sync_foreign_files_forgotten_ticker, notificationBuilder);
|
|
showNotification(R.string.sync_foreign_files_forgotten_ticker, notificationBuilder);
|
|
}
|
|
}
|