/* * Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez * TweetTopics 2.0 * javielinux@gmail.com * * 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.javielinux.utils; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Display; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.GridView; import android.widget.LinearLayout; import com.javielinux.adapters.LinksAdapter; import com.javielinux.dialogs.HashTagDialogFragment; import com.javielinux.infos.InfoLink; import com.javielinux.infos.InfoTweet; import com.javielinux.tweettopics2.BaseLayersActivity; import com.javielinux.tweettopics2.R; import com.javielinux.tweettopics2.TweetActivity; import com.javielinux.tweettopics2.UserActivity; import com.nineoldandroids.animation.Animator; import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator; import java.util.ArrayList; public class PopupLinks { public interface PopupLinksListener { void onShowLinks(View view, InfoTweet infoTweet); } private LinearLayout layoutLinks; private LinearLayout layoutMainLinks; private GridView gvLinks; private LinksAdapter linksAdapter; private ArrayList<String> links = new ArrayList<String>(); private FragmentActivity activity; private int widthScreen; private int heightScreen; private int statusBarHeight; private InfoTweet selectedInfoTweet; public PopupLinks(FragmentActivity activity) { init(activity); } private void init(FragmentActivity activity) { this.activity = activity; Display display = activity.getWindowManager().getDefaultDisplay(); widthScreen = display.getWidth(); heightScreen = display.getHeight(); } public void loadPopup(ViewGroup root) { View popupLinks = activity.getLayoutInflater().inflate(R.layout.popup_links, null); layoutMainLinks = (LinearLayout) popupLinks.findViewById(R.id.tweettopics_ll_main_links); layoutMainLinks.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { hideLinks(); } }); layoutLinks = (LinearLayout) popupLinks.findViewById(R.id.tweettopics_ll_links); linksAdapter = new LinksAdapter(activity, activity.getSupportLoaderManager(), links); gvLinks = (GridView) popupLinks.findViewById(R.id.tweettopics_gv_links); gvLinks.setAdapter(linksAdapter); gvLinks.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { goToLink(links.get(i)); } }); root.addView(popupLinks); } /* SHOW LINKS */ public void showLinks(View view, InfoTweet infoTweet) { ArrayList<String> linksInText = LinksUtils.pullLinks(infoTweet.getText(), infoTweet.getContentURLs()); selectedInfoTweet = infoTweet; if (linksInText.size()==1) { goToLink(linksInText.get(0)); } else { int widthContainer = widthScreen; int heightContainer = heightScreen; links.clear(); links.addAll(linksInText); int rows = 0; if (links.size()>4) { rows = links.size()/3; if (links.size()%3>0) rows++; gvLinks.setNumColumns(3); widthContainer = (widthScreen/4)*3 + Utils.dip2px(activity,40); } else { rows = links.size()/2; if (links.size()%2>0) rows++; gvLinks.setNumColumns(2); widthContainer = (widthScreen/4)*2 + Utils.dip2px(activity,30); } if (rows==1) { heightContainer = Utils.dip2px(activity,110); } else { heightContainer = Utils.dip2px(activity,100) * rows; } linksAdapter.notifyDataSetChanged(); if (statusBarHeight<=0) { Rect rect= new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); statusBarHeight= rect.top; } int[] loc = new int[2]; view.getLocationOnScreen(loc); int widthView = view.getMeasuredWidth(); int heightView = view.getMeasuredHeight(); int x = loc[0] + (widthView/2) - (widthContainer/2); int y = loc[1] - statusBarHeight + (heightView/2) - (heightContainer/2); int xCenterView = loc[0] + (widthView/2); int yCenterView = loc[1] - statusBarHeight + (heightView/2); int top = (int)activity.getResources().getDimension(R.dimen.actionbar_height); int bottom = heightScreen-statusBarHeight; if (x<0) x = 0; if (y<top) y = top; if (x>widthScreen-widthContainer) x = widthScreen-widthContainer; if (y>bottom-heightContainer) y = bottom-heightContainer; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.setMargins(x, y, 0, 0); layoutLinks.setLayoutParams(params); layoutMainLinks.setVisibility(View.VISIBLE); ObjectAnimator translationX = ObjectAnimator.ofFloat(layoutLinks, "translationX", xCenterView-x, 0f); translationX.setDuration(150); ObjectAnimator scaleX = ObjectAnimator.ofFloat(layoutLinks, "scaleX", 0f, 1f); scaleX.setDuration(150); ObjectAnimator scaleY = ObjectAnimator.ofFloat(layoutLinks, "scaleY", 0f, 1f); scaleY.setDuration(150); ObjectAnimator fadeAnim = ObjectAnimator.ofFloat(layoutLinks, "alpha", 0f, 1f); fadeAnim.setDuration(150); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(translationX, scaleX, scaleY, fadeAnim); animatorSet.start(); } } public void goToLink(String link) { // if (CacheData.getCacheImages().containsKey(link)) { // CacheData.getCacheImages().get(link); // } else { // // } if (isShowLinks()) hideLinks(); if (link.startsWith("@")) { if (activity instanceof BaseLayersActivity) { Bundle bundle = new Bundle(); bundle.putString(UserActivity.KEY_EXTRAS_USER, link); ((BaseLayersActivity)activity).startAnimationActivity(UserActivity.class, bundle); } } else if (link.startsWith("#")) { HashTagDialogFragment frag = new HashTagDialogFragment(); Bundle args = new Bundle(); args.putString("hashtag", link); frag.setArguments(args); frag.show(activity.getSupportFragmentManager(), "dialog"); } else { InfoLink infoLink = CacheData.getInstance().getCacheInfoLink(link); if (infoLink != null && infoLink.isExtensiveInfo() && infoLink.getType() == InfoLink.IMAGE) { if (activity instanceof BaseLayersActivity) { Bundle bundle = new Bundle(); bundle.putParcelable(TweetActivity.KEY_EXTRAS_TWEET, selectedInfoTweet); bundle.putString(TweetActivity.KEY_EXTRAS_LINK, link); ((BaseLayersActivity)activity).startAnimationActivity(TweetActivity.class, bundle); } } else { if (link.startsWith("www")) { link = "http://"+link; } Uri uri = Uri.parse(link); Intent intent = new Intent(android.content.Intent.ACTION_VIEW, uri); activity.startActivity(intent); } } } public void hideLinks() { ObjectAnimator scaleX = ObjectAnimator.ofFloat(layoutLinks, "scaleX", 1f, 0f); scaleX.setDuration(150); ObjectAnimator scaleY = ObjectAnimator.ofFloat(layoutLinks, "scaleY", 1f, 0f); scaleY.setDuration(150); ObjectAnimator fadeAnim = ObjectAnimator.ofFloat(layoutLinks, "alpha", 1f, 0f); fadeAnim.setDuration(150); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(scaleX, scaleY, fadeAnim); animatorSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { layoutMainLinks.setVisibility(View.INVISIBLE); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); animatorSet.start(); } public boolean isShowLinks() { return layoutMainLinks.getVisibility()==View.VISIBLE; } }