/******************************************************************************* * Copyright 2013 PAR Works, 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.parworks.mars.view.trending; import java.util.ArrayList; import java.util.List; import android.database.Cursor; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.Toast; import com.parworks.mars.MarsMenuFragment; import com.parworks.mars.R; import com.parworks.mars.model.db.TrendingSitesTable; import com.parworks.mars.model.provider.MarsContentProvider; import com.parworks.mars.view.siteexplorer.ImageViewManager; import com.parworks.mars.view.siteexplorer.ImageViewManager.ImageLoadedListener; import com.slidingmenu.lib.SlidingMenu; import com.slidingmenu.lib.app.SlidingFragmentActivity; import com.viewpagerindicator.CirclePageIndicator; /** * The Trending view is based on a ViewPager, * which contains a list of TrendingSiteFragment. * * @author yusun */ public class TrendingFragment extends MarsMenuFragment implements LoaderCallbacks<Cursor> { private static final String TAG = "TrendingFragment"; private static final int TRENDING_SITES_LOADER_ID = 5; private ViewPager vp; private TrendingPagerAdapter vpAdapter; private CirclePageIndicator circlePageIndicator; private ImageView backgroundImageView1; private ImageView backgroundImageView2; /** Current page view position */ private int currentPos = 0; private List<String> backgroundImageUrls; public TrendingFragment() { super(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_trending, null); // init ViewPager vp = (ViewPager) v.findViewById(R.id.trendingViewPager); vp.setId(this.hashCode()); // this ID needs to be unique if you want the view to be refreshed after activity destroyed // Bind the title indicator to the adapter circlePageIndicator = (CirclePageIndicator) v.findViewById(R.id.pageIndicatorTitle); circlePageIndicator.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == currentPos) { // to the right showBackgroundImage(backgroundImageView1, position, 1 - positionOffset); showBackgroundImage(backgroundImageView2, position + 1, positionOffset); } else { // to the left showBackgroundImage(backgroundImageView1, position, 1 - positionOffset); showBackgroundImage(backgroundImageView2, position + 1, positionOffset); } } @Override public void onPageSelected(int position) { switch (position) { case 0: ((SlidingFragmentActivity) TrendingFragment.this.getActivity()) .getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); break; default: ((SlidingFragmentActivity) TrendingFragment.this.getActivity()) .getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); break; } currentPos = position; } }); // vp.setPageMargin(-60); // init background ImageViews backgroundImageView1 = (ImageView) v.findViewById(R.id.blurredBackground1); backgroundImageView2 = (ImageView) v.findViewById(R.id.blurredBackground2); // config SlidingMenu touch mode ((SlidingFragmentActivity) this.getActivity()).getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); return v; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); // init adapter if (vpAdapter == null) { vpAdapter = new TrendingPagerAdapter(this.getActivity().getSupportFragmentManager()); } // init Loader for TrendingSites this.getLoaderManager().initLoader(TRENDING_SITES_LOADER_ID, null, this); } @Override public void onResume() { super.onResume(); ImageButton button = (ImageButton) ((SlidingFragmentActivity) this.getActivity()) .getSupportActionBar().getCustomView().findViewById(R.id.rightBarButton); button.setBackgroundResource(R.drawable.ic_bar_item_intro); if (currentPos != 0) { ((SlidingFragmentActivity) this.getActivity()) .getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } } public void rightBarButtonClicked(View v) { super.rightBarButtonClicked(v); Toast.makeText(((SlidingFragmentActivity) this.getActivity()), "Insert Intro", Toast.LENGTH_SHORT).show(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { String[] projection = TrendingSitesTable.ALL_COLUMNS; CursorLoader cursorLoader = new CursorLoader(this.getActivity(), MarsContentProvider.CONTENT_URI_ALL_TRENDING_SITES, projection, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data.getCount() == 0) { return; } Log.d(TAG, "onLoadFinished and update sites fragment"); // store all the background images backgroundImageUrls = new ArrayList<String>(); // init new data content for the adapter ArrayList<TrendingSiteFragment> sitesFragments = new ArrayList<TrendingSiteFragment>(data.getCount()); while(!data.isAfterLast()) { String siteId = data.getString( data.getColumnIndex(TrendingSitesTable.COLUMN_SITE_ID)); String siteName = data.getString( data.getColumnIndex(TrendingSitesTable.COLUMN_NAME)); int siteNum = data.getInt( data.getColumnIndex(TrendingSitesTable.COLUMN_NUM_AUGMENTED_IMAGES)); String posterUrl = data.getString( data.getColumnIndex(TrendingSitesTable.COLUMN_AUG_POSTER_IMAGE_URL)); String blurredUrl = data.getString( // FIXME data.getColumnIndex(TrendingSitesTable.COLUMN_POSTER_BLURRED_IMAGE_URL)); String posterContent = data.getString( data.getColumnIndex(TrendingSitesTable.COLUMN_AUG_POSTER_IMAGE_CONTENT)); int width = data.getInt( data.getColumnIndex(TrendingSitesTable.COLUMN_AUG_POSTER_IMAGE_WIDTH)); int height = data.getInt( data.getColumnIndex(TrendingSitesTable.COLUMN_AUG_POSTER_IMAGE_HEIGHT)); // add fragment for site sitesFragments.add(new TrendingSiteFragment(siteId, siteName, siteNum, posterUrl, posterContent, width, height)); // add blurred image for background backgroundImageUrls.add(blurredUrl); data.moveToNext(); } // update vp adapter vpAdapter.updateFragments(sitesFragments); vp.setAdapter(vpAdapter); circlePageIndicator.setViewPager(vp); vpAdapter.notifyDataSetChanged(); if (currentPos < sitesFragments.size()) { circlePageIndicator.setCurrentItem(currentPos); vp.setCurrentItem(currentPos); } else { vp.setCurrentItem(0); circlePageIndicator.setCurrentItem(0); currentPos = 0; } showBackgroundImage(backgroundImageView1, currentPos, 1); } @Override public void onLoaderReset(Loader<Cursor> loader) { } @SuppressWarnings("deprecation") private void showBackgroundImage(final ImageView imageView, int position, final float scale) { if (position >= backgroundImageUrls.size()) { return; } final String imageUrl = backgroundImageUrls.get(position); // if the image view already displays the target image // only set the alpha value if (imageUrl != null && imageUrl.equals(imageView.getTag())) { imageView.setAlpha((int) (255 * scale)); } else { // download and load the image first // then setup the alpha value imageView.setTag(imageUrl); ImageViewManager imageViewManager = new ImageViewManager(); if (imageUrl != null) { ImageLoadedListener listener = new ImageLoadedListener() { @Override public void onImageLoaded(Bitmap bitmap) { imageView.setAlpha((int) (255 * scale)); } }; imageViewManager.setImageView(imageUrl, imageView, listener); } } } /** * Adapter for trending sites */ public class TrendingPagerAdapter extends FragmentPagerAdapter { private ArrayList<TrendingSiteFragment> mFragments; private FragmentManager fm; public TrendingPagerAdapter(FragmentManager fm) { super(fm); this.fm = fm; } @Override public int getCount() { if (mFragments == null) { return 0; } return mFragments.size(); } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getItemPosition(Object item) { if (mFragments == null) { return POSITION_NONE; } int position = mFragments.indexOf(item); if (position < 0) { position = POSITION_NONE; } return position; } public synchronized void updateFragments(ArrayList<TrendingSiteFragment> fragments) { if (mFragments != null) { FragmentTransaction ft = fm.beginTransaction(); for (Fragment f : mFragments){ ft.remove(f); } ft.commitAllowingStateLoss(); mFragments.clear(); ft = null; fm.executePendingTransactions(); } mFragments = fragments; notifyDataSetChanged(); } } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDestroyView() { super.onDestroyView(); } }