Disqus Login and Logout in Android

Disqus login and logout features as described in the previous blog entry on Disqus (http://globeotter.com/blog/disqus-android-code/) do not work as intended in the latest updates. Currently if you followed the Code the login will stay busy and the page has to be refreshed. You can see the busy signal in the screenshot below. To get rid of it you have to change Activities and come back to the Disqus page (in which you are auto logged in).  After looking into it a bit, we found a nice work around for these issues.

Disqus login and logout created a busy signal in this screenshot

If you would like to see how the code works you can look at our new App we made to Demo the functionality, The Daily Forum https://play.google.com/store/apps/details?id=otter.forum

The solution to the Disqus login and logout issues are contained in the WebViewClient in Android. It is not picking up the redirect and refreshing the page in the javascript. To address this we will need a new class that extends WebViewClient

MyWebViewClient.java

public class MyWebViewClient extends WebViewClient {

private String myUrl;
 public MyWebViewClient(String _myURL) {
 // TODO Auto-generated constructor stub
 myUrl=_myURL;

 }
 @Override
 public void onPageStarted(WebView view, String url, Bitmap favicon) {
 Log.i("page started", url);
 }

@Override
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
 Log.i("disqus error", "failed: " + failingUrl + ", error code: " + errorCode + " [" + description + "]");
 }

public void onPageFinished(WebView view, String url) {
 if(url.indexOf("logout")>-1 || url.indexOf("disqus.com/next/login-success")>-1 ){
 view.loadUrl(myUrl);

 }
 if(url.indexOf("disqus.com/_ax/twitter/complete")>-1||url.indexOf("disqus.com/_ax/facebook/complete")>-1||url.indexOf("disqus.com/_ax/google/complete")>-1){
 view.loadUrl("YOUR_URL/login.php");

 }
 if(url.indexOf("YOUR_URL/login.php")>-1){
 view.loadUrl(myUrl);
}
}
}

There are a few key features of this code. First it is listening for the Twitter,Facebook, and Google Plus login code. Your WebViewClient will now be looking for this URL “disqus.com/_ax”. When it detects this we send it to a blank URL login.php. This login page does nothing, we only use it so we can detect that the 3rd party login was successful. Second, after we have either detected a 3rd party login (via login.php) or have been logged in via disqus (“disqus.com/next/login-success”) we refresh our URL (this is the URL passed in that your disqus page was using). Third, the logout code is quite simple. When a logout is detected simply refresh the url as well.

Next we need to actually call this class. We will use the same Disqus.java class as the previous blog entry on Disqus, but this time we will call MyWebViewClient

Disqus.java

</pre>
public abstract class Disqus extends Activity
{
private WebView webDisqus;

protected void onCreate(Bundle savedInstanceState)
{

//set layout to disqus xml
String url="http:///showcomments.php?disqus_id="+insert disqus thread is here;
setContentView (R.layout.disqus);

webDisqus = (WebView) findViewById(R.id.disqus);
 //set up disqus
 WebSettings webSettings2 = webDisqus.getSettings();

webSettings2.setJavaScriptEnabled(true);

webSettings2.setBuiltInZoomControls(true);

webDisqus.requestFocusFromTouch();

//set to the new WebViewClient Class
webDisqus.setWebViewClient(new MyWebViewClient(url));

webDisqus.setWebChromeClient(new WebChromeClient());

webDisqus.loadUrl(url);

}

}

We hope this helps if you were struggling with the Disqus login and logout in Android. Let us know if it works for you. If you get a chance check out the Daily Forum and leave us a review!