diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 4a3583654958..59a76120ae05 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -2,7 +2,6 @@ buildscript { repositories { jcenter() maven { url 'https://maven.fabric.io/public' } - } dependencies { classpath 'com.android.tools.build:gradle:2.1.2' diff --git a/WordPress/src/main/java/org/wordpress/android/models/PublicizeConnection.java b/WordPress/src/main/java/org/wordpress/android/models/PublicizeConnection.java index 3aee592d4294..393981dc59fa 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/PublicizeConnection.java +++ b/WordPress/src/main/java/org/wordpress/android/models/PublicizeConnection.java @@ -3,6 +3,8 @@ import android.support.annotation.NonNull; import android.text.TextUtils; +import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.util.JSONUtils; import org.wordpress.android.util.StringUtils; @@ -39,6 +41,7 @@ public String toString() { private String mExternalName; private String mExternalDisplayName; private String mExternalProfilePictureUrl; + private int[] mSites; // `status` can be `ok` or `broken` -- `broken` means the connection needs to be re-established via the `refresh_URL` private String mStatus; @@ -136,6 +139,24 @@ public boolean isSameAs(PublicizeConnection other) { && other.getService().equals(this.getService()); } + public void setSites(int[] sites) { + mSites = sites; + } + + public int[] getSites() { + return mSites; + } + + public boolean isInSite(int siteId) { + for (int i = 0; i < mSites.length; i++) { + if (siteId == mSites[i]) { + return true; + } + } + + return false; + } + /* * passed JSON is a single connection from the response to sites/%d/publicize-connections {"ID":12783250, @@ -185,6 +206,23 @@ public static PublicizeConnection fromJson(JSONObject json) { connection.mStatus = json.optString("status"); connection.mRefreshUrl = json.optString("refresh_URL"); + try { + JSONArray jsonSitesArray = json.getJSONArray("sites"); + connection.mSites = getSitesArrayFromJson(jsonSitesArray); + } catch (JSONException e) { + connection.mSites = new int[0]; + e.printStackTrace(); + } + return connection; } + + private static int[] getSitesArrayFromJson(JSONArray jsonArray) throws JSONException { + int[] sitesArray = new int[jsonArray.length()]; + for (int i = 0; i < jsonArray.length(); i++) { + sitesArray[i] = jsonArray.getInt(i); + } + + return sitesArray; + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/ConnectButton.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/ConnectButton.java index f4cc4be90785..142d4816f7cc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/ConnectButton.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/ConnectButton.java @@ -74,6 +74,12 @@ private void updateView() { textColorResId = R.color.white; captionResId = R.string.share_btn_reconnect; break; + case CONNECT_ANOTHER_ACCOUNT: + normalColorResId = R.color.blue_medium; + pressedColorResId = R.color.blue_light; + textColorResId = R.color.white; + captionResId = R.string.share_btn_connect_another_account; + break; default: return; } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserDialogFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserDialogFragment.java new file mode 100644 index 000000000000..d79e82d822fa --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserDialogFragment.java @@ -0,0 +1,163 @@ +package org.wordpress.android.ui.publicize; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.R; +import org.wordpress.android.models.PublicizeConnection; +import org.wordpress.android.util.ToastUtils; + +import java.util.ArrayList; + +import de.greenrobot.event.EventBus; + +public class PublicizeAccountChooserDialogFragment extends DialogFragment implements PublicizeAccountChooserListAdapter.OnPublicizeAccountChooserListener { + public static String TAG = "publicize-account-chooser-dialog-fragment"; + private RecyclerView mNotConnectedRecyclerView; + private ArrayList mNotConnectedAccounts; + private ArrayList mConnectedAccounts; + private String mConnectionName = ""; + private String mServiceId = ""; + private int mSelectedIndex = 0; + private int mSiteId = 0; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + retrieveCurrentSiteFromArgs(); + configureConnectionName(); + + LayoutInflater inflater = getActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.publicize_account_chooser_dialog, null); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + configureAlertDialog(view, builder); + configureRecyclerViews(view); + + return builder.create(); + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + Activity activity = getActivity(); + if (activity != null && activity instanceof DialogInterface.OnDismissListener) { + ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); + } + } + + private void configureRecyclerViews(View view) { + PublicizeAccountChooserListAdapter notConnectedAdapter = new PublicizeAccountChooserListAdapter(mNotConnectedAccounts, this, false); + notConnectedAdapter.setHasStableIds(true); + mNotConnectedRecyclerView = (RecyclerView) view.findViewById(R.id.not_connected_recyclerview); + mNotConnectedRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + mNotConnectedRecyclerView.setAdapter(notConnectedAdapter); + + if (mConnectedAccounts.isEmpty()) { + hideConnectedView(view); + } else { + populateConnectedListView(view); + } + } + + private void hideConnectedView(View view) { + LinearLayout connectedHeader = (LinearLayout) view.findViewById(R.id.connected_header); + connectedHeader.setVisibility(View.GONE); + } + + private void populateConnectedListView(View view) { + RecyclerView listViewConnected = (RecyclerView) view.findViewById(R.id.connected_recyclerview); + PublicizeAccountChooserListAdapter connectedAdapter = new PublicizeAccountChooserListAdapter(mConnectedAccounts, null, true); + + listViewConnected.setLayoutManager(new LinearLayoutManager(getActivity())); + listViewConnected.setAdapter(connectedAdapter); + } + + private void configureAlertDialog(View view, AlertDialog.Builder builder) { + builder.setView(view); + builder.setTitle(getString(R.string.connecting_social_network, mConnectionName)); + builder.setMessage(getString(R.string.connection_chooser_message)); + builder.setPositiveButton(R.string.share_btn_connect, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + int keychainId = mNotConnectedAccounts.get(mSelectedIndex).connectionId; + EventBus.getDefault().post(new PublicizeEvents.ActionAccountChosen(mSiteId, keychainId)); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.cancel(); + ToastUtils.showToast(getActivity(), getActivity().getString(R.string.cannot_connect_account_error, mConnectionName)); + } + }); + } + + private boolean containsSiteId(int[] array) { + for (int a : array) { + if (a == mSiteId) { + return true; + } + } + + return false; + } + + private void retrieveCurrentSiteFromArgs() { + Bundle args = getArguments(); + if (args != null) { + mSiteId = args.getInt(PublicizeConstants.ARG_SITE_ID); + mServiceId = args.getString(PublicizeConstants.ARG_SERVICE_ID); + String jsonString = args.getString(PublicizeConstants.ARG_CONNECTION_ARRAY_JSON); + addConnectionsToLists(jsonString); + } + } + + private void addConnectionsToLists(String jsonString) { + mNotConnectedAccounts = new ArrayList<>(); + mConnectedAccounts = new ArrayList<>(); + try { + JSONObject jsonObject = new JSONObject(jsonString); + JSONArray jsonArray = jsonObject.getJSONArray("connections"); + for (int i = 0; i < jsonArray.length(); i++) { + PublicizeConnection connection = PublicizeConnection.fromJson(jsonArray.getJSONObject(i)); + if (connection.getService().equals(mServiceId)) { + if (connection.isInSite(mSiteId)) { + mConnectedAccounts.add(connection); + } else { + mNotConnectedAccounts.add(connection); + } + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + private void configureConnectionName() { + PublicizeConnection connection = mNotConnectedAccounts.get(0); + if (connection != null) { + mConnectionName = connection.getLabel(); + } + } + + @Override + public void onAccountSelected(int selectedIndex) { + mSelectedIndex = selectedIndex; + mNotConnectedRecyclerView.getAdapter().notifyDataSetChanged(); + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserListAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserListAdapter.java new file mode 100644 index 000000000000..f3bd52f0a2b1 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserListAdapter.java @@ -0,0 +1,81 @@ +package org.wordpress.android.ui.publicize; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RadioButton; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.models.PublicizeConnection; +import org.wordpress.android.widgets.WPNetworkImageView; + +import java.util.List; + +public class PublicizeAccountChooserListAdapter extends RecyclerView.Adapter { + private List mConnectionItems; + private OnPublicizeAccountChooserListener mListener; + private boolean mAreAccountsConnected; + private int mSelectedPosition; + + public PublicizeAccountChooserListAdapter(List connectionItems, OnPublicizeAccountChooserListener listener, boolean isConnected) { + mConnectionItems = connectionItems; + mListener = listener; + mAreAccountsConnected = isConnected; + mSelectedPosition = 0; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.publicize_connection_list_item, parent, false); + + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + final PublicizeConnection connection = mConnectionItems.get(position); + holder.mProfileImageView.setImageUrl(connection.getExternalProfilePictureUrl(), WPNetworkImageView.ImageType.PHOTO); + holder.mNameTextView.setText(connection.getExternalDisplayName()); + holder.mRadioButton.setChecked(position == mSelectedPosition); + + if (!mAreAccountsConnected) { + holder.mView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mListener != null) { + mSelectedPosition = holder.getAdapterPosition(); + mListener.onAccountSelected(mSelectedPosition); + } + } + }); + } else { + holder.mRadioButton.setVisibility(View.INVISIBLE); + } + } + + @Override + public int getItemCount() { + return mConnectionItems.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final View mView; + public final RadioButton mRadioButton; + public final WPNetworkImageView mProfileImageView; + public final TextView mNameTextView; + + public ViewHolder(View view) { + super(view); + mView = view; + mRadioButton = (RadioButton) view.findViewById(R.id.radio_button); + mProfileImageView = (WPNetworkImageView) view.findViewById(R.id.profile_pic); + mNameTextView = (TextView) view.findViewById(R.id.name); + } + } + + public interface OnPublicizeAccountChooserListener { + void onAccountSelected(int selectedIndex); + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java index 6a0fc4ee79b8..d42b15669f86 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java @@ -7,6 +7,7 @@ import com.wordpress.rest.RestRequest; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.WordPress; import org.wordpress.android.datasets.PublicizeTable; @@ -83,8 +84,13 @@ private static void connectStepOne(final int siteId, final String serviceId) { RestRequest.Listener listener = new RestRequest.Listener() { @Override public void onResponse(JSONObject jsonObject) { - int keyringConnectionId = parseServiceKeyringId(serviceId, jsonObject); - connectStepTwo(siteId, keyringConnectionId); + if (shouldShowChooserDialog(siteId, serviceId, jsonObject)) { + // show dialog showing multiple options + EventBus.getDefault().post(new PublicizeEvents.ActionRequestChooseAccount(siteId, serviceId, jsonObject)); + } else { + int keyringConnectionId = parseServiceKeyringId(serviceId, jsonObject); + connectStepTwo(siteId, keyringConnectionId); + } } }; RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { @@ -103,7 +109,7 @@ public void onErrorResponse(VolleyError volleyError) { * step two in creating a publicize connection: now that we have the keyring connection id, * create the actual connection */ - private static void connectStepTwo(int siteId, int keyringConnectionId) { + public static void connectStepTwo(int siteId, int keyringConnectionId) { RestRequest.Listener listener = new RestRequest.Listener() { @Override public void onResponse(JSONObject jsonObject) { @@ -127,6 +133,28 @@ public void onErrorResponse(VolleyError volleyError) { WordPress.getRestClientUtilsV1_1().post(path, params, null, listener, errorListener); } + private static boolean shouldShowChooserDialog(int siteId, String serviceId, JSONObject jsonObject) { + JSONArray jsonConnectionList = jsonObject.optJSONArray("connections"); + if (jsonConnectionList == null || jsonConnectionList.length() <= 1) { + return false; + } + + int totalAccounts = 0; + try { + for (int i = 0; i < jsonConnectionList.length(); i++) { + JSONObject connectionObject = jsonConnectionList.getJSONObject(i); + PublicizeConnection publicizeConnection = PublicizeConnection.fromJson(connectionObject); + if (publicizeConnection.getService().equals(serviceId) && !publicizeConnection.isInSite(siteId)) { + totalAccounts++; + } + } + + return totalAccounts > 0; + } catch (JSONException e) { + return false; + } + } + /* * extract the keyring connection for the passed service from the response * to /me/keyring-connections diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeConstants.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeConstants.java index ed875a2d08fc..5197ddcd88d7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeConstants.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeConstants.java @@ -4,10 +4,12 @@ public class PublicizeConstants { public static final String ARG_SITE_ID = "site_id"; public static final String ARG_SERVICE_ID = "service_id"; public static final String ARG_CONNECTION_ID = "connection_id"; + public static final String ARG_CONNECTION_ARRAY_JSON = "connection_array_json"; public enum ConnectAction { CONNECT, DISCONNECT, - RECONNECT + RECONNECT, + CONNECT_ANOTHER_ACCOUNT } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeDetailFragment.java index 55af5882ea2c..67ec98c401a6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeDetailFragment.java @@ -7,6 +7,8 @@ import android.view.ViewGroup; import android.widget.TextView; +import org.json.JSONException; +import org.json.JSONObject; import org.wordpress.android.R; import org.wordpress.android.datasets.PublicizeTable; import org.wordpress.android.models.PublicizeService; @@ -18,8 +20,9 @@ import org.wordpress.android.widgets.RecyclerItemDecoration; import org.wordpress.android.widgets.WPNetworkImageView; -public class PublicizeDetailFragment extends PublicizeBaseFragment implements PublicizeConnectionAdapter.OnAdapterLoadedListener { +import de.greenrobot.event.EventBus; +public class PublicizeDetailFragment extends PublicizeBaseFragment implements PublicizeConnectionAdapter.OnAdapterLoadedListener { private int mSiteId; private String mServiceId; @@ -134,10 +137,13 @@ public void onAdapterLoaded(boolean isEmpty) { if (!isAdded()) return; mLayoutConnections.setVisibility(isEmpty ? View.GONE : View.VISIBLE); - mConnectBtn.setVisibility(isEmpty ? View.VISIBLE : View.GONE); - if (isEmpty && hasOnPublicizeActionListener()) { - mConnectBtn.setAction(ConnectAction.CONNECT); + if (hasOnPublicizeActionListener()) { + if (isEmpty) { + mConnectBtn.setAction(ConnectAction.CONNECT); + } else { + mConnectBtn.setAction(ConnectAction.CONNECT_ANOTHER_ACCOUNT); + } mConnectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeEvents.java index 57ba8848c885..5a08bb007ea0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeEvents.java @@ -1,5 +1,6 @@ package org.wordpress.android.ui.publicize; +import org.json.JSONObject; import org.wordpress.android.ui.publicize.PublicizeConstants.ConnectAction; /** @@ -30,4 +31,46 @@ public boolean didSucceed() { return mSucceeded; } } + + public static class ActionAccountChosen { + private int mSiteId; + private int mKeychainId; + + public ActionAccountChosen(int siteId, int keychainId) { + mSiteId = siteId; + mKeychainId = keychainId; + } + + public int getSiteId() { + return mSiteId; + } + + public int getKeychainId() { + return mKeychainId; + } + } + + public static class ActionRequestChooseAccount { + private int mSiteId; + private String mServiceId; + private JSONObject mJSONObject; + + public ActionRequestChooseAccount(int siteId, String serviceId, JSONObject jsonObject) { + mSiteId = siteId; + mServiceId = serviceId; + mJSONObject = jsonObject; + } + + public JSONObject getJSONObject() { + return mJSONObject; + } + + public int getSiteId() { + return mSiteId; + } + + public String getServiceId() { + return mServiceId; + } + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java index a66d28095ea3..4ba412314384 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java @@ -1,12 +1,13 @@ package org.wordpress.android.ui.publicize; -import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; +import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; @@ -29,6 +30,7 @@ public class PublicizeListActivity extends AppCompatActivity PublicizeServiceAdapter.OnServiceClickListener { private int mSiteId; + private ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { @@ -142,11 +144,11 @@ private void reloadDetailFragment() { private void showWebViewFragment(int siteId, PublicizeService service, - PublicizeConnection connection) { + PublicizeConnection publicizeConnection) { if (isFinishing()) return; String tag = getString(R.string.fragment_tag_publicize_webview); - Fragment webViewFragment = PublicizeWebViewFragment.newInstance(siteId, service, connection); + Fragment webViewFragment = PublicizeWebViewFragment.newInstance(siteId, service, publicizeConnection); getFragmentManager() .beginTransaction() .replace(R.id.fragment_container, webViewFragment, tag) @@ -212,31 +214,31 @@ public void onRequestConnect(PublicizeService service) { } /* - * user requested to reconnect a broken connection from the detail fragment + * user requested to reconnect a broken publicizeConnection from the detail fragment */ @Override - public void onRequestReconnect(PublicizeService service, PublicizeConnection connection) { - showWebViewFragment(mSiteId, service, connection); + public void onRequestReconnect(PublicizeService service, PublicizeConnection publicizeConnection) { + showWebViewFragment(mSiteId, service, publicizeConnection); } /* - * user requested to disconnect a service connection from the detail fragment + * user requested to disconnect a service publicizeConnection from the detail fragment */ @Override - public void onRequestDisconnect(PublicizeConnection connection) { - confirmDisconnect(connection); + public void onRequestDisconnect(PublicizeConnection publicizeConnection) { + confirmDisconnect(publicizeConnection); } - private void confirmDisconnect(final PublicizeConnection connection) { + private void confirmDisconnect(final PublicizeConnection publicizeConnection) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( - String.format(getString(R.string.dlg_confirm_publicize_disconnect), connection.getLabel())); + String.format(getString(R.string.dlg_confirm_publicize_disconnect), publicizeConnection.getLabel())); builder.setTitle(R.string.share_btn_disconnect); builder.setCancelable(true); builder.setPositiveButton(R.string.share_btn_disconnect, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { - PublicizeActions.disconnect(connection); + PublicizeActions.disconnect(publicizeConnection); reloadDetailFragment(); } }); @@ -261,10 +263,36 @@ public void onEventMainThread(PublicizeEvents.ActionCompleted event) { if (isFinishing()) return; closeWebViewFragment(); + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } reloadDetailFragment(); if (!event.didSucceed()) { ToastUtils.showToast(this, R.string.error_generic); } } + + public void onEventMainThread(PublicizeEvents.ActionAccountChosen event) { + if (isFinishing()) return; + + PublicizeActions.connectStepTwo(event.getSiteId(), event.getKeychainId()); + mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage(getString(R.string.connecting_account)); + mProgressDialog.show(); + } + + public void onEventMainThread(PublicizeEvents.ActionRequestChooseAccount event) { + if (isFinishing()) return; + + closeWebViewFragment(); + + PublicizeAccountChooserDialogFragment dialogFragment = new PublicizeAccountChooserDialogFragment(); + Bundle args = new Bundle(); + args.putString(PublicizeConstants.ARG_CONNECTION_ARRAY_JSON, event.getJSONObject().toString()); + args.putInt(PublicizeConstants.ARG_SITE_ID, event.getSiteId()); + args.putString(PublicizeConstants.ARG_SERVICE_ID, event.getServiceId()); + dialogFragment.setArguments(args); + dialogFragment.show(getSupportFragmentManager(), PublicizeAccountChooserDialogFragment.TAG); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeWebViewFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeWebViewFragment.java index e5085a3dfa29..afe7285e3948 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeWebViewFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeWebViewFragment.java @@ -21,6 +21,7 @@ import org.wordpress.android.ui.WPWebViewActivity; import org.wordpress.android.ui.publicize.PublicizeConstants.ConnectAction; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.WebViewUtils; import de.greenrobot.event.EventBus; @@ -119,9 +120,9 @@ public void onResume() { } /* - * display the current connect URL for this service - this will ask the user to - * authorize the connection via the external service - */ + * display the current connect URL for this service - this will ask the user to + * authorize the connection via the external service + */ private void loadConnectUrl() { if (!isAdded()) return; @@ -174,6 +175,7 @@ public void onPageFinished(WebView view, String url) { // call the endpoint to make the actual connection PublicizeActions.connect(mSiteId, mServiceId); + WebViewUtils.clearCookiesAsync(); } } } diff --git a/WordPress/src/main/res/layout/publicize_account_chooser_dialog.xml b/WordPress/src/main/res/layout/publicize_account_chooser_dialog.xml new file mode 100644 index 000000000000..04715cbab855 --- /dev/null +++ b/WordPress/src/main/res/layout/publicize_account_chooser_dialog.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/layout/publicize_connection_list_item.xml b/WordPress/src/main/res/layout/publicize_connection_list_item.xml new file mode 100644 index 000000000000..548734e537b7 --- /dev/null +++ b/WordPress/src/main/res/layout/publicize_connection_list_item.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/WordPress/src/main/res/layout/publicize_detail_fragment.xml b/WordPress/src/main/res/layout/publicize_detail_fragment.xml index f4f7d2758fd6..9232d164400b 100644 --- a/WordPress/src/main/res/layout/publicize_detail_fragment.xml +++ b/WordPress/src/main/res/layout/publicize_detail_fragment.xml @@ -1,7 +1,6 @@ - - - + + + diff --git a/WordPress/src/main/res/layout/publicize_list_fragment.xml b/WordPress/src/main/res/layout/publicize_list_fragment.xml index 0c61eb8f434b..fb012f76b45b 100644 --- a/WordPress/src/main/res/layout/publicize_list_fragment.xml +++ b/WordPress/src/main/res/layout/publicize_list_fragment.xml @@ -1,10 +1,9 @@ diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index a5157b6d3718..970941225a32 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -285,4 +285,12 @@ 20dp 1dp 72dp + + + 1dp + 10dp + 40dp + 16sp + 8dp + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index fbce4caea209..3d20c9317502 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -1365,7 +1365,10 @@ Connect Disconnect Reconnect + Connect another account Disconnect from %s? + Connecting %s + Select the account you wish to authorize. Note that your posts will be shared to the selected account automatically. Current Theme @@ -1556,5 +1559,8 @@ Some media uploads have failed. You can\'t save or publish your post in this state. Would you like to remove all failed media? Remove failed uploads + Connected + The %s connection could not be made because no account was selected. + Connecting account diff --git a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/WebViewUtils.java b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/WebViewUtils.java new file mode 100644 index 000000000000..6247957819dc --- /dev/null +++ b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/WebViewUtils.java @@ -0,0 +1,22 @@ +package org.wordpress.android.util; + +import android.os.Build; +import android.webkit.CookieManager; +import android.webkit.ValueCallback; + +public class WebViewUtils { + public static void clearCookiesAsync() { + clearCookiesAsync(null); + } + + public static void clearCookiesAsync(ValueCallback callback) { + CookieManager cookieManager = CookieManager.getInstance(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + cookieManager.removeAllCookies(callback); + } else { + //noinspection deprecation + cookieManager.removeAllCookie(); + } + } +}