/* * Copyright 2010 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.stream; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.DialogError; import com.facebook.android.Facebook; import com.facebook.android.FacebookError; import com.facebook.android.Facebook.DialogListener; /** * A handler for the login page. * * @author yariv */ public class LoginHandler extends Handler { // The permissions that the app should request from the user // when the user authorizes the app. private static String[] PERMISSIONS = new String[] { "offline_access", "read_stream", "publish_stream" }; /** * Render the Login page. */ public void go() { dispatcher.getWebView().addJavascriptInterface( new JsHandler(), "app"); dispatcher.loadFile("login.html"); } /** * Contains functions that are exported to the Javascript context * in Login.html * * @author yariv */ private class JsHandler { /** * Opens the Facebook login dialog. */ public void login() { final Activity activity = LoginHandler.this.getActivity(); activity.runOnUiThread(new Runnable() { public void run() { // We need to temporarily remove the app's WebView // instance because Android apparently doesn't support // multiple WebView instances in the same app. dispatcher.hideWebView(); final Facebook fb = new Facebook(App.FB_APP_ID); Session.waitForAuthCallback(fb); fb.authorize(getActivity(), PERMISSIONS, new AppLoginListener(fb)); } }); } private class AppLoginListener implements DialogListener { private Facebook fb; public AppLoginListener(Facebook fb) { this.fb = fb; } public void onCancel() { Log.d("app", "login canceled"); } public void onComplete(Bundle values) { /** * We request the user's info so we can cache it locally and * use it to render the new html snippets * when the user updates her status or comments on a post. */ new AsyncFacebookRunner(fb).request("/me", new AsyncRequestListener() { public void onComplete(JSONObject obj, final Object state) { // save the session data String uid = obj.optString("id"); String name = obj.optString("name"); new Session(fb, uid, name).save(getActivity()); // render the Stream page in the UI thread getActivity().runOnUiThread(new Runnable() { public void run() { dispatcher.showWebView(); dispatcher.runHandler("stream"); } }); } }, null); } public void onError(DialogError e) { Log.d("app", "dialog error: " + e); } public void onFacebookError(FacebookError e) { Log.d("app", "facebook error: " + e); } } } }