Android Open Source - facebook-like-button Facebook Like Activity






From Project

Back to project page facebook-like-button.

License

The source code is released under:

Apache License

If you think the Android project facebook-like-button listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.shamanland.facebook.likebutton;
/*from  w  ww  . java2 s  . c o m*/
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.text.Html;
import android.util.Base64;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.LinkedList;

import static com.shamanland.facebook.likebutton.BuildConfig.LOGGING;

public class FacebookLikeActivity extends Activity {
    private static final String LOG_TAG = FacebookLikeActivity.class.getSimpleName();

    public static final String PAGE_URL = "page.url";
    public static final String PAGE_TITLE = "page.title";
    public static final String PAGE_TEXT = "page.text";
    /**
     * Use {@link #PAGE_PICTURE_URL} or {@link #PAGE_PICTURE_ID}.
     * This param has the lowest priority.
     */
    @Deprecated
    public static final String PAGE_PICTURE = "page.picture";
    /**
     * This param has the highest priority.
     */
    public static final String PAGE_PICTURE_URL = "page.picture.url";
    /**
     * This param has normal priority.
     */
    public static final String PAGE_PICTURE_ID = "page.picture.id";
    public static final String APP_ID = "app.id";
    public static final String CONTENT_VIEW_ID = "content.view.id";
    public static final String OPTIONS = "options";

    private static final View.OnTouchListener SKIP_TOUCH = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    };

    private ViewGroup mContainer;
    private final LinkedList<WebView> mWindows;
    private final WebChromeClient mWebChromeClient;
    private final WebViewClient mWebViewClient;

    public Context getContext() {
        return this;
    }

    public FacebookLikeActivity() {
        mWindows = new LinkedList<WebView>();

        mWebChromeClient = new WebChromeClient() {
            @Override
            public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                if (transport == null) {
                    return false;
                }

                transport.setWebView(createWindow());
                resultMsg.sendToTarget();
                return true;
            }

            @Override
            public void onCloseWindow(WebView window) {
                removeWindow(window);
            }
        };

        mWebViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                View progress = getProgressView(view);
                if (progress != null) {
                    progress.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                View progress = getProgressView(view);
                if (progress != null) {
                    progress.setVisibility(View.GONE);
                }
            }

            private View getProgressView(WebView view) {
                final View progress;

                Object tag = view.getTag();
                if (tag instanceof View) {
                    progress = (View) tag;
                } else {
                    progress = createProgressBar(view);
                    view.setTag(progress);
                }

                return progress;
            }
        };
    }

    @Override
    protected void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(createRoot());
    }

    @Override
    protected void onPostCreate(Bundle state) {
        super.onPostCreate(state);

        String content = generateContent();
        if (content == null) {
            Toast.makeText(getApplication(), R.string.com_shamanland_facebook_like_activity_error, Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        if (LOGGING) {
            Log.v(LOG_TAG, "onPostCreate: loadDataWithBaseURL: " + getIntent().getStringExtra(PAGE_URL));
        }

        createWindow().loadDataWithBaseURL(getIntent().getStringExtra(PAGE_URL), content, "text/html", "utf-8", null);
    }

    @Override
    public void onBackPressed() {
        final boolean handled;

        WebView window = mWindows.peekLast();
        if (window.canGoBack()) {
            window.goBack();
            handled = true;
        } else {
            handled = removeWindow(window);
        }

        if (handled) {
            mContainer.playSoundEffect(SoundEffectConstants.CLICK);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Iterator<WebView> it = mWindows.iterator();
        while (it.hasNext()) {
            WebView window = it.next();
            it.remove();

            detachFromParent(window);
            window.destroy();
        }
    }

    private String generateContent() {
        String url = getIntent().getStringExtra(PAGE_URL);
        if (url == null) {
            return null;
        }

        try {
            new java.net.URL(url);
        } catch (MalformedURLException ex) {
            if (LOGGING) {
                Log.wtf(LOG_TAG, ex);
            }

            return null;
        }

        String title = getIntent().getStringExtra(PAGE_TITLE);
        String text = getIntent().getStringExtra(PAGE_TEXT);
        String appId = getIntent().getStringExtra(APP_ID);
        FacebookLikeOptions options = getIntent().getParcelableExtra(OPTIONS);
        if (options == null) {
            options = new FacebookLikeOptions();
        }

        StringBuilder sb = new StringBuilder();
        sb.append("<!DOCTYPE html>");
        sb.append("<html>");
        sb.append("<body>");

        if (title != null) {
            sb.append(options.titleOpen);
            sb.append(escapeHtml(title));
            sb.append(options.titleClose);
        }

        appendImg(options, sb);

        if (text != null) {
            sb.append(options.textOpen);
            sb.append(escapeHtml(text));
            sb.append(options.textClose);
        }

        appendUrl(url, appId, options, sb);

        sb.append("</body>");
        sb.append("</html>");

        try {
            return sb.toString();
        } catch (OutOfMemoryError ex) {
            if (LOGGING) {
                Log.wtf(LOG_TAG, ex);
            }

            return null;
        }
    }

    private void appendImg(FacebookLikeOptions options, StringBuilder sb) {
        int[] size = null;

        CharSequence imgSrc = getIntent().getStringExtra(PAGE_PICTURE_URL);
        if (imgSrc == null) {
            Bitmap picture = null;

            int pictureId = getIntent().getIntExtra(PAGE_PICTURE_ID, 0);
            if (pictureId != 0) {
                picture = BitmapFactory.decodeResource(getResources(), pictureId);
            }

            if (picture == null) {
                //noinspection deprecation
                picture = getIntent().getParcelableExtra(PAGE_PICTURE);
            }

            if (picture != null) {
                StringBuilder tmp = new StringBuilder("data:image/png;base64,");
                String base64 = bitmapToBase64(picture, getPictureSize(), size = new int[2]);
                if (base64 != null) {
                    tmp.append(base64);
                    imgSrc = tmp;
                }
            }
        }

        if (imgSrc != null) {
            sb.append("<img ");
            sb.append(options.pictureAttrs);
            sb.append("src='").append(imgSrc).append("'");

            if (size != null) {
                sb.append("width='").append(size[0]).append("'");
                sb.append("height='").append(size[1]).append("'");
            } else {
                sb.append("width='").append(getPictureSize()).append("'");
                sb.append("height='auto'");
            }

            sb.append("/>");
        }
    }

    private void appendUrl(String url, String appId, FacebookLikeOptions options, StringBuilder sb) {
        sb.append("<iframe ");
        sb.append("style='");
        sb.append("display:block;clear:both;border:none;overflow:hidden;");
        sb.append("width:100%;");
        sb.append("'");

        sb.append("src='//www.facebook.com/plugins/like.php");
        //noinspection deprecation
        sb.append("?href=").append(URLEncoder.encode(url));
        sb.append("&layout=").append(options.getLayoutString());
        sb.append("&action=").append(options.getActionString());
        sb.append("&show_faces=").append(options.showFaces);
        sb.append("&share=").append(options.share);

        if (appId != null && appId.trim().length() > 0) {
            sb.append("&appId=").append(appId);
        }

        sb.append("'");

        sb.append("scrolling='no'");
        sb.append("frameborder='0'");
        sb.append("allowTransparency='true'");
        sb.append("></iframe>");
    }

    private View createRoot() {
        View result = null;

        int contentViewId = getIntent().getIntExtra(CONTENT_VIEW_ID, 0);
        if (contentViewId != 0) {
            result = getLayoutInflater().inflate(contentViewId, null);
        }

        if (result != null) {
            View container = result.findViewById(R.id.com_shamanland_facebook_like_container);
            if (container instanceof ViewGroup) {
                mContainer = (ViewGroup) container;
            }
        }

        if (mContainer == null) {
            mContainer = new FrameLayout(getContext());
            result = mContainer;
        }

        return result;
    }

    @SuppressLint("SetJavaScriptEnabled")
    @SuppressWarnings("deprecation")
    protected WebView createWindow() {
        FrameLayout wrapper = new FrameLayout(getContext());
        WebView window = new WebView(getContext());
        window.getSettings().setJavaScriptEnabled(true);
        window.getSettings().setSupportMultipleWindows(true);
        window.getSettings().setSavePassword(false);
        window.setWebChromeClient(mWebChromeClient);
        window.setWebViewClient(mWebViewClient);

        wrapper.addView(window);
        mWindows.add(window);
        mContainer.addView(wrapper);
        return window;
    }

    protected View createProgressBar(WebView window) {
        ViewParent parent = window.getParent();
        if (parent instanceof ViewGroup) {
            ViewGroup wrapper = (ViewGroup) parent;

            View result = getLayoutInflater().inflate(R.layout.com_shamanland_facebook_like_activity_progress, wrapper, false);
            if (result != null) {
                wrapper.addView(result, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                result.setOnTouchListener(SKIP_TOUCH);
                return result;
            }
        }

        return null;
    }

    protected boolean removeWindow(WebView window) {
        if (mWindows.size() > 1) {
            mWindows.remove(window);

            ViewParent parent = window.getParent();
            if (parent instanceof View) {
                mContainer.removeView((View) parent);
            }

            detachFromParent(window);
            window.destroy();
            return true;
        } else {
            window.stopLoading();
            window.loadDataWithBaseURL("about:blank", "<html></html>", "text/html", "utf-8", null);
            return false;
        }
    }

    public static String escapeHtml(String unsecure) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            return Html.fromHtml(unsecure).toString();
        } else {
            return Html.escapeHtml(unsecure);
        }
    }

    public static String bitmapToBase64(Bitmap picture, int size, int[] outSize) {
        try {
            int w = picture.getWidth();
            int h = picture.getHeight();

            int max = Math.max(w, h);
            if (max > size) {
                float factor = max / (float) size;
                w = (int) (w / factor);
                h = (int) (h / factor);

                picture = Bitmap.createScaledBitmap(picture, w, h, false);
            }

            outSize[0] = w;
            outSize[1] = h;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            picture.compress(Bitmap.CompressFormat.PNG, 100, baos);
            return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
        } catch (Throwable ex) {
            if (LOGGING) {
                Log.wtf(LOG_TAG, ex);
            }

            return null;
        }
    }

    public static void detachFromParent(View view) {
        if (view != null) {
            ViewParent parent = view.getParent();
            if (parent instanceof ViewGroup) {
                ((ViewGroup) parent).removeView(view);
            }
        }
    }

    @SuppressWarnings("deprecation")
    public int getPictureSize() {
        return Math.min(
                getWindowManager().getDefaultDisplay().getWidth(),
                getWindowManager().getDefaultDisplay().getHeight()
        ) / 8;
    }
}




Java Source Code List

com.shamanland.facebook.likebutton.CalloutPath.java
com.shamanland.facebook.likebutton.FacebookLikeActivity.java
com.shamanland.facebook.likebutton.FacebookLikeBox.java
com.shamanland.facebook.likebutton.FacebookLikeButton.java
com.shamanland.facebook.likebutton.FacebookLikeOptions.java
com.shamanland.facebook.likebutton.FacebookLikePlugin.java
com.shamanland.facebook.likebutton.FacebookLinkStatProcessor.java
com.shamanland.facebook.likebutton.FacebookLinkStatTask.java
com.shamanland.facebook.likebutton.example.LikeAdapter.java
com.shamanland.facebook.likebutton.example.ListLikeActivity.java
com.shamanland.facebook.likebutton.example.MainActivity.java
com.shamanland.facebook.likebutton.example.OpenUrlDialogFragment.java