1
0
mirror of https://github.com/nerzhul/ownCloud-SMS-App.git synced 2025-06-27 09:46:23 +00:00

Add getServerPhoneNumbers call and fix file coding style

This commit is contained in:
Loic Blot 2015-04-28 17:50:00 +02:00
parent 9d3c9e93a0
commit a22b5c3318

View File

@ -12,7 +12,7 @@ package fr.unix_experience.owncloud_sms.engine;
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -46,127 +46,142 @@ import fr.unix_experience.owncloud_sms.prefs.OCSMSSharedPrefs;
public class OCSMSOwnCloudClient { public class OCSMSOwnCloudClient {
public OCSMSOwnCloudClient(Context context, Uri serverURI, String accountName, String accountPassword) { public OCSMSOwnCloudClient(final Context context, final Uri serverURI, final String accountName, final String accountPassword) {
_context = context; _context = context;
_ocClient = OwnCloudClientFactory.createOwnCloudClient( _ocClient = OwnCloudClientFactory.createOwnCloudClient(
serverURI, _context, true); serverURI, _context, true);
// Set basic credentials // Set basic credentials
_ocClient.setCredentials( _ocClient.setCredentials(
OwnCloudCredentialsFactory.newBasicCredentials(accountName, accountPassword) OwnCloudCredentialsFactory.newBasicCredentials(accountName, accountPassword)
); );
_serverAPIVersion = 1; _serverAPIVersion = 1;
} }
public Integer getServerAPIVersion() throws OCSyncException { public Integer getServerAPIVersion() throws OCSyncException {
GetMethod get = createGetVersionRequest(); final GetMethod get = createGetVersionRequest();
JSONObject obj = doHttpRequest(get, true); final JSONObject obj = doHttpRequest(get, true);
if (obj == null) { if (obj == null) {
// Return default version // Return default version
return 1; return 1;
} }
try { try {
_serverAPIVersion = obj.getInt("version"); _serverAPIVersion = obj.getInt("version");
} }
catch (JSONException e) { catch (final JSONException e) {
Log.e(TAG, "No version received from server, assuming version 1", e); Log.e(TAG, "No version received from server, assuming version 1", e);
_serverAPIVersion = 1; _serverAPIVersion = 1;
} }
return _serverAPIVersion; return _serverAPIVersion;
} }
public void doPushRequest(JSONArray smsList) throws OCSyncException { public JSONArray getServerPhoneNumbers() throws OCSyncException {
final GetMethod get = createGetPhoneListRequest();
final JSONObject obj = doHttpRequest(get, true);
if (obj == null) {
return null;
}
try {
return obj.getJSONArray("phonelist");
} catch (final JSONException e) {
Log.e(TAG, "No phonelist received from server, empty it", e);
return null;
}
}
public void doPushRequest(final JSONArray smsList) throws OCSyncException {
/** /**
* If we need other API push, set it here * If we need other API push, set it here
*/ */
switch (_serverAPIVersion) { switch (_serverAPIVersion) {
case 2: doPushRequestV2(smsList); break; case 2: doPushRequestV2(smsList); break;
case 1: case 1:
default: doPushRequestV1(smsList); break; default: doPushRequestV1(smsList); break;
} }
} }
public void doPushRequestV1(JSONArray smsList) throws OCSyncException { public void doPushRequestV1(JSONArray smsList) throws OCSyncException {
// We need to save this date as a step for connectivity change // We need to save this date as a step for connectivity change
Long lastMsgDate = (long) 0; Long lastMsgDate = (long) 0;
if (smsList == null) { if (smsList == null) {
GetMethod get = createGetSmsIdListRequest(); final GetMethod get = createGetSmsIdListRequest();
JSONObject smsGetObj = doHttpRequest(get); final JSONObject smsGetObj = doHttpRequest(get);
if (smsGetObj == null) { if (smsGetObj == null) {
return; return;
} }
JSONObject smsBoxes = new JSONObject(); JSONObject smsBoxes = new JSONObject();
JSONArray inboxSmsList = null, sentSmsList = null, draftsSmsList = null; JSONArray inboxSmsList = null, sentSmsList = null, draftsSmsList = null;
try { try {
smsBoxes = smsGetObj.getJSONObject("smslist"); smsBoxes = smsGetObj.getJSONObject("smslist");
} catch (JSONException e) { } catch (final JSONException e) {
try { try {
smsGetObj.getJSONArray("smslist"); smsGetObj.getJSONArray("smslist");
} catch (JSONException e2) { } catch (final JSONException e2) {
Log.e(TAG, "Invalid datas received from server (doPushRequest, get SMS list)", e); Log.e(TAG, "Invalid datas received from server (doPushRequest, get SMS list)", e);
throw new OCSyncException(R.string.err_sync_get_smslist, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_get_smslist, OCSyncErrorType.PARSE);
} }
} }
try { try {
inboxSmsList = smsBoxes.getJSONArray("inbox"); inboxSmsList = smsBoxes.getJSONArray("inbox");
} catch (JSONException e) { } catch (final JSONException e) {
Log.d(TAG, "No inbox Sms received from server (doPushRequest, get SMS list)"); Log.d(TAG, "No inbox Sms received from server (doPushRequest, get SMS list)");
} }
try { try {
sentSmsList = smsBoxes.getJSONArray("sent"); sentSmsList = smsBoxes.getJSONArray("sent");
} catch (JSONException e) { } catch (final JSONException e) {
Log.d(TAG, "No sent Sms received from server (doPushRequest, get SMS list)"); Log.d(TAG, "No sent Sms received from server (doPushRequest, get SMS list)");
} }
try { try {
draftsSmsList = smsBoxes.getJSONArray("drafts"); draftsSmsList = smsBoxes.getJSONArray("drafts");
} catch (JSONException e) { } catch (final JSONException e) {
Log.d(TAG, "No drafts Sms received from server (doPushRequest, get SMS list)"); Log.d(TAG, "No drafts Sms received from server (doPushRequest, get SMS list)");
} }
SmsFetcher fetcher = new SmsFetcher(_context); final SmsFetcher fetcher = new SmsFetcher(_context);
fetcher.setExistingInboxMessages(inboxSmsList); fetcher.setExistingInboxMessages(inboxSmsList);
fetcher.setExistingSentMessages(sentSmsList); fetcher.setExistingSentMessages(sentSmsList);
fetcher.setExistingDraftsMessages(draftsSmsList); fetcher.setExistingDraftsMessages(draftsSmsList);
smsList = fetcher.fetchAllMessages(); smsList = fetcher.fetchAllMessages();
// Get maximum message date present in smsList to keep a step when connectivity changes // Get maximum message date present in smsList to keep a step when connectivity changes
lastMsgDate = fetcher.getLastMessageDate(); lastMsgDate = fetcher.getLastMessageDate();
} }
if (smsList.length() == 0) { if (smsList.length() == 0) {
Log.d(TAG, "No new SMS to sync, sync done"); Log.d(TAG, "No new SMS to sync, sync done");
return; return;
} }
PostMethod post = createPushRequest(smsList); final PostMethod post = createPushRequest(smsList);
if (post == null) { if (post == null) {
Log.e(TAG,"Push request for POST is null"); Log.e(TAG,"Push request for POST is null");
throw new OCSyncException(R.string.err_sync_craft_http_request, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_craft_http_request, OCSyncErrorType.IO);
} }
JSONObject obj = doHttpRequest(post); final JSONObject obj = doHttpRequest(post);
if (obj == null) { if (obj == null) {
Log.e(TAG,"Request failed. It doesn't return a valid JSON Object"); Log.e(TAG,"Request failed. It doesn't return a valid JSON Object");
throw new OCSyncException(R.string.err_sync_push_request, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_push_request, OCSyncErrorType.IO);
} }
Boolean pushStatus; Boolean pushStatus;
String pushMessage; String pushMessage;
try { try {
pushStatus = obj.getBoolean("status"); pushStatus = obj.getBoolean("status");
pushMessage = obj.getString("msg"); pushMessage = obj.getString("msg");
} }
catch (JSONException e) { catch (final JSONException e) {
Log.e(TAG, "Invalid datas received from server", e); Log.e(TAG, "Invalid datas received from server", e);
throw new OCSyncException(R.string.err_sync_push_request_resp, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_push_request_resp, OCSyncErrorType.PARSE);
} }
@ -176,15 +191,19 @@ public class OCSMSOwnCloudClient {
Log.d(TAG, "SMS Push request said: status " + pushStatus + " - " + pushMessage); Log.d(TAG, "SMS Push request said: status " + pushStatus + " - " + pushMessage);
} }
public void doPushRequestV2(JSONArray smsList) throws OCSyncException { public void doPushRequestV2(final JSONArray smsList) throws OCSyncException {
} }
public GetMethod createGetVersionRequest() { public GetMethod createGetVersionRequest() {
return createGetRequest(OC_GET_VERSION); return createGetRequest(OC_GET_VERSION);
} }
public GetMethod createGetPhoneListRequest() {
return createGetRequest(OC_GET_PHONELIST);
}
public GetMethod createGetSmsIdListRequest() { public GetMethod createGetSmsIdListRequest() {
return createGetRequest(OC_GET_ALL_SMS_IDS); return createGetRequest(OC_GET_ALL_SMS_IDS);
} }
@ -192,92 +211,92 @@ public class OCSMSOwnCloudClient {
public GetMethod createGetSmsIdListWithStateRequest() { public GetMethod createGetSmsIdListWithStateRequest() {
return createGetRequest(OC_GET_ALL_SMS_IDS_WITH_STATUS); return createGetRequest(OC_GET_ALL_SMS_IDS_WITH_STATUS);
} }
public GetMethod createGetLastSmsTimestampRequest() { public GetMethod createGetLastSmsTimestampRequest() {
return createGetRequest(OC_GET_LAST_MSG_TIMESTAMP); return createGetRequest(OC_GET_LAST_MSG_TIMESTAMP);
} }
private GetMethod createGetRequest(String oc_call) { private GetMethod createGetRequest(final String oc_call) {
GetMethod get = new GetMethod(_ocClient.getBaseUri() + oc_call); final GetMethod get = new GetMethod(_ocClient.getBaseUri() + oc_call);
get.addRequestHeader("OCS-APIREQUEST", "true"); get.addRequestHeader("OCS-APIREQUEST", "true");
return get; return get;
} }
public PostMethod createPushRequest() throws OCSyncException { public PostMethod createPushRequest() throws OCSyncException {
SmsFetcher fetcher = new SmsFetcher(_context); final SmsFetcher fetcher = new SmsFetcher(_context);
JSONArray smsList = fetcher.fetchAllMessages(); final JSONArray smsList = fetcher.fetchAllMessages();
return createPushRequest(smsList); return createPushRequest(smsList);
} }
public PostMethod createPushRequest(JSONArray smsList) throws OCSyncException { public PostMethod createPushRequest(final JSONArray smsList) throws OCSyncException {
JSONObject obj = createPushJSONObject(smsList); final JSONObject obj = createPushJSONObject(smsList);
if (obj == null) { if (obj == null) {
return null; return null;
} }
StringRequestEntity ent = createJSONRequestEntity(obj); final StringRequestEntity ent = createJSONRequestEntity(obj);
if (ent == null) { if (ent == null) {
return null; return null;
} }
PostMethod post = new PostMethod(_ocClient.getBaseUri() + OC_PUSH_ROUTE); final PostMethod post = new PostMethod(_ocClient.getBaseUri() + OC_PUSH_ROUTE);
post.addRequestHeader("OCS-APIREQUEST", "true"); post.addRequestHeader("OCS-APIREQUEST", "true");
post.setRequestEntity(ent); post.setRequestEntity(ent);
return post; return post;
} }
private JSONObject createPushJSONObject(JSONArray smsList) throws OCSyncException { private JSONObject createPushJSONObject(final JSONArray smsList) throws OCSyncException {
if (smsList == null) { if (smsList == null) {
Log.e(TAG,"NULL SMS List"); Log.e(TAG,"NULL SMS List");
throw new OCSyncException(R.string.err_sync_create_json_null_smslist, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_create_json_null_smslist, OCSyncErrorType.IO);
} }
JSONObject reqJSON = new JSONObject(); final JSONObject reqJSON = new JSONObject();
try { try {
reqJSON.put("smsDatas", smsList); reqJSON.put("smsDatas", smsList);
reqJSON.put("smsCount", smsList == null ? 0 : smsList.length()); reqJSON.put("smsCount", smsList == null ? 0 : smsList.length());
} catch (JSONException e) { } catch (final JSONException e) {
Log.e(TAG,"JSON Exception when creating JSON request object"); Log.e(TAG,"JSON Exception when creating JSON request object");
throw new OCSyncException(R.string.err_sync_create_json_put_smslist, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_create_json_put_smslist, OCSyncErrorType.PARSE);
} }
return reqJSON; return reqJSON;
} }
private StringRequestEntity createJSONRequestEntity(JSONObject obj) throws OCSyncException { private StringRequestEntity createJSONRequestEntity(final JSONObject obj) throws OCSyncException {
StringRequestEntity requestEntity; StringRequestEntity requestEntity;
try { try {
requestEntity = new StringRequestEntity( requestEntity = new StringRequestEntity(
obj.toString(), obj.toString(),
"application/json", "application/json",
"UTF-8"); "UTF-8");
} catch (UnsupportedEncodingException e) { } catch (final UnsupportedEncodingException e) {
Log.e(TAG,"Unsupported encoding when generating request"); Log.e(TAG,"Unsupported encoding when generating request");
throw new OCSyncException(R.string.err_sync_create_json_request_encoding, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_create_json_request_encoding, OCSyncErrorType.PARSE);
} }
return requestEntity; return requestEntity;
} }
private JSONObject doHttpRequest(HttpMethod req) throws OCSyncException { private JSONObject doHttpRequest(final HttpMethod req) throws OCSyncException {
return doHttpRequest(req, false); return doHttpRequest(req, false);
} }
// skipError permit to skip invalid JSON datas // skipError permit to skip invalid JSON datas
private JSONObject doHttpRequest(HttpMethod req, Boolean skipError) throws OCSyncException { private JSONObject doHttpRequest(final HttpMethod req, final Boolean skipError) throws OCSyncException {
JSONObject respJSON = null; JSONObject respJSON = null;
int status = 0; int status = 0;
// We try maximumHttpReqTries because sometimes network is slow or unstable // We try maximumHttpReqTries because sometimes network is slow or unstable
int tryNb = 0; int tryNb = 0;
ConnectivityMonitor cMon = new ConnectivityMonitor(_context); final ConnectivityMonitor cMon = new ConnectivityMonitor(_context);
while (tryNb < maximumHttpReqTries) { while (tryNb < maximumHttpReqTries) {
tryNb++; tryNb++;
if (!cMon.isValid()) { if (!cMon.isValid()) {
if (tryNb == maximumHttpReqTries) { if (tryNb == maximumHttpReqTries) {
req.releaseConnection(); req.releaseConnection();
@ -285,33 +304,33 @@ public class OCSMSOwnCloudClient {
} }
continue; continue;
} }
try { try {
status = _ocClient.executeMethod(req); status = _ocClient.executeMethod(req);
Log.d(TAG, "HTTP Request done at try " + tryNb); Log.d(TAG, "HTTP Request done at try " + tryNb);
// Force loop exit // Force loop exit
tryNb = maximumHttpReqTries; tryNb = maximumHttpReqTries;
} catch (ConnectException e) { } catch (final ConnectException e) {
Log.e(TAG, "Unable to perform a connection to ownCloud instance", e); Log.e(TAG, "Unable to perform a connection to ownCloud instance", e);
// If it's the last try // If it's the last try
if (tryNb == maximumHttpReqTries) { if (tryNb == maximumHttpReqTries) {
req.releaseConnection(); req.releaseConnection();
throw new OCSyncException(R.string.err_sync_http_request_connect, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_http_request_connect, OCSyncErrorType.IO);
} }
} catch (HttpException e) { } catch (final HttpException e) {
Log.e(TAG, "Unable to perform a connection to ownCloud instance", e); Log.e(TAG, "Unable to perform a connection to ownCloud instance", e);
// If it's the last try // If it's the last try
if (tryNb == maximumHttpReqTries) { if (tryNb == maximumHttpReqTries) {
req.releaseConnection(); req.releaseConnection();
throw new OCSyncException(R.string.err_sync_http_request_httpexception, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_http_request_httpexception, OCSyncErrorType.IO);
} }
} catch (IOException e) { } catch (final IOException e) {
Log.e(TAG, "Unable to perform a connection to ownCloud instance", e); Log.e(TAG, "Unable to perform a connection to ownCloud instance", e);
// If it's the last try // If it's the last try
if (tryNb == maximumHttpReqTries) { if (tryNb == maximumHttpReqTries) {
req.releaseConnection(); req.releaseConnection();
@ -319,12 +338,12 @@ public class OCSMSOwnCloudClient {
} }
} }
} }
if(status == HttpStatus.SC_OK) { if(status == HttpStatus.SC_OK) {
String response = null; String response = null;
try { try {
response = req.getResponseBodyAsString(); response = req.getResponseBodyAsString();
} catch (IOException e) { } catch (final IOException e) {
Log.e(TAG, "Unable to parse server response", e); Log.e(TAG, "Unable to parse server response", e);
throw new OCSyncException(R.string.err_sync_http_request_resp, OCSyncErrorType.IO); throw new OCSyncException(R.string.err_sync_http_request_resp, OCSyncErrorType.IO);
} }
@ -333,14 +352,14 @@ public class OCSMSOwnCloudClient {
// Parse the response // Parse the response
try { try {
respJSON = new JSONObject(response); respJSON = new JSONObject(response);
} catch (JSONException e) { } catch (final JSONException e) {
if (skipError == false) { if (skipError == false) {
Log.e(TAG, "Unable to parse server response", e); Log.e(TAG, "Unable to parse server response", e);
throw new OCSyncException(R.string.err_sync_http_request_parse_resp, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_http_request_parse_resp, OCSyncErrorType.PARSE);
} }
return null; return null;
} }
} else if (status == HttpStatus.SC_FORBIDDEN) { } else if (status == HttpStatus.SC_FORBIDDEN) {
// Authentication failed // Authentication failed
throw new OCSyncException(R.string.err_sync_auth_failed, OCSyncErrorType.AUTH); throw new OCSyncException(R.string.err_sync_auth_failed, OCSyncErrorType.AUTH);
@ -349,11 +368,11 @@ public class OCSMSOwnCloudClient {
String response = null; String response = null;
try { try {
response = req.getResponseBodyAsString(); response = req.getResponseBodyAsString();
} catch (IOException e) { } catch (final IOException e) {
Log.e(TAG, "Unable to parse server response", e); Log.e(TAG, "Unable to parse server response", e);
throw new OCSyncException(R.string.err_sync_http_request_resp, OCSyncErrorType.PARSE); throw new OCSyncException(R.string.err_sync_http_request_resp, OCSyncErrorType.PARSE);
} }
Log.e(TAG, "Server set unhandled HTTP return code " + status); Log.e(TAG, "Server set unhandled HTTP return code " + status);
if (response != null) { if (response != null) {
Log.e(TAG, "Status code: " + status + ". Response message: " + response); Log.e(TAG, "Status code: " + status + ". Response message: " + response);
@ -364,23 +383,24 @@ public class OCSMSOwnCloudClient {
} }
return respJSON; return respJSON;
} }
public OwnCloudClient getOCClient() { return _ocClient; } public OwnCloudClient getOCClient() { return _ocClient; }
private static int maximumHttpReqTries = 3; private static int maximumHttpReqTries = 3;
private OwnCloudClient _ocClient; private final OwnCloudClient _ocClient;
private Context _context; private final Context _context;
private Integer _serverAPIVersion; private Integer _serverAPIVersion;
private static String OC_GET_VERSION = "/index.php/apps/ocsms/get/apiversion?format=json"; private static String OC_GET_VERSION = "/index.php/apps/ocsms/get/apiversion?format=json";
private static String OC_GET_ALL_SMS_IDS = "/index.php/apps/ocsms/get/smsidlist?format=json"; private static String OC_GET_ALL_SMS_IDS = "/index.php/apps/ocsms/get/smsidlist?format=json";
private static String OC_GET_ALL_SMS_IDS_WITH_STATUS = "/index.php/apps/ocsms/get/smsidstate?format=json"; private static String OC_GET_ALL_SMS_IDS_WITH_STATUS = "/index.php/apps/ocsms/get/smsidstate?format=json";
private static String OC_GET_LAST_MSG_TIMESTAMP = "/index.php/apps/ocsms/get/lastmsgtime?format=json"; private static String OC_GET_LAST_MSG_TIMESTAMP = "/index.php/apps/ocsms/get/lastmsgtime?format=json";
private static String OC_PUSH_ROUTE = "/index.php/apps/ocsms/push?format=json"; private static String OC_PUSH_ROUTE = "/index.php/apps/ocsms/push?format=json";
private static String OC_GET_PHONELIST = "/index.php/apps/ocsms/get/phones/numberlist?format=json";
private static final String TAG = OCSMSOwnCloudClient.class.getSimpleName(); private static final String TAG = OCSMSOwnCloudClient.class.getSimpleName();
} }