diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 1471720..a79c9f5 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -6,11 +6,10 @@ - - + - - + + @@ -72,11 +71,51 @@ android:resource="@xml/owncloud_account_authenticator"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 d9fe065..df4ea5f 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 @@ -20,10 +20,18 @@ package fr.unix_experience.owncloud_sms.activities.remote_account; import android.Manifest; import android.accounts.Account; import android.accounts.AccountManager; +import android.app.Activity; +import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import android.provider.Telephony; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.TextView; import fr.unix_experience.owncloud_sms.R; import fr.unix_experience.owncloud_sms.engine.ASyncSMSRecovery; @@ -31,12 +39,15 @@ import fr.unix_experience.owncloud_sms.engine.ASyncSMSRecovery; public class RestoreMessagesActivity extends AppCompatActivity { Account _account = null; + String _defaultSmsApp; + private static final int REQUEST_DEFAULT_SMSAPP = 1; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_restore_messages); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) { - // Change message to define Android 4.4 or greated is required + // @TODO Change message to define Android 4.4 or greated is required return; } @@ -47,7 +58,7 @@ public class RestoreMessagesActivity extends AppCompatActivity { // accountName cannot be null, devel error assert accountName != null; AccountManager accountManager = AccountManager.get(getBaseContext()); - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding @@ -68,7 +79,72 @@ public class RestoreMessagesActivity extends AppCompatActivity { throw new IllegalStateException(getString(R.string.err_didnt_find_account_restore)); } - new ASyncSMSRecovery.SMSRecoveryTask(getApplicationContext(), _account).execute(); + _defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this); + TextView tv = (TextView) findViewById(R.id.tv_error_default_smsapp); + 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); + pb.setVisibility(View.INVISIBLE); + + if (!Telephony.Sms.getDefaultSmsPackage(this).equals(getPackageName())) { + _defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(getBaseContext()); + tv.setVisibility(View.VISIBLE); + fix_button.setVisibility(View.VISIBLE); + launch_restore.setVisibility(View.INVISIBLE); + } + else { + tv.setVisibility(View.INVISIBLE); + fix_button.setVisibility(View.INVISIBLE); + launch_restore.setVisibility(View.VISIBLE); + } + + fix_button.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) { + // @TODO Change message to define Android 4.4 or greated is required + return; + } + + Log.i(RestoreMessagesActivity.TAG, "Ask to change the default SMS app"); + + Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); + intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getBaseContext().getPackageName()); + startActivityForResult(intent, REQUEST_DEFAULT_SMSAPP); + } + }); + + launch_restore.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + launch_restore.setVisibility(View.INVISIBLE); + pb.setVisibility(View.VISIBLE); + Log.i(RestoreMessagesActivity.TAG, "Launching restore asynchronously"); + new ASyncSMSRecovery.SMSRecoveryTask(getApplicationContext(), _account).execute(); + } + }); + + + /*Intent finalIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); + finalIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, _defaultSmsApp); + startActivity(finalIntent);*/ + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case RestoreMessagesActivity.REQUEST_DEFAULT_SMSAPP: + Log.i(RestoreMessagesActivity.TAG, "RC: " + Integer.toString(resultCode)); + if (resultCode == Activity.RESULT_OK) { + TextView tv = (TextView) findViewById(R.id.tv_error_default_smsapp); + Button fix_button = (Button) findViewById(R.id.button_fix_permissions); + Button launch_restore = (Button) findViewById(R.id.button_launch_restore); + tv.setVisibility(View.INVISIBLE); + fix_button.setVisibility(View.INVISIBLE); + launch_restore.setVisibility(View.VISIBLE); + } + break; + default: + break; + } } 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 05c8f28..b501179 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 @@ -1,13 +1,19 @@ package fr.unix_experience.owncloud_sms.engine; import android.accounts.Account; +import android.content.ContentValues; import android.content.Context; +import android.net.Uri; import android.os.AsyncTask; import android.util.Log; import org.json.JSONException; import org.json.JSONObject; +import java.util.Iterator; + +import fr.unix_experience.owncloud_sms.enums.MailboxID; + /* * Copyright (c) 2014-2016, Loic Blot * @@ -43,10 +49,33 @@ public interface ASyncSMSRecovery { } Log.i(ASyncSMSRecovery.TAG, "Starting background recovery"); + // Verify connectivity + Long start = (long) 0; JSONObject obj = new OCSMSOwnCloudClient(_context, _account).retrieveSomeMessages(start, 500); + if (obj == null) { + Log.i(ASyncSMSRecovery.TAG, "Retrieved returns failure"); + return null; + } 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("address", msg.getString("address")); + values.put("body", msg.getString("msg")); + values.put("date", Long.parseLong(key)); + + MailboxID mailbox_id = MailboxID.fromInt(msg.getInt("mailbox")); + _context.getContentResolver().insert(Uri.parse(mailbox_id.getURI()), values); + } + } + while (obj.getLong("last_id") != start) { + Log.i(TAG, obj.toString()); start = obj.getLong("last_id"); obj = new OCSMSOwnCloudClient(_context, _account).retrieveSomeMessages(start, 500); } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/engine/OCSMSOwnCloudClient.java b/src/main/java/fr/unix_experience/owncloud_sms/engine/OCSMSOwnCloudClient.java index 07d27d7..43aa872 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/engine/OCSMSOwnCloudClient.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/engine/OCSMSOwnCloudClient.java @@ -244,6 +244,7 @@ public class OCSMSOwnCloudClient { JSONObject retrieveSomeMessages(Long start, Integer limit) { // This is not allowed by server if (limit > OCSMSOwnCloudClient.SERVER_RECOVERY_MSG_LIMIT) { + Log.e(OCSMSOwnCloudClient.TAG, "Message recovery limit exceeded"); return null; } @@ -251,10 +252,13 @@ public class OCSMSOwnCloudClient { doHttpRequest(_http.getMessages(start, limit)); } catch (OCSyncException e) { _jsonQueryBuffer = null; + Log.e(OCSMSOwnCloudClient.TAG, "Request failed."); return null; } if (!_jsonQueryBuffer.has("messages") || !_jsonQueryBuffer.has("last_id")) { + Log.e(OCSMSOwnCloudClient.TAG, + "Invalid response received from server, either messages or last_id field is missing."); return null; } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/enums/MailboxID.java b/src/main/java/fr/unix_experience/owncloud_sms/enums/MailboxID.java index 9849112..2022bfe 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/enums/MailboxID.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/enums/MailboxID.java @@ -26,12 +26,33 @@ package fr.unix_experience.owncloud_sms.enums; */ public enum MailboxID { - INBOX("content://sms/inbox"), - SENT("content://sms/sent"), - DRAFTS("content://sms/drafts"), - ALL("content://sms"); + INBOX(0), + SENT(1), + DRAFTS(2), + ALL(3); - MailboxID(final String uri) { this.uri = uri; } + MailboxID(int id) { + switch (id) { + case 0: uri = "content://sms/inbox"; break; + case 1: uri = "content://sms/sent"; break; + case 2: uri = "content://sms/drafts"; break; + case 3: uri = "content://sms"; break; + default: throw new AssertionError(); + } + this.id = id; + } + + public static MailboxID fromInt(int id) { + switch (id) { + case 0: return MailboxID.INBOX; + case 1: return MailboxID.SENT; + case 2: return MailboxID.DRAFTS; + case 3: return MailboxID.ALL; + default: throw new AssertionError(); + } + } private final String uri; - public String getURI() { return this.uri; } + private final int id; + public int getId() { return id; } + public String getURI() { return uri; } } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/misc/ComposeSmsActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/misc/ComposeSmsActivity.java new file mode 100644 index 0000000..137d0a9 --- /dev/null +++ b/src/main/java/fr/unix_experience/owncloud_sms/misc/ComposeSmsActivity.java @@ -0,0 +1,6 @@ +package fr.unix_experience.owncloud_sms.misc; + +import android.app.Activity; + +public class ComposeSmsActivity extends Activity { +} diff --git a/src/main/java/fr/unix_experience/owncloud_sms/misc/HeadlessSmsSendService.java b/src/main/java/fr/unix_experience/owncloud_sms/misc/HeadlessSmsSendService.java new file mode 100644 index 0000000..90a3e7e --- /dev/null +++ b/src/main/java/fr/unix_experience/owncloud_sms/misc/HeadlessSmsSendService.java @@ -0,0 +1,14 @@ +package fr.unix_experience.owncloud_sms.misc; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; + +public class HeadlessSmsSendService extends Service { + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/src/main/java/fr/unix_experience/owncloud_sms/misc/MmsReceiver.java b/src/main/java/fr/unix_experience/owncloud_sms/misc/MmsReceiver.java new file mode 100644 index 0000000..cb757a6 --- /dev/null +++ b/src/main/java/fr/unix_experience/owncloud_sms/misc/MmsReceiver.java @@ -0,0 +1,12 @@ +package fr.unix_experience.owncloud_sms.misc; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class MmsReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + } +} diff --git a/src/main/res/layout/activity_restore_messages.xml b/src/main/res/layout/activity_restore_messages.xml index b0d2cb6..cd8af7d 100644 --- a/src/main/res/layout/activity_restore_messages.xml +++ b/src/main/res/layout/activity_restore_messages.xml @@ -36,12 +36,50 @@ android:paddingTop="@dimen/activity_vertical_margin" tools:context="fr.unix_experience.owncloud_sms.activities.remote_account.RestoreMessagesActivity"> - + + + +