diff --git a/README.md b/README.md index f284cb96..176815f8 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ - Android 8.x ~ 13.x - API levels 26 ~ 33 - Android Studio 2020.3.1 Patch 2 ~ 2021.3.1 -(※2023年3月時点) +(※2023年4月時点) ## テクニカルサポート窓口対応バージョン @@ -31,7 +31,7 @@ ※なお、mobile backend にて大規模な改修が行われた際は、1年半以内のSDKであっても対応出来ない場合がございます。
その際は[informationブログ](https://mbaas.nifcloud.com/info/)にてお知らせいたします。予めご了承ください。 -- v1.0.0 ~ (※2023年3月時点) +- v1.0.0 ~ (※2023年4月時点) # インストール Android Studioでプロジェクトを開き、以下の手順でSDKをインストールしてください。 diff --git a/build.gradle b/build.gradle index 8c4de9c9..f11c902e 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ buildscript { android { compileSdkVersion 31 - buildToolsVersion "29.0.2" + buildToolsVersion "30.0.2" defaultConfig { minSdkVersion 20 targetSdkVersion 31 diff --git a/src/main/java/com/nifcloud/mbaas/core/NCMB.kt b/src/main/java/com/nifcloud/mbaas/core/NCMB.kt index 347cac64..5097d93b 100644 --- a/src/main/java/com/nifcloud/mbaas/core/NCMB.kt +++ b/src/main/java/com/nifcloud/mbaas/core/NCMB.kt @@ -43,7 +43,7 @@ class NCMB { /** * Version of this SDK */ - const val SDK_VERSION = "1.4.0" + const val SDK_VERSION = "1.5.0" /** * Prefix of keys in metadata for NCMB settings diff --git a/src/main/java/com/nifcloud/mbaas/core/NCMBPushService.kt b/src/main/java/com/nifcloud/mbaas/core/NCMBPushService.kt index 54768220..3dd17241 100644 --- a/src/main/java/com/nifcloud/mbaas/core/NCMBPushService.kt +++ b/src/main/java/com/nifcloud/mbaas/core/NCMBPushService.kt @@ -22,7 +22,22 @@ import java.util.* /** * Service class for push notification api */ -internal class NCMBPushService : NCMBService() { +internal class NCMBPushService : NCMBObjectService() { + + + /** service path for API category */ + override val SERVICE_PATH = "push" + + + /** + * Constructor + * + * @param context NCMBContext object for current context + */ + init { + this.mServicePath = this.SERVICE_PATH + } + /** * Create push object * @@ -32,7 +47,8 @@ internal class NCMBPushService : NCMBService() { */ @Throws(NCMBException::class) fun sendPush(params: JSONObject): JSONObject { - val request = createRequestParams(null, params, null, NCMBRequest.HTTP_METHOD_POST) + // val request = createRequestParams(null, params, null, NCMBRequest.HTTP_METHOD_POST) + val request = createRequestParamsPush(null, params, null, NCMBRequest.HTTP_METHOD_POST, null, null) val response = sendRequest(request) when (response) { is NCMBResponse.Success -> { @@ -55,7 +71,7 @@ internal class NCMBPushService : NCMBService() { */ @Throws(NCMBException::class) fun updatePush(pushId: String?, params: JSONObject): JSONObject { - val request = createRequestParams(pushId, params, null, NCMBRequest.HTTP_METHOD_PUT) + val request = createRequestParamsPush(pushId, params, null, NCMBRequest.HTTP_METHOD_PUT, null, null) val response = sendRequest(request) when (response) { is NCMBResponse.Success -> { @@ -87,11 +103,13 @@ internal class NCMBPushService : NCMBService() { } //connect - val paramsRequest = createRequestParams( + val paramsRequest = createRequestParamsPush( "$pushId/openNumber", params, null, - NCMBRequest.HTTP_METHOD_POST + NCMBRequest.HTTP_METHOD_POST, + null, + null ) val pushReceiptStatusHandler = NCMBHandler { callback, response -> when (response) { @@ -114,26 +132,28 @@ internal class NCMBPushService : NCMBService() { } /** - * Setup params to installation + * Setup params to push * - * @param installationId installation id - * @param params installation parameters + * @param pushId push id + * @param params push parameters * @param queryParams query parameters * @param method method * @return parameters in object */ @Throws(NCMBException::class) - fun createRequestParams( - installationId: String?, + fun createRequestParamsPush( + pushId: String?, params: JSONObject, queryParams: JSONObject?, - method: String + method: String, + callback: NCMBCallback?, + handler: NCMBHandler? ): RequestParams { //url set - val url: String = if (installationId != null) { + val url: String = if (pushId != null) { //PUT,GET(fetch) - NCMB.getApiBaseUrl() + mServicePath + "/" + installationId + NCMB.getApiBaseUrl() + mServicePath + "/" + pushId } else { //POST,GET(search) NCMB.getApiBaseUrl() + this.mServicePath @@ -142,21 +162,45 @@ internal class NCMBPushService : NCMBService() { url = url, method = method, params = params, - contentType = NCMBRequest.HEADER_CONTENT_TYPE_JSON + contentType = NCMBRequest.HEADER_CONTENT_TYPE_JSON, + callback = callback, + handler = handler ) } - companion object { - /** service path for API category */ - const val SERVICE_PATH = "push" - } - /** - * Constructor + * Setup params to do find request for Query search functions * - * @param context NCMBContext object for current context + * @param className Class name + * @param query JSONObject + * @return parameters in object + * @throws NCMBException */ - init { - mServicePath = SERVICE_PATH + @Throws(NCMBException::class) + override fun findObjectParams(className: String, query:JSONObject): RequestParams { + var url = NCMB.getApiBaseUrl() + this.mServicePath + if(query.length() > 0) { + url = url.plus("?" + queryUrlStringGenerate(query)) + } + val method = NCMBRequest.HTTP_METHOD_GET + val contentType = NCMBRequest.HEADER_CONTENT_TYPE_JSON + return RequestParams(url = url, method = method, contentType = contentType, query=query) + } + + @Throws(NCMBException::class) + override fun createSearchResponseList(className: String, responseData: JSONObject): List { + return try { + val results = responseData.getJSONArray(NCMBQueryConstants.RESPONSE_PARAMETER_RESULTS) + val array: MutableList = ArrayList() + for (i in 0 until results.length()) { + val tmpObj = NCMBPush(results.getJSONObject(i)) + array.add(tmpObj) + } + array + } catch (e: JSONException) { + throw NCMBException(NCMBException.INVALID_JSON, "Invalid JSON format.") + } } } + + diff --git a/src/main/java/com/nifcloud/mbaas/core/NCMBQuery.kt b/src/main/java/com/nifcloud/mbaas/core/NCMBQuery.kt index de9c7d17..d772f935 100644 --- a/src/main/java/com/nifcloud/mbaas/core/NCMBQuery.kt +++ b/src/main/java/com/nifcloud/mbaas/core/NCMBQuery.kt @@ -81,6 +81,10 @@ class NCMBQuery private constructor(val mClassName: String, val fun forFile(): NCMBQuery { return NCMBQuery("file", NCMBFileService()) as NCMBQuery } + + fun forPush(): NCMBQuery { + return NCMBQuery("push", NCMBPushService()) as NCMBQuery + } } /** diff --git a/src/main/java/com/nifcloud/mbaas/core/NCMBUserService.kt b/src/main/java/com/nifcloud/mbaas/core/NCMBUserService.kt index 2156183c..9ac612cd 100644 --- a/src/main/java/com/nifcloud/mbaas/core/NCMBUserService.kt +++ b/src/main/java/com/nifcloud/mbaas/core/NCMBUserService.kt @@ -108,8 +108,8 @@ internal class NCMBUserService : NCMBObjectService() { * @throws NCMBException */ @Throws(NCMBException::class) - protected fun loginUser(query: JSONObject): NCMBUser { - val reqParams = loginByNameParams(query, null, null) + protected fun loginUser(param: JSONObject): NCMBUser { + val reqParams = loginByNameParams(param, null, null) val response = sendRequest(reqParams) val responseData = loginByNameCheckResponse(response) return postLoginProcess(responseData) @@ -213,7 +213,7 @@ internal class NCMBUserService : NCMBObjectService() { * @throws NCMBException */ @Throws(NCMBException::class) - protected fun loginUserInBackground(query: JSONObject, loginCallback: NCMBCallback){ + protected fun loginUserInBackground(param: JSONObject, loginCallback: NCMBCallback){ val loginHandler = NCMBHandler { logincallback, response -> when (response) { is NCMBResponse.Success -> { @@ -227,7 +227,7 @@ internal class NCMBUserService : NCMBObjectService() { } } } - val reqParams : RequestParams = loginByNameParams(query, loginCallback, loginHandler) + val reqParams : RequestParams = loginByNameParams(param, loginCallback, loginHandler) sendRequestAsync(reqParams, loginCallback, loginHandler) } @@ -289,11 +289,13 @@ internal class NCMBUserService : NCMBObjectService() { * @throws NCMBException */ @Throws(NCMBException::class) - fun loginByNameParams(query: JSONObject, loginCallback: NCMBCallback?, loginHandler: NCMBHandler?): RequestParams { - val url = NCMB.getApiBaseUrl() + "login?" + queryUrlStringGenerate(query) - val method = NCMBRequest.HTTP_METHOD_GET + + fun loginByNameParams(params: JSONObject, loginCallback: NCMBCallback?, loginHandler: NCMBHandler?): RequestParams { + val url = NCMB.getApiBaseUrl() + "login" + + val method = NCMBRequest.HTTP_METHOD_POST val contentType = NCMBRequest.HEADER_CONTENT_TYPE_JSON - return RequestParams(url = url, method = method, contentType = contentType, query = query, callback = loginCallback, handler = loginHandler) + return RequestParams(url = url, method = method, contentType = contentType, params = params, callback = loginCallback, handler = loginHandler) } /** diff --git a/src/test/assets/json/valid_get_push_response.json b/src/test/assets/json/valid_get_push_response.json index d7c9538a..cba47d02 100644 --- a/src/test/assets/json/valid_get_push_response.json +++ b/src/test/assets/json/valid_get_push_response.json @@ -1 +1 @@ -{"objectId":"7FrmPTBKSNtVjajm","deliveryTime":{"iso":"2015-07-09T15:10:00.000Z","__type":"Date"},"deliveryExpirationDate":null,"richUrl":"http:\/\/www.yahoo.co.jp\/","searchCondition":{},"badgeIncrementFlag":true,"sound":"default","userSettingValue":{"score":100},"acl":{"*":{"read":true,"write":true}},"message":"message","deliveryExpirationTime":"10 day","title":"title","error":null,"target":["android","ios"],"dialog":true,"action":"com.sample.NCMBReceiver","category":"Category","contentAvailable":false,"badgeSetting":null,"deliveryNumber":0,"deliveryPlanNumber":3,"status":0,"createDate":"2015-07-09T06:08:45.668Z","updateDate":"2015-07-09T06:08:45.669Z"} \ No newline at end of file +{"results":[{"objectId":"7FrmPTBKSNtVjajm","deliveryTime":{"iso":"2015-07-09T15:10:00.000Z","__type":"Date"},"deliveryExpirationDate":null,"richUrl":"http:\/\/www.yahoo.co.jp\/","searchCondition":{},"badgeIncrementFlag":true,"sound":"default","userSettingValue":{"score":100},"acl":{"*":{"read":true,"write":true}},"message":"message","deliveryExpirationTime":"10 day","title":"title1","error":null,"target":["android","ios"],"dialog":true,"action":"com.sample.NCMBReceiver","category":"Category","contentAvailable":false,"badgeSetting":null,"deliveryNumber":0,"deliveryPlanNumber":3,"status":0,"createDate":"2015-07-09T06:08:45.668Z","updateDate":"2015-07-09T06:08:45.669Z"},{"objectId":"raCwV9E8HjPWO5yW","deliveryTime":{"iso":"2015-07-10T15:10:00.000Z","__type":"Date"},"target":["ios"],"searchCondition":null,"message":null,"userSettingValue":null,"deliveryExpirationDate":null,"deliveryExpirationTime":null,"deliveryPlanNumber":1,"deliveryNumber":0,"status":4,"action":null,"badgeIncrementFlag":true,"sound":null,"contentAvailable":false,"title":"title2","createDate":"2015-07-08T14:00:02.805Z","updateDate":"2015-07-08T14:00:02.921Z","acl":{"*":{"read":true,"write":true}}}]} \ No newline at end of file diff --git a/src/test/assets/json/valid_get_searchPush_response.json b/src/test/assets/json/valid_get_searchPush_response.json index 69ef98d7..914628e1 100644 --- a/src/test/assets/json/valid_get_searchPush_response.json +++ b/src/test/assets/json/valid_get_searchPush_response.json @@ -1,71 +1 @@ -{ - "results": [ - { - "objectId": "dummyObjectId01", - "deliveryTime": { - "iso": "2014-12-18T08:59:05.351Z", - "__type": "Date" - }, - "deliveryExpirationDate": null, - "richUrl": null, - "searchCondition": null, - "badgeIncrementFlag": true, - "sound": null, - "userSettingValue": null, - "message": "message1", - "deliveryExpirationTime": null, - "title": "title1", - "error": null, - "target": [ - "android" - ], - "dialog": true, - "action": "Ncmb.com.push.unity.RECEIVE_PUSH", - "category": null, - "contentAvailable": false, - "badgeSetting": null, - "deliveryNumber": 1, - "deliveryPlanNumber": 1, - "status": 2, - "createDate": "2014-12-18T08:59:05.354Z", - "updateDate": "2014-12-18T08:59:15.987Z", - "acl": { - "*": { - "read": true, - "write": true - } - } - }, - { - "objectId":"dummyObjectId02", - "deliveryTime":{"iso":"2014-12-18T08:59:05.351Z","__type":"Date"}, - "deliveryExpirationDate":null, - "richUrl":null, - "searchCondition":null, - "badgeIncrementFlag":true, - "sound":null, - "userSettingValue":null, - "message":"message2", - "deliveryExpirationTime":null, - "title":"title2", - "error":null, - "target":["android"], - "dialog":true, - "action":"Ncmb.com.push.unity.RECEIVE_PUSH", - "category":null, - "contentAvailable":false, - "badgeSetting":null, - "deliveryNumber":2, - "deliveryPlanNumber":2, - "status":2, - "createDate":"2014-12-19T08:59:05.354Z", - "updateDate":"2014-12-19T08:59:15.987Z", - "acl":{ - "*":{ - "read":true, - "write":true - } - } - } - ] -} +{"results":[{"objectId":"ukAwn7IKAG4Lgt0H","deliveryTime":{"iso":"2014-12-18T08:59:05.351Z","__type":"Date"},"deliveryExpirationDate":null,"richUrl":null,"searchCondition":null,"badgeIncrementFlag":true,"sound":null,"userSettingValue":null,"message":"message1","deliveryExpirationTime":null,"title":"title1","error":null,"target":["android"],"dialog":true,"action":"Ncmb.com.push.unity.RECEIVE_PUSH","category":null,"contentAvailable":false,"badgeSetting":null,"deliveryNumber":1,"deliveryPlanNumber":1,"status":2,"createDate":"2014-12-18T08:59:05.354Z","updateDate":"2014-12-18T08:59:15.987Z","acl":{"*":{"read":true,"write":true}}},{"objectId":"zsps3o9UkhYxO9p9","deliveryTime":{"iso":"2014-12-18T08:59:05.351Z","__type":"Date"},"deliveryExpirationDate":null,"richUrl":null,"searchCondition":null,"badgeIncrementFlag":true,"sound":null,"userSettingValue":null,"message":"message2","deliveryExpirationTime":null,"title":"title2","error":null,"target":["android"],"dialog":true,"action":"Ncmb.com.push.unity.RECEIVE_PUSH","category":null,"contentAvailable":false,"badgeSetting":null,"deliveryNumber":2,"deliveryPlanNumber":2,"status":2,"createDate":"2014-12-19T08:59:05.354Z","updateDate":"2014-12-19T08:59:15.987Z","acl":{"*":{"read":true,"write":true}}}]} \ No newline at end of file diff --git a/src/test/assets/yaml/mbaas_error.yml b/src/test/assets/yaml/mbaas_error.yml index 9c8d5966..5b4d69c9 100644 --- a/src/test/assets/yaml/mbaas_error.yml +++ b/src/test/assets/yaml/mbaas_error.yml @@ -17,30 +17,30 @@ response: --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "Ncmb Ichiro" password: invalidPassword - method: GET response: status: 401 file: invalid_get_login_response.json --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "invalidUser" password: Password - method: GET response: status: 401 file: invalid_get_login_response.json --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "Ncmb Jirou" password: dummyPassword - method: GET response: status: 200 file: valid_get_login_response.json diff --git a/src/test/assets/yaml/mbaas_query.yml b/src/test/assets/yaml/mbaas_query.yml index 1c7f6f6b..1e150a74 100644 --- a/src/test/assets/yaml/mbaas_query.yml +++ b/src/test/assets/yaml/mbaas_query.yml @@ -1,18 +1,15 @@ request: url: /2013-09-01/push method: GET - query: - where: '{"target":["android"]}' - limit: 2 response: status: 200 - file: valid_get_searchPush_response.json + file: valid_get_push_response.json --- request: url: /2013-09-01/push method: GET query: - where: '{"target":["android"]}' + where: '{"target":"android"}' response: status: 200 file: valid_get_searchPush_response.json diff --git a/src/test/assets/yaml/mbaas_users.yml b/src/test/assets/yaml/mbaas_users.yml index a6210d57..ef5d1355 100644 --- a/src/test/assets/yaml/mbaas_users.yml +++ b/src/test/assets/yaml/mbaas_users.yml @@ -292,8 +292,8 @@ response: --- request: url: /2013-09-01/login - method: GET - query: + method: POST + body: userName: "Ncmb Tarou" password: "dummyPassword" response: @@ -302,39 +302,39 @@ response: --- request: url: /2013-09-01/login - query: + method: POST + body: mailAddress: "sample@example.com" password: dummyPassword - method: GET response: status: 200 file: valid_get_login_response.json --- request: url: /2013-09-01/login - query: + method: POST + body: mailAddress: "sample@example.com" password: "incorrectPassword" - method: GET response: status: 401 file: valid_error_incorrect_password_response.json --- request: url: /2013-09-01/login - query: + method: POST + body: mailAddress: "sample@example.com" - method: GET response: status: 400 file: valid_error_empty_password_response.json --- request: url: /2013-09-01/login - query: + method: POST + body: mailAddress: "sample@example.com" password: "" - method: GET response: status: 400 file: valid_error_empty_password_response.json @@ -445,10 +445,10 @@ response: --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "NcmbCurrentUser" password: dummyPassword - method: GET response: status: 200 file: valid_get_getCurrentUser_response.json @@ -462,10 +462,10 @@ response: --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "NcmbToTestAfterLogin" password: dummyPassword - method: GET response: status: 200 file: valid_get_getUser_login_response.json @@ -513,10 +513,10 @@ response: --- request: url: /2013-09-01/login - query: + method: POST + body: userName: "saveAfterLogin" password: saveAfterLogin - method: GET response: status: 200 file: valid_get_login_to_save_user_response.json diff --git a/src/test/java/com/nifcloud/mbaas/core/NCMBQueryTest.kt b/src/test/java/com/nifcloud/mbaas/core/NCMBQueryTest.kt index 7814bbb2..c82883b0 100644 --- a/src/test/java/com/nifcloud/mbaas/core/NCMBQueryTest.kt +++ b/src/test/java/com/nifcloud/mbaas/core/NCMBQueryTest.kt @@ -31,6 +31,7 @@ import org.robolectric.annotation.Config import org.skyscreamer.jsonassert.JSONAssert import java.lang.Exception import java.util.* +import kotlin.collections.ArrayList import kotlin.test.assertFails //Android環境のベースにテスト実装するため @@ -936,4 +937,44 @@ class NCMBQueryTest { ) } + @Test + fun test_NCMBPush_find_success(){ + val query = NCMBQuery.forPush() + val pushes = query.find() + Assert.assertEquals( + 2, + pushes.size + ) + Assert.assertEquals( + pushes[0].title, + "title1" + ) + Assert.assertEquals( + pushes[0].getObjectId(), + "7FrmPTBKSNtVjajm" + ) + Assert.assertEquals( + pushes[1].title, + "title2" + ) + Assert.assertEquals( + pushes[1].getObjectId(), + "raCwV9E8HjPWO5yW" + ) + } + + @Test + fun test_NCMBPush_find_whereEqualTo_success(){ + val query = NCMBQuery.forPush() + query.whereEqualTo("target","android") + val android_pushes = query.find() + Assert.assertEquals( + android_pushes[0].getObjectId(), + "ukAwn7IKAG4Lgt0H" + ) + Assert.assertEquals( + android_pushes[1].getObjectId(), + "zsps3o9UkhYxO9p9" + ) + } }