diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index a79c9f5..0c89d2f 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="0.22.2"> diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java index 584dc11..6bbd9fc 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java @@ -68,6 +68,7 @@ public class RestoreMessagesActivity extends AppCompatActivity { TextView tv_error = (TextView) findViewById(R.id.tv_error_default_smsapp); tv_error.setText(R.string.error_make_default_sms_app); findViewById(R.id.tv_restore_finished).setVisibility(View.INVISIBLE); + findViewById(R.id.tv_progress_value).setVisibility(View.INVISIBLE); Button fix_button = (Button) findViewById(R.id.button_fix_permissions); final Button launch_restore = (Button) findViewById(R.id.button_launch_restore); final ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar_restore); @@ -159,5 +160,14 @@ public class RestoreMessagesActivity extends AppCompatActivity { startActivity(finalIntent); } + public void onProgressUpdate(Integer value) { + TextView tv_progress = (TextView) findViewById(R.id.tv_progress_value); + if (tv_progress.getVisibility() == View.INVISIBLE) { + tv_progress.setVisibility(View.VISIBLE); + } + + tv_progress.setText(value.toString() + " " + getString(R.string.x_messages_restored)); + } + private static final String TAG = RestoreMessagesActivity.class.getSimpleName(); } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/engine/ASyncSMSRecovery.java b/src/main/java/fr/unix_experience/owncloud_sms/engine/ASyncSMSRecovery.java index 158208d..889b3dd 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/engine/ASyncSMSRecovery.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/engine/ASyncSMSRecovery.java @@ -14,6 +14,7 @@ import java.util.Iterator; import fr.unix_experience.owncloud_sms.activities.remote_account.RestoreMessagesActivity; import fr.unix_experience.owncloud_sms.enums.MailboxID; +import fr.unix_experience.owncloud_sms.providers.SmsDataProvider; /* * Copyright (c) 2014-2016, Loic Blot @@ -33,7 +34,7 @@ import fr.unix_experience.owncloud_sms.enums.MailboxID; */ public interface ASyncSMSRecovery { - class SMSRecoveryTask extends AsyncTask { + class SMSRecoveryTask extends AsyncTask { private final RestoreMessagesActivity _context; private final Account _account; @@ -53,34 +54,54 @@ public interface ASyncSMSRecovery { // Verify connectivity Long start = (long) 0; - JSONObject obj = new OCSMSOwnCloudClient(_context, _account).retrieveSomeMessages(start, 500); + + OCSMSOwnCloudClient client = new OCSMSOwnCloudClient(_context, _account); + SmsDataProvider smsDataProvider = new SmsDataProvider(_context); + JSONObject obj = client.retrieveSomeMessages(start, 500); if (obj == null) { Log.i(ASyncSMSRecovery.TAG, "Retrieved returns failure"); return null; } + + Integer nb = 0; try { - JSONObject messages = obj.getJSONObject("messages"); - Iterator keys = messages.keys(); - while(keys.hasNext()) { - String key = (String)keys.next(); - if (messages.get(key) instanceof JSONObject) { - JSONObject msg = messages.getJSONObject(key); - ContentValues values = new ContentValues(); - values.put(Telephony.Sms.ADDRESS, msg.getString("address")); - values.put(Telephony.Sms.BODY, msg.getString("msg")); - values.put(Telephony.Sms.DATE, key); - values.put(Telephony.Sms.TYPE, msg.getInt("type")); - values.put(Telephony.Sms.SEEN, 1); - - MailboxID mailbox_id = MailboxID.fromInt(msg.getInt("mailbox")); - // @TODO verify message exists before inserting it - _context.getContentResolver().insert(Uri.parse(mailbox_id.getURI()), values); - } - } - while (obj.getLong("last_id") != start) { + JSONObject messages = obj.getJSONObject("messages"); + Iterator keys = messages.keys(); + while(keys.hasNext()) { + String key = (String)keys.next(); + if (messages.get(key) instanceof JSONObject) { + JSONObject msg = messages.getJSONObject(key); + + int mbid = msg.getInt("mailbox"); + // Ignore invalid mailbox + if (mbid > MailboxID.ALL.getId()) { + continue; + } + + String address = msg.getString("address"); + + ContentValues values = new ContentValues(); + values.put(Telephony.Sms.ADDRESS, address); + values.put(Telephony.Sms.BODY, msg.getString("msg")); + values.put(Telephony.Sms.DATE, key); + values.put(Telephony.Sms.TYPE, msg.getInt("type")); + values.put(Telephony.Sms.SEEN, 1); + values.put(Telephony.Sms.READ, 1); + + MailboxID mailbox_id = MailboxID.fromInt(mbid); + // @TODO verify message exists before inserting it + _context.getContentResolver().insert(Uri.parse(mailbox_id.getURI()), values); + + nb++; + if ((nb % 100) == 0) { + publishProgress(nb); + } + } + } + start = obj.getLong("last_id"); - obj = new OCSMSOwnCloudClient(_context, _account).retrieveSomeMessages(start, 500); + obj = client.retrieveSomeMessages(start, 500); } } catch (JSONException e) { Log.e(ASyncSMSRecovery.TAG, "Missing last_id field!"); @@ -88,15 +109,17 @@ public interface ASyncSMSRecovery { // Force this refresh to fix dates _context.getContentResolver().delete(Uri.parse("content://sms/conversations/-1"), null, null); + + publishProgress(nb); + Log.i(ASyncSMSRecovery.TAG, "Finishing background recovery"); return null; } @Override - protected void onProgressUpdate(Void... values) { + protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); - - // @TODO feedback user + _context.onProgressUpdate(values[0]); } @Override diff --git a/src/main/res/layout/activity_restore_messages.xml b/src/main/res/layout/activity_restore_messages.xml index 476d922..12a89a7 100644 --- a/src/main/res/layout/activity_restore_messages.xml +++ b/src/main/res/layout/activity_restore_messages.xml @@ -95,4 +95,12 @@ android:textAllCaps="false" android:visibility="invisible"/> + + diff --git a/src/main/res/values-en/strings.xml b/src/main/res/values-en/strings.xml index cd69cce..3cc3af9 100644 --- a/src/main/res/values-en/strings.xml +++ b/src/main/res/values-en/strings.xml @@ -177,5 +177,6 @@ We didn\'t find your account to restore your message, this is a very strange situation. Android 4.4 or greater is required to use this feature. Please make this application default SMS application to permit restore your messages. This limitation has been introduced by Android 4.4. + messages restored... diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 9470c4b..14d4aa7 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -165,4 +165,5 @@ Android 4.4 ou plus est requis pour utiliser cette fonctionnalité. Erreur #1: Données invalides reçues lors de l\'obtention des messages précédents. Merci de bien vouloir mettre cette application en application SMS par défaut le temps de restaurer les messages. Cette limitation a été ajoutée depuis Android 4.4. + messages restaurés... diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a0510ec..88608cf 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -252,4 +252,5 @@ Fix permissions Android 4.4 or greater is required to use this feature. SMS restauration is now finished. + messages restored...