diff --git a/app/build.gradle b/app/build.gradle index e176cdaa8..19a777a0f 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -92,7 +92,6 @@ android { configurations { implementation.exclude group: 'org.jetbrains', module: 'annotations' - all*.exclude group: 'com.android.volley' } lintOptions { @@ -145,7 +144,10 @@ dependencies { androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' - implementation 'com.mcxiaoke.volley:library:1.0.19' + //retrofit + implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion" + implementation "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion" + implementation 'com.squareup.okhttp3:logging-interceptor:4.2.0' //google and support implementation "androidx.appcompat:appcompat:$rootProject.supportLibraryVersion" diff --git a/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java b/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java index a7f7cdc25..252233325 100644 --- a/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java +++ b/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java @@ -54,14 +54,6 @@ import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; -import com.android.volley.AuthFailureError; -import com.android.volley.DefaultRetryPolicy; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.StringRequest; -import com.android.volley.toolbox.Volley; import com.box.androidsdk.content.BoxApiFile; import com.box.androidsdk.content.BoxConfig; import com.box.androidsdk.content.BoxException; @@ -109,8 +101,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; -import java.util.Map; import org.fossasia.phimpme.R; import org.fossasia.phimpme.base.PhimpmeProgressBarHandler; import org.fossasia.phimpme.base.RecyclerItemClickListner; @@ -122,15 +112,20 @@ import org.fossasia.phimpme.gallery.util.AlertDialogsHelper; import org.fossasia.phimpme.gallery.util.ThemeHelper; import org.fossasia.phimpme.share.flickr.FlickrHelper; +import org.fossasia.phimpme.share.imgur.ImgurPicUploadReq; +import org.fossasia.phimpme.share.imgur.ImgurPicUploadResp; import org.fossasia.phimpme.share.tumblr.TumblrClient; import org.fossasia.phimpme.share.twitter.HelperMethods; import org.fossasia.phimpme.utilities.ActivitySwitchHelper; import org.fossasia.phimpme.utilities.Constants; +import org.fossasia.phimpme.utilities.ImgurApi; import org.fossasia.phimpme.utilities.NotificationHandler; +import org.fossasia.phimpme.utilities.RetrofitClient; import org.fossasia.phimpme.utilities.SnackBarHandler; import org.fossasia.phimpme.utilities.Utils; -import org.json.JSONException; -import org.json.JSONObject; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; /** * Class which deals with Sharing images to multiple Account logged in by the user in the app. If @@ -155,6 +150,9 @@ public class SharingActivity extends ThemedActivity OnRemoteOperationListener, RecyclerItemClickListner.OnItemClickListener { + private static final String IMGUR_BASE_URL = "https://api.imgur.com/3/"; + private static final String IMGUR_HEADER_CLIENT = "Client-ID"; + private static final String IMGUR_HEADER_USER = "Bearer"; public static final String EXTRA_OUTPUT = "extra_output"; private static String LOG_TAG = SharingActivity.class.getCanonicalName(); public String saveFilePath; @@ -202,9 +200,10 @@ public class SharingActivity extends ThemedActivity public String uploadName; private int positionShareOption; private boolean triedUploading = false; + private ImgurApi imgurApiInterface; public static String getClientAuth() { - return Constants.IMGUR_HEADER_CLIENt + " " + Constants.MY_IMGUR_CLIENT_ID; + return IMGUR_HEADER_CLIENT + " " + Constants.MY_IMGUR_CLIENT_ID; } @Override @@ -1015,6 +1014,9 @@ private void shareToWhatsapp() { } private void shareToImgur() { + if (imgurApiInterface == null) { + imgurApiInterface = RetrofitClient.getRetrofitClient(IMGUR_BASE_URL).create(ImgurApi.class); + } final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SharingActivity.this, getDialogStyle()); RealmQuery query = realm.where(AccountDatabase.class); @@ -1022,7 +1024,7 @@ private void shareToImgur() { final RealmResults result = query.findAll(); if (result.size() != 0) { isPersonal = true; - imgurAuth = Constants.IMGUR_HEADER_USER + " " + result.get(0).getToken(); + imgurAuth = IMGUR_HEADER_USER + " " + result.get(0).getToken(); } AlertDialogsHelper.getTextDialog( SharingActivity.this, dialogBuilder, R.string.choose, R.string.imgur_select_mode, null); @@ -1081,21 +1083,30 @@ void uploadImgur() { Bitmap bitmap = getBitmapFromPath(saveFilePath); final String imageString = getStringImage(bitmap); // sending image to server - StringRequest request = - new StringRequest( - Request.Method.POST, - Constants.IMGUR_IMAGE_UPLOAD_URL, - new Response.Listener() { + ImgurPicUploadReq imgurPicUpload = new ImgurPicUploadReq(); + imgurPicUpload.setImage(imageString); + if (caption != null && !caption.isEmpty()) { + imgurPicUpload.setCaption(caption); + } + String authorization; + if (isPersonal && imgurAuth != null) { + authorization = imgurAuth; + } else { + authorization = getClientAuth(); + } + imgurApiInterface + .uploadImageToImgur(authorization, imgurPicUpload) + .enqueue( + new Callback() { @Override - public void onResponse(String s) { - dialog.dismiss(); - JSONObject jsonObject = null; - - try { - jsonObject = new JSONObject(s); - Boolean success = jsonObject.getBoolean("success"); + public void onResponse( + Call call, Response response) { + if (response.body() != null && response.isSuccessful()) { + dialog.dismiss(); + ImgurPicUploadResp imgurPicUploadResp = response.body(); + boolean success = imgurPicUploadResp.isSuccess(); if (success) { - final String url = jsonObject.getJSONObject("data").getString("link"); + final String url = imgurPicUploadResp.getData().getLink(); if (isPersonal) { imgurString = getString(R.string.upload_personal) + "\n" + url; @@ -1143,45 +1154,18 @@ public void onClick(DialogInterface dialogInterface, int i) { SnackBarHandler.create(parent, getString(R.string.error_on_imgur)).show(); sendResult(FAIL); } - } catch (JSONException e) { - e.printStackTrace(); + } else { + dialog.dismiss(); + SnackBarHandler.create(parent, getString(R.string.error_volly)).show(); } } - }, - new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError volleyError) { + public void onFailure(Call call, Throwable t) { dialog.dismiss(); - SnackBarHandler.create(parent, getString(R.string.error_volly)) - .show(); // add volleyError to check error - } - }) { - @Override - protected Map getParams() throws AuthFailureError { - Map parameters = new HashMap(); - parameters.put("image", imageString); - if (caption != null && !caption.isEmpty()) parameters.put("title", caption); - return parameters; - } - - @Override - public Map getHeaders() throws AuthFailureError { - Map headers = new HashMap(); - if (isPersonal) { - if (imgurAuth != null) { - headers.put(getString(R.string.header_auth), imgurAuth); + SnackBarHandler.create(parent, getString(R.string.error_volly)).show(); } - } else { - headers.put(getString(R.string.header_auth), getClientAuth()); - } - - return headers; - } - }; - request.setRetryPolicy( - new DefaultRetryPolicy(50000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); - RequestQueue rQueue = Volley.newRequestQueue(SharingActivity.this); - rQueue.add(request); + }); } /** diff --git a/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadReq.java b/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadReq.java new file mode 100644 index 000000000..2b7135db3 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadReq.java @@ -0,0 +1,22 @@ +package org.fossasia.phimpme.share.imgur; + +public class ImgurPicUploadReq { + String image; + String caption; + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getCaption() { + return caption; + } + + public void setCaption(String caption) { + this.caption = caption; + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadResp.java b/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadResp.java new file mode 100644 index 000000000..bb36d35c1 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/imgur/ImgurPicUploadResp.java @@ -0,0 +1,52 @@ +package org.fossasia.phimpme.share.imgur; + +public class ImgurPicUploadResp { + private boolean success; + private Data data; + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public Data getData() { + return data; + } + + public void setData(Data data) { + this.data = data; + } + + public static class Data { + private String id; + private String title; + private String link; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java b/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java index d98aa6036..85fe41bf6 100644 --- a/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java +++ b/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java @@ -8,10 +8,6 @@ public class Constants { public static final int REQUEST_SHARE_RESULT = 50; public static final String SHARE_RESULT = "share_result"; - public static final String IMGUR_IMAGE_UPLOAD_URL = "https://api.imgur.com/3/image/"; - public static String IMGUR_HEADER_CLIENt = "Client-ID"; - public static String IMGUR_HEADER_USER = "Bearer"; - /*Also add dropbox api key in manifest */ public static final String DROPBOX_APP_KEY = "7fhwc9meece1m9g"; public static final String DROPBOX_APP_SECRET = "m5567c8v5yt1qc1"; diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/ImgurApi.java b/app/src/main/java/org/fossasia/phimpme/utilities/ImgurApi.java new file mode 100644 index 000000000..a483d01fd --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/utilities/ImgurApi.java @@ -0,0 +1,15 @@ +package org.fossasia.phimpme.utilities; + +import org.fossasia.phimpme.share.imgur.ImgurPicUploadReq; +import org.fossasia.phimpme.share.imgur.ImgurPicUploadResp; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.Header; +import retrofit2.http.POST; + +public interface ImgurApi { + + @POST("/image") + Call uploadImageToImgur( + @Header("Authorization") String authorization, @Body ImgurPicUploadReq body); +} diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java b/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java new file mode 100644 index 000000000..9f0ddef79 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java @@ -0,0 +1,35 @@ +package org.fossasia.phimpme.utilities; + +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import org.fossasia.phimpme.BuildConfig; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +// Retrofit client used for API Calls +public class RetrofitClient { + + private static OkHttpClient.Builder httpClientBuilder = null; + + private static OkHttpClient.Builder httpClient() { + if (httpClientBuilder == null) { + httpClientBuilder = new OkHttpClient.Builder(); + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + if (BuildConfig.DEBUG) { + interceptor.level(HttpLoggingInterceptor.Level.BASIC); + } else { + interceptor.level(HttpLoggingInterceptor.Level.NONE); + } + httpClientBuilder.interceptors().add(interceptor); + } + return httpClientBuilder; + } + + public static Retrofit getRetrofitClient(String baseUrl) { + return new Retrofit.Builder() + .baseUrl(baseUrl) + .client(httpClient().build()) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } +} diff --git a/build.gradle b/build.gradle index 25632c2cb..464b00e68 100755 --- a/build.gradle +++ b/build.gradle @@ -54,5 +54,6 @@ ext { nextCloudVersion = "1.5.0" lifecycleVersion = "2.1.0" glideVersion = "4.10.0" + retrofitVersion = "2.6.2" }