diff --git a/app/build.gradle b/app/build.gradle index 19a777a0f..b58311a50 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,7 +39,7 @@ android { vectorDrawables.useSupportLibrary = true resConfigs "en" ndk { - abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' + abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } renderscriptTargetApi 19 renderscriptSupportModeEnabled true @@ -134,6 +134,7 @@ spotless { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'androidx.appcompat:appcompat:1.1.0' androidTestImplementation('com.android.support.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' }) @@ -236,9 +237,6 @@ dependencies { //opencv implementation project(':openCV') - //pdk - implementation 'com.github.forkerknights:android-pdk:1.2b' - //compressor implementation 'id.zelory:compressor:2.1.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cb6946394..be3e1238b 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,11 @@ android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + @@ -392,8 +397,12 @@ android:name="io.fabric.ApiKey" android:value="78c6ec5c18fcd10ffbfd28ae038f3311f2763889" /> - - + + + + diff --git a/app/src/main/java/org/fossasia/phimpme/accounts/AccountActivity.java b/app/src/main/java/org/fossasia/phimpme/accounts/AccountActivity.java index f6a3736dc..a8d81a50f 100644 --- a/app/src/main/java/org/fossasia/phimpme/accounts/AccountActivity.java +++ b/app/src/main/java/org/fossasia/phimpme/accounts/AccountActivity.java @@ -1,18 +1,15 @@ package org.fossasia.phimpme.accounts; -import static com.pinterest.android.pdk.PDKClient.setDebugMode; import static org.fossasia.phimpme.R.string.no_account_signed_in; import static org.fossasia.phimpme.data.local.AccountDatabase.AccountName.BOX; import static org.fossasia.phimpme.utilities.Constants.BOX_CLIENT_ID; import static org.fossasia.phimpme.utilities.Constants.BOX_CLIENT_SECRET; -import static org.fossasia.phimpme.utilities.Constants.PINTEREST_APP_ID; import static org.fossasia.phimpme.utilities.Constants.SUCCESS; import static org.fossasia.phimpme.utilities.Utils.checkNetwork; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -31,13 +28,8 @@ import com.box.androidsdk.content.models.BoxSession; import com.dropbox.core.android.Auth; import com.google.android.material.bottomnavigation.BottomNavigationView; -import com.pinterest.android.pdk.PDKCallback; -import com.pinterest.android.pdk.PDKClient; -import com.pinterest.android.pdk.PDKException; -import com.pinterest.android.pdk.PDKResponse; import com.twitter.sdk.android.core.identity.TwitterAuthClient; import io.realm.RealmQuery; -import java.util.ArrayList; import org.fossasia.phimpme.R; import org.fossasia.phimpme.base.PhimpmeProgressBarHandler; import org.fossasia.phimpme.base.RecyclerItemClickListner; @@ -51,6 +43,7 @@ import org.fossasia.phimpme.share.imgur.ImgurAuthActivity; import org.fossasia.phimpme.share.nextcloud.NextCloudAuth; import org.fossasia.phimpme.share.owncloud.OwnCloudActivity; +import org.fossasia.phimpme.share.pinterest.PinterestAuthActivity; import org.fossasia.phimpme.share.twitter.LoginActivity; import org.fossasia.phimpme.utilities.ActivitySwitchHelper; import org.fossasia.phimpme.utilities.BasicCallBack; @@ -82,7 +75,6 @@ public class AccountActivity extends ThemedActivity private AccountViewModel accountViewModel; private TwitterAuthClient client; - private PDKClient pdkClient; private BoxSession sessionBox; @Override @@ -103,9 +95,6 @@ public void onCreate(Bundle savedInstanceState) { phimpmeProgressBarHandler.show(); setUpRecyclerView(); client = new TwitterAuthClient(); - pdkClient = PDKClient.configureInstance(this, PINTEREST_APP_ID); - pdkClient.onConnect(this); - setDebugMode(true); configureBoxClient(); initObserver(); } @@ -190,7 +179,7 @@ public void onItemClick(final View childView, final int position) { break; case PINTEREST: - signInPinterest(); + startActivity(new Intent(this, PinterestAuthActivity.class)); break; case FLICKR: @@ -284,37 +273,6 @@ public void callBack(int status, Object data) { startActivity(i); } - private void signInPinterest() { - ArrayList scopes = new ArrayList<>(); - scopes.add(PDKClient.PDKCLIENT_PERMISSION_READ_PUBLIC); - scopes.add(PDKClient.PDKCLIENT_PERMISSION_WRITE_PUBLIC); - scopes.add(PDKClient.PDKCLIENT_PERMISSION_READ_RELATIONSHIPS); - scopes.add(PDKClient.PDKCLIENT_PERMISSION_WRITE_RELATIONSHIPS); - - pdkClient.login( - this, - scopes, - new PDKCallback() { - @Override - public void onSuccess(PDKResponse response) { - Log.d(getClass().getName(), response.getData().toString()); - accountViewModel.savePinterestToken( - response.getUser().getFirstName() + " " + response.getUser().getLastName()); - finish(); - startActivity(getIntent()); - SnackBarHandler.create(coordinatorLayout, getString(R.string.account_logged_pinterest)) - .show(); - } - - @Override - public void onFailure(PDKException exception) { - Log.e(getClass().getName(), exception.getDetailMessage()); - SnackBarHandler.create(coordinatorLayout, getString(R.string.pinterest_signIn_fail)) - .show(); - } - }); - } - @Override public void onItemLongPress(View childView, int position) { // No need to be implemented @@ -362,7 +320,6 @@ private void boxAuthentication() { protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); client.onActivityResult(requestCode, resultCode, data); - pdkClient.onOauthResponse(requestCode, resultCode, data); if ((requestCode == accountViewModel.OWNCLOUD_REQUEST_CODE && resultCode == accountViewModel.RESULT_OK) || (requestCode == accountViewModel.NEXTCLOUD_REQUEST_CODE diff --git a/app/src/main/java/org/fossasia/phimpme/accounts/AccountRepository.java b/app/src/main/java/org/fossasia/phimpme/accounts/AccountRepository.java index d3f08bb94..99d8a34d8 100644 --- a/app/src/main/java/org/fossasia/phimpme/accounts/AccountRepository.java +++ b/app/src/main/java/org/fossasia/phimpme/accounts/AccountRepository.java @@ -1,15 +1,32 @@ package org.fossasia.phimpme.accounts; +import android.graphics.Bitmap; import io.realm.Realm; import io.realm.RealmQuery; +import java.io.ByteArrayOutputStream; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; import org.fossasia.phimpme.data.local.AccountDatabase; import org.fossasia.phimpme.data.local.DatabaseHelper; +import org.fossasia.phimpme.share.pinterest.PinterestBoardsResp; +import org.fossasia.phimpme.share.pinterest.PinterestUploadImgResp; +import org.fossasia.phimpme.utilities.BasicCallBack; +import org.fossasia.phimpme.utilities.Constants; +import org.fossasia.phimpme.utilities.PinterestApi; +import org.fossasia.phimpme.utilities.RetrofitClient; +import org.fossasia.phimpme.utilities.Utils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; /** Created by @codedsun on 09/Oct/2019 */ class AccountRepository { private Realm realm = Realm.getDefaultInstance(); private DatabaseHelper databaseHelper = new DatabaseHelper(realm); + private PinterestApi pinterestApi = + RetrofitClient.getRetrofitClient(Constants.PINTEREST_BASE_URL).create(PinterestApi.class); // Fetches the details of all accounts RealmQuery fetchAllAccounts() { @@ -41,4 +58,78 @@ void saveUsernameAndToken( void deleteAccount(String accountName) { databaseHelper.deleteSignedOutAccount(accountName); } + + void uploadImageToPinterest(BasicCallBack callBack, String imagePath, String note, String board) { + AccountDatabase pinterestAccount = + databaseHelper.getAccountByName(AccountDatabase.AccountName.PINTEREST.name()); + if (pinterestAccount != null && pinterestAccount.getToken() != null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Bitmap bitmap = Utils.getBitmapFromPath(imagePath); + int numPixels = bitmap.getHeight() * bitmap.getWidth(); + if (numPixels > 3150000) { + PinterestUploadImgResp resp = new PinterestUploadImgResp(); + resp.setMessage("Image Size too large"); + callBack.callBack(Constants.FAIL, resp); + return; + } + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + RequestBody reqFile = + RequestBody.create(baos.toByteArray(), MediaType.parse("multipart/form-data")); + MultipartBody.Part multipartBody = + MultipartBody.Part.createFormData("image", imagePath, reqFile); + pinterestApi + .uploadImageToPinterest(pinterestAccount.getToken(), note, board, multipartBody) + .enqueue( + new Callback() { + @Override + public void onResponse( + Call call, Response response) { + if (response.isSuccessful()) { + callBack.callBack(Constants.SUCCESS, response.body()); + } else { + PinterestUploadImgResp resp = new PinterestUploadImgResp(); + resp.setMessage(response.message()); + callBack.callBack(Constants.FAIL, resp); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + PinterestUploadImgResp resp = new PinterestUploadImgResp(); + resp.setMessage(t.toString()); + callBack.callBack(Constants.FAIL, resp); + } + }); + } else { + // No account found for pinterest + callBack.callBack(Constants.FAIL, null); + } + } + + // get pinterest boards of user + void getPinterestBoards(BasicCallBack callBack) { + AccountDatabase pinterestAccount = + databaseHelper.getAccountByName(AccountDatabase.AccountName.PINTEREST.name()); + if (pinterestAccount != null && pinterestAccount.getToken() != null) { + pinterestApi + .getUserBoards(pinterestAccount.getToken()) + .enqueue( + new Callback() { + @Override + public void onResponse( + Call call, Response response) { + if (response.body() != null && response.isSuccessful()) { + callBack.callBack(Constants.SUCCESS, response.body()); + } else { + callBack.callBack(Constants.FAIL, "Unable to get Boards"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + callBack.callBack(Constants.FAIL, null); + } + }); + } + } } diff --git a/app/src/main/java/org/fossasia/phimpme/accounts/AccountViewModel.java b/app/src/main/java/org/fossasia/phimpme/accounts/AccountViewModel.java index e6157b11e..91569910e 100644 --- a/app/src/main/java/org/fossasia/phimpme/accounts/AccountViewModel.java +++ b/app/src/main/java/org/fossasia/phimpme/accounts/AccountViewModel.java @@ -4,6 +4,9 @@ import androidx.lifecycle.ViewModel; import io.realm.RealmQuery; import org.fossasia.phimpme.data.local.AccountDatabase; +import org.fossasia.phimpme.share.pinterest.PinterestBoardsResp; +import org.fossasia.phimpme.share.pinterest.PinterestUploadImgResp; +import org.fossasia.phimpme.utilities.Constants; /** Created by @codedsun on 09/Oct/2019 */ public class AccountViewModel extends ViewModel { @@ -13,8 +16,12 @@ public class AccountViewModel extends ViewModel { final int RESULT_OK = 1; private AccountRepository accountRepository = new AccountRepository(); - MutableLiveData error = new MutableLiveData<>(); + public MutableLiveData error = new MutableLiveData<>(); MutableLiveData> accountDetails = new MutableLiveData<>(); + public MutableLiveData boards = new MutableLiveData<>(); + public MutableLiveData pinterestUploadImageResponse = + new MutableLiveData<>(); + public MutableLiveData pinterestUploadImageError = new MutableLiveData<>(); public AccountViewModel() {} @@ -69,4 +76,38 @@ void deleteAccountFromDatabase(String accountName) { void saveImgurAccount(String username, String token) { accountRepository.saveUsernameAndToken(AccountDatabase.AccountName.IMGUR, username, token); } + + public void savePinterestAccount(String username, String token) { + accountRepository.saveUsernameAndToken(AccountDatabase.AccountName.PINTEREST, username, token); + } + + public void getUserPinterestBoards() { + accountRepository.getPinterestBoards( + (status, data) -> { + if (status == Constants.SUCCESS) { + PinterestBoardsResp resp = (PinterestBoardsResp) data; + boards.postValue(resp); + } else { + error.postValue(true); + } + }); + } + + public void uploadImageToBoards(String image, String note, String board) { + accountRepository.uploadImageToPinterest( + (status, data) -> { + if (status == Constants.SUCCESS) { + pinterestUploadImageResponse.postValue((PinterestUploadImgResp) data); + } else { + if (data == null) { + pinterestUploadImageError.postValue("No account logged in"); + } else { + pinterestUploadImageError.postValue(((PinterestUploadImgResp) data).getMessage()); + } + } + }, + image, + note, + board); + } } diff --git a/app/src/main/java/org/fossasia/phimpme/data/local/DatabaseHelper.java b/app/src/main/java/org/fossasia/phimpme/data/local/DatabaseHelper.java index bf1138684..7b791b08d 100644 --- a/app/src/main/java/org/fossasia/phimpme/data/local/DatabaseHelper.java +++ b/app/src/main/java/org/fossasia/phimpme/data/local/DatabaseHelper.java @@ -64,4 +64,8 @@ public void delete(ImageDescModel item) { item.deleteFromRealm(); realm.commitTransaction(); } + + public AccountDatabase getAccountByName(String accountName) { + return realm.where(AccountDatabase.class).contains("name", accountName).findFirst(); + } } 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 252233325..d7669f6e9 100644 --- a/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java +++ b/app/src/main/java/org/fossasia/phimpme/share/SharingActivity.java @@ -81,10 +81,6 @@ import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation; import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation; -import com.pinterest.android.pdk.PDKCallback; -import com.pinterest.android.pdk.PDKClient; -import com.pinterest.android.pdk.PDKException; -import com.pinterest.android.pdk.PDKResponse; import com.tumblr.jumblr.JumblrClient; import com.tumblr.jumblr.types.PhotoPost; import com.tumblr.jumblr.types.User; @@ -114,6 +110,7 @@ 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.pinterest.PinterestShareActivity; import org.fossasia.phimpme.share.tumblr.TumblrClient; import org.fossasia.phimpme.share.twitter.HelperMethods; import org.fossasia.phimpme.utilities.ActivitySwitchHelper; @@ -318,7 +315,11 @@ public void onClick(DialogInterface dialogInterface, int i) { break; case PINTEREST: - shareToPinterest(); + Intent pinterestIntent = + new Intent(SharingActivity.this, PinterestShareActivity.class); + pinterestIntent.putExtra(Constants.DATA, saveFilePath); + startActivity(pinterestIntent); + finish(); break; case MESSENGER: @@ -804,75 +805,6 @@ public void onClick(View v) { }); } - private void shareToPinterest() { - final AlertDialog.Builder dialogBuilder = - new AlertDialog.Builder(SharingActivity.this, getDialogStyle()); - final EditText captionEditText = new EditText(getApplicationContext()); - - String link = context.getString(R.string.Pinterest_link); - AlertDialogsHelper.getInsertTextDialog( - SharingActivity.this, dialogBuilder, captionEditText, R.string.Pinterest_link, link); - dialogBuilder.setNegativeButton(getString(R.string.cancel).toUpperCase(), null); - dialogBuilder.setPositiveButton( - getString(R.string.post_action).toUpperCase(), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // This should br empty it will be overwrite later - // to avoid dismiss of the dialog on wrong password - } - }); - - final AlertDialog passwordDialog = dialogBuilder.create(); - passwordDialog.show(); - AlertDialogsHelper.setButtonTextColor( - new int[] {DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE}, - getAccentColor(), - passwordDialog); - passwordDialog - .getButton(AlertDialog.BUTTON_POSITIVE) - .setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - String captionText = captionEditText.getText().toString(); - boardID = captionText; - postToPinterest(boardID); - passwordDialog.dismiss(); - } - }); - } - - private void postToPinterest(final String boardID) { - SnackBarHandler.create(parent, getString(R.string.pinterest_image_uploading)).show(); - NotificationHandler.make( - R.string.pinterest, R.string.upload_progress, R.drawable.ic_cloud_upload_black_24dp); - Bitmap image = getBitmapFromPath(saveFilePath); - PDKClient.getInstance() - .createPin( - caption, - boardID, - image, - null, - new PDKCallback() { - @Override - public void onSuccess(PDKResponse response) { - NotificationHandler.actionPassed(R.string.upload_complete); - Log.d(getClass().getName(), response.getData().toString()); - SnackBarHandler.create(parent, getString(R.string.pinterest_post)).show(); - sendResult(Constants.SUCCESS); - } - - @Override - public void onFailure(PDKException exception) { - NotificationHandler.actionFailed(); - Log.e(getClass().getName(), exception.getDetailMessage()); - SnackBarHandler.create(parent, getString(R.string.Pinterest_fail)).show(); - sendResult(FAIL); - } - }); - } - private void shareToTwitter() { if (Utils.checkAlreadyExist(TWITTER)) { Glide.with(this) diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/BoardsListAdapter.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/BoardsListAdapter.java new file mode 100644 index 000000000..2828fae35 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/BoardsListAdapter.java @@ -0,0 +1,63 @@ +package org.fossasia.phimpme.share.pinterest; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import java.util.ArrayList; +import org.fossasia.phimpme.R; +import org.fossasia.phimpme.utilities.BasicCallBack; +import org.fossasia.phimpme.utilities.Constants; + +/** Created by @codedsun on 14/Oct/2019 */ +public class BoardsListAdapter extends RecyclerView.Adapter { + + BasicCallBack callback; + + BoardsListAdapter(BasicCallBack callback) { + this.callback = callback; + } + + private ArrayList boardsArray = new ArrayList<>(); + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder( + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_pinterest_boards, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.tvName.setText((boardsArray.get(position)).getName()); + holder.itemView.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + callback.callBack(Constants.SUCCESS, boardsArray.get(position)); + } + }); + } + + @Override + public int getItemCount() { + return boardsArray.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + private TextView tvName; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvName = itemView.findViewById(R.id.tv_name); + } + } + + public void addDatatoArray(ArrayList dataArray) { + boardsArray = dataArray; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestAuthActivity.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestAuthActivity.java new file mode 100644 index 000000000..2cb6da851 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestAuthActivity.java @@ -0,0 +1,163 @@ +package org.fossasia.phimpme.share.pinterest; + +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.webkit.WebResourceRequest; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ProgressBar; +import androidx.lifecycle.ViewModelProviders; +import butterknife.BindView; +import butterknife.ButterKnife; +import org.fossasia.phimpme.R; +import org.fossasia.phimpme.accounts.AccountViewModel; +import org.fossasia.phimpme.base.ThemedActivity; +import org.fossasia.phimpme.utilities.Constants; +import org.fossasia.phimpme.utilities.PinterestApi; +import org.fossasia.phimpme.utilities.RetrofitClient; +import org.fossasia.phimpme.utilities.Utils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** Created by codedsun on 13/Oct/2019 */ +public class PinterestAuthActivity extends ThemedActivity { + + private static final String TAG = PinterestAuthActivity.class.getName(); + private static final String PINTEREST_GRANT_TYPE = "authorization_code"; + private static final String PINTEREST_AUTH_STATE = + "2019phimpme"; // TODO:check before release to be exact in developer console + private static final String PINTEREST_REDIRECT_URI = + "https://phimp.me"; // TODO: check before release to be exact as in developer console + private static final String PINTEREST_AUTH_URL = + "https://api.pinterest.com/oauth/?" + + "response_type=code&" + + "redirect_uri=" + + PINTEREST_REDIRECT_URI + + "&" + + "client_id=" + + Constants.PINTEREST_APP_ID + + "&" + + "scope=read_public,write_public&" + + "state=" + + PINTEREST_AUTH_STATE; + + @BindView(R.id.web_view) + WebView webView; + + @BindView(R.id.progress_bar) + ProgressBar progressBar; + + private PinterestApi pinterestApi; + private AccountViewModel accountViewModel; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pinterest_auth); + ButterKnife.bind(this); + accountViewModel = ViewModelProviders.of(this).get(AccountViewModel.class); + webView.setBackgroundColor(Color.TRANSPARENT); + Log.d(TAG, PINTEREST_AUTH_URL); + pinterestApi = + RetrofitClient.getRetrofitClient(Constants.PINTEREST_BASE_URL).create(PinterestApi.class); + webView.getSettings().setJavaScriptEnabled(true); + if (Constants.PINTEREST_APP_ID.isEmpty() + || Constants.PINTEREST_APP_SECRET.isEmpty() + || PINTEREST_AUTH_STATE.isEmpty() + || PINTEREST_REDIRECT_URI.isEmpty()) { + Utils.showToastShort(this, "No App Id Present "); + return; + } + webView.setWebViewClient( + new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + progressBar.setVisibility(View.GONE); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + // https://phimp.me/?state=2019phimpme&code=87ee9a33518a418c - when yes pressed + // https://phimp.me/?state=2019phimpme - When no pressed + if (request.getUrl().toString().contains(PINTEREST_REDIRECT_URI) + && (request.getUrl().getQueryParameter("state") != null + && request.getUrl().getQueryParameter("state").equals(PINTEREST_AUTH_STATE))) { + if (request.getUrl().getQueryParameter("code") != null) { + processAuthCode(request.getUrl().getQueryParameter("code")); + progressBar.setVisibility(View.VISIBLE); + } else { + // User has pressed no + finish(); + } + } + return false; + } + }); + webView.loadUrl(PINTEREST_AUTH_URL); + } + + private void processAuthCode(String code) { + progressBar.setVisibility(View.VISIBLE); + pinterestApi + .getUserToken( + PINTEREST_GRANT_TYPE, Constants.PINTEREST_APP_ID, Constants.PINTEREST_APP_SECRET, code) + .enqueue( + new Callback() { + @Override + public void onResponse( + Call call, Response response) { + if (response.body() != null && response.isSuccessful()) { + PinterestUserTokenResp resp = response.body(); + fetchUserDetails(resp.getAccessToken()); + } else { + progressBar.setVisibility(View.GONE); + Utils.showToastShort( + PinterestAuthActivity.this, getString(R.string.something_went_wrong)); + finish(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + progressBar.setVisibility(View.GONE); + Utils.showToastShort( + PinterestAuthActivity.this, getString(R.string.something_went_wrong)); + finish(); + } + }); + } + + private void fetchUserDetails(String accessToken) { + pinterestApi + .getUserDetails(accessToken) + .enqueue( + new Callback() { + @Override + public void onResponse( + Call call, Response response) { + if (response.body() != null && response.isSuccessful()) { + PinterestUserResp resp = response.body(); + accountViewModel.savePinterestAccount( + resp.getData().getUrl().substring(26, resp.getData().getUrl().length() - 1), + accessToken); + finish(); + } else { + Utils.showToastShort( + PinterestAuthActivity.this, getString(R.string.something_went_wrong)); + finish(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Utils.showToastShort( + PinterestAuthActivity.this, getString(R.string.something_went_wrong)); + finish(); + } + }); + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestBoardsResp.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestBoardsResp.java new file mode 100644 index 000000000..1b2ba61ac --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestBoardsResp.java @@ -0,0 +1,46 @@ +package org.fossasia.phimpme.share.pinterest; + +import java.util.ArrayList; + +/** Created by @codedsun on 23/Oct/2019 */ +public class PinterestBoardsResp { + private ArrayList data; + + public ArrayList getData() { + return data; + } + + public void setData(ArrayList data) { + this.data = data; + } + + public static class Data { + private String name; + private String url; + private String id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestShareActivity.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestShareActivity.java new file mode 100644 index 000000000..461aef96c --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestShareActivity.java @@ -0,0 +1,150 @@ +package org.fossasia.phimpme.share.pinterest; + +import android.net.Uri; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import butterknife.BindView; +import butterknife.ButterKnife; +import com.bumptech.glide.Glide; +import java.io.File; +import org.fossasia.phimpme.R; +import org.fossasia.phimpme.accounts.AccountViewModel; +import org.fossasia.phimpme.utilities.Constants; +import org.fossasia.phimpme.utilities.Utils; + +public class PinterestShareActivity extends AppCompatActivity { + + @BindView(R.id.iv_pic) + ImageView ivPic; + + @BindView(R.id.tv_boards_label) + TextView tvBoardsLabel; + + @BindView(R.id.rv_boards) + RecyclerView rvBoards; + + @BindView(R.id.progress_bar) + ProgressBar progressBar; + + @BindView(R.id.toolbar) + Toolbar toolbar; + + private AccountViewModel accountViewModel; + + private String saveImagePath; + + private BoardsListAdapter boardsListAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pinterest_share); + ButterKnife.bind(this); + setSupportActionBar(toolbar); + getSupportActionBar().setTitle(R.string.pinterest); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + accountViewModel = ViewModelProviders.of(this).get(AccountViewModel.class); + saveImagePath = getIntent().getStringExtra(Constants.DATA); + if (saveImagePath != null) { + initObserver(); + initViews(); + } else { + Utils.showToastShort(this, getString(R.string.image_invalid)); + finish(); + } + } + + private void initObserver() { + accountViewModel.boards.observe( + this, + response -> { + progressBar.setVisibility(View.GONE); + Utils.showToastShort(this, "Suneet"); + if (response.getData().size() != 0) { + rvBoards.setVisibility(View.VISIBLE); + tvBoardsLabel.setVisibility(View.VISIBLE); + boardsListAdapter.addDatatoArray(response.getData()); + } else { + rvBoards.setVisibility(View.GONE); + tvBoardsLabel.setVisibility(View.GONE); + } + }); + + accountViewModel.error.observe( + this, + status -> { + progressBar.setVisibility(View.GONE); + Utils.showToastShort(this, "Suneet1"); + if (status) { + // jsonException or volley error occured + Utils.showToastShort( + PinterestShareActivity.this, getString(R.string.something_went_wrong)); + } else { + // no account found of pinterest + Utils.showToastShort( + PinterestShareActivity.this, "Please Sign In with pinterest account again"); + finish(); + } + }); + + accountViewModel.pinterestUploadImageError.observe( + this, + new Observer() { + @Override + public void onChanged(String s) { + progressBar.setVisibility(View.GONE); + Utils.showToastShort(PinterestShareActivity.this, s); + } + }); + + accountViewModel.pinterestUploadImageResponse.observe( + this, + new Observer() { + @Override + public void onChanged(PinterestUploadImgResp pinterestUploadImgResp) { + progressBar.setVisibility(View.GONE); + Utils.showToastShort(PinterestShareActivity.this, getString(R.string.upload_complete)); + finish(); + } + }); + } + + private void initViews() { + Glide.with(this).asBitmap().load(Uri.fromFile(new File(saveImagePath))).into(ivPic); + // tvCreateBoard.setVisibility(View.VISIBLE); + boardsListAdapter = + new BoardsListAdapter( + (status, data) -> { + if (status == Constants.SUCCESS) { + accountViewModel.uploadImageToBoards( + saveImagePath, "Suneeet", "suneetbond/vrindavan"); + } else { + Utils.showToastShort(this, getString(R.string.something_went_wrong)); + progressBar.setVisibility(View.GONE); + } + }); + rvBoards.setLayoutManager(new LinearLayoutManager(this)); + rvBoards.setAdapter(boardsListAdapter); + accountViewModel.getUserPinterestBoards(); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + } + return false; + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUploadImgResp.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUploadImgResp.java new file mode 100644 index 000000000..becf40bb9 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUploadImgResp.java @@ -0,0 +1,65 @@ +package org.fossasia.phimpme.share.pinterest; + +import java.util.ArrayList; + +/** Created by @codedsun on 05/Nov/2019 */ +public class PinterestUploadImgResp { + private ArrayList data; + + private String message; + + public ArrayList getData() { + return data; + } + + public void setData(ArrayList data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class Data { + private String link; + private String note; + private String id; + private String url; + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getNote() { + return note; + } + + public void setNote(String note) { + this.note = note; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserResp.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserResp.java new file mode 100644 index 000000000..e30eb1136 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserResp.java @@ -0,0 +1,51 @@ +package org.fossasia.phimpme.share.pinterest; + +import com.google.gson.annotations.SerializedName; + +/** Created by @codedsun on 23/Oct/2019 */ +public class PinterestUserResp { + + private Data data; + + public static class Data { + private String url; + + @SerializedName("first_name") + private String firstName; + + @SerializedName("last_name") + private String lastName; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + } + + public Data getData() { + return data; + } + + public void setData(Data data) { + this.data = data; + } +} diff --git a/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserTokenResp.java b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserTokenResp.java new file mode 100644 index 000000000..13a1745fa --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/share/pinterest/PinterestUserTokenResp.java @@ -0,0 +1,27 @@ +package org.fossasia.phimpme.share.pinterest; + +import com.google.gson.annotations.SerializedName; + +/** Created by @codedsun on 23/Oct/2019 */ +public class PinterestUserTokenResp { + String status; + + @SerializedName("access_token") + String accessToken; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} 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 85fe41bf6..581079af3 100644 --- a/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java +++ b/app/src/main/java/org/fossasia/phimpme/utilities/Constants.java @@ -7,6 +7,7 @@ public class Constants { public static int FAIL = 1; public static final int REQUEST_SHARE_RESULT = 50; public static final String SHARE_RESULT = "share_result"; + public static final String DATA = "DATA"; /*Also add dropbox api key in manifest */ public static final String DROPBOX_APP_KEY = "7fhwc9meece1m9g"; @@ -33,7 +34,11 @@ public class Constants { + MY_IMGUR_CLIENT_ID + "&response_type=token"; - public static final String PINTEREST_APP_ID = "4914573327424567067"; + // public static final String PINTEREST_APP_ID = "4914573327424567067"; + public static final String PINTEREST_APP_ID = "5060239792999016722"; + public static final String PINTEREST_APP_SECRET = + "bb2e4bfbb72dd12fd9cd6ec40627a3999eda262320178e63c10b6f74e10d4e5d"; + public static final String PINTEREST_BASE_URL = "https://api.pinterest.com/v1/"; public static final String PACKAGE_INSTAGRAM = "com.instagram.android"; public static final String PACKAGE_WHATSAPP = "com.whatsapp"; diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/PinterestApi.java b/app/src/main/java/org/fossasia/phimpme/utilities/PinterestApi.java new file mode 100644 index 000000000..1253cfed5 --- /dev/null +++ b/app/src/main/java/org/fossasia/phimpme/utilities/PinterestApi.java @@ -0,0 +1,41 @@ +package org.fossasia.phimpme.utilities; + +import okhttp3.MultipartBody; +import org.fossasia.phimpme.share.pinterest.PinterestBoardsResp; +import org.fossasia.phimpme.share.pinterest.PinterestUploadImgResp; +import org.fossasia.phimpme.share.pinterest.PinterestUserResp; +import org.fossasia.phimpme.share.pinterest.PinterestUserTokenResp; +import retrofit2.Call; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.Part; +import retrofit2.http.Query; + +/** Created by @codedsun on 23/Oct/2019 */ +public interface PinterestApi { + + @GET("me") + Call getUserDetails(@Query("access_token") String accessToken); + + @POST("oauth/token") + @FormUrlEncoded + Call getUserToken( + @Field("grant_type") String grantType, + @Field("client_id") String clientId, + @Field("client_secret") String clientSecret, + @Field("code") String code); + + @GET("me/boards") + Call getUserBoards(@Query("access_token") String accessToken); + + @Multipart + @POST("pins/") + Call uploadImageToPinterest( + @Query("access_token") String accessToken, + @Query("note") String note, + @Query("board") String boards, + @Part MultipartBody.Part image); +} diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java b/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java index 9f0ddef79..52b1d0e06 100644 --- a/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java +++ b/app/src/main/java/org/fossasia/phimpme/utilities/RetrofitClient.java @@ -16,7 +16,7 @@ private static OkHttpClient.Builder httpClient() { httpClientBuilder = new OkHttpClient.Builder(); HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); if (BuildConfig.DEBUG) { - interceptor.level(HttpLoggingInterceptor.Level.BASIC); + interceptor.level(HttpLoggingInterceptor.Level.BODY); } else { interceptor.level(HttpLoggingInterceptor.Level.NONE); } diff --git a/app/src/main/java/org/fossasia/phimpme/utilities/Utils.java b/app/src/main/java/org/fossasia/phimpme/utilities/Utils.java index 2998cae63..67bceacb7 100644 --- a/app/src/main/java/org/fossasia/phimpme/utilities/Utils.java +++ b/app/src/main/java/org/fossasia/phimpme/utilities/Utils.java @@ -20,6 +20,7 @@ import android.speech.RecognizerIntent; import android.util.Base64; import android.view.View; +import android.widget.Toast; import androidx.annotation.NonNull; import com.google.android.material.snackbar.Snackbar; import io.realm.Realm; @@ -162,4 +163,8 @@ public static void promptSpeechInput( SnackBarHandler.create(parentView, activity.getString(R.string.speech_not_supported)).show(); } } + + public static void showToastShort(Context context, String message) { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } } diff --git a/app/src/main/res/drawable-mdpi/ic_plus_pinterest.png b/app/src/main/res/drawable-mdpi/ic_plus_pinterest.png new file mode 100644 index 000000000..819bb9585 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_plus_pinterest.png differ diff --git a/app/src/main/res/layout/activity_pinterest_auth.xml b/app/src/main/res/layout/activity_pinterest_auth.xml new file mode 100644 index 000000000..9c61cec4d --- /dev/null +++ b/app/src/main/res/layout/activity_pinterest_auth.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pinterest_share.xml b/app/src/main/res/layout/activity_pinterest_share.xml new file mode 100644 index 000000000..cbd846396 --- /dev/null +++ b/app/src/main/res/layout/activity_pinterest_share.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_pinterest_boards.xml b/app/src/main/res/layout/item_pinterest_boards.xml new file mode 100644 index 000000000..de9db7db6 --- /dev/null +++ b/app/src/main/res/layout/item_pinterest_boards.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 553648d0e..886a389bf 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1439,4 +1439,6 @@ fb://page/ phimpmeapp https://www.facebook.com/phimpmeapp + Something went wrong + Boards