package typical_if.android.fragment; import android.app.Activity; import android.app.Dialog; import android.graphics.Bitmap; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.InflateException; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.melnykov.fab.FloatingActionButton; import com.vk.sdk.VKSdk; import com.vk.sdk.api.model.VKApiPhoto; import org.json.JSONObject; import java.util.ArrayList; import in.srain.cube.views.GridViewWithHeaderAndFooter; import typical_if.android.Constants; import typical_if.android.ItemDataSetter; import typical_if.android.OfflineMode; import typical_if.android.R; import typical_if.android.TIFApp; import typical_if.android.VKHelper; import typical_if.android.VKRequestListener; import typical_if.android.activity.MainActivity; import typical_if.android.adapter.PhotoListAdapter; import typical_if.android.util.PhotoUrlHelper; public class FragmentPhotoList extends FragmentWithAttach implements AbsListView.OnScrollListener { public ArrayList<VKApiPhoto> finalPhotos = new ArrayList<VKApiPhoto>(); private OnFragmentInteractionListener mListener; private boolean isRequestNull; int type; final private static Bundle args = new Bundle(); public int sizeOfAlbum; public String albumTitle; public String albumSizeWithNoun; public static FragmentPhotoList newInstance(int type, int albumOriginalSize, String title, String cover) { Constants.isPhotoListFragmentLoaded = true; FragmentPhotoList fragment = new FragmentPhotoList(); args.clear(); args.putInt("albumOriginalSize", albumOriginalSize); args.putString("title", title); args.putString("cover", cover); fragment.type = type; fragment.setArguments(args); return fragment; } public FragmentPhotoList() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { this.sizeOfAlbum = getArguments().getInt("albumOriginalSize"); this.albumTitle = getArguments().getString("title"); if (this.sizeOfAlbum==1){ this.albumSizeWithNoun=sizeOfAlbum+" "+getString(R.string.photos_equal_one); } if (this.sizeOfAlbum<5){ this.albumSizeWithNoun=sizeOfAlbum+" "+getString(R.string.photos_less_five); }else { this.albumSizeWithNoun=sizeOfAlbum+" "+getString(R.string.photos_more_five); } } } @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // ((MainActivity) getActivity()).getSupportActionBar().hide(); final View rootView = inflater.inflate(R.layout.fragment_photo_list, container, false); setRetainInstance(true); Constants.isPhotoListFragmentLoaded = true; floatingActionButton = (FloatingActionButton) rootView.findViewById(R.id.add_photo_from); if (!VKSdk.isLoggedIn()) { floatingActionButton.setVisibility(View.GONE); } floatingActionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Dialog dialog = ((MainActivity) getActivity()).addPhotoFrom(); if (dialog == null) { return; } else { dialog.show(); } } }); if (!VKSdk.isLoggedIn()) { floatingActionButton.setVisibility(View.GONE); } gridOfPhotos = (GridViewWithHeaderAndFooter) rootView.findViewById(R.id.gridOfPhotos); doRequest(rootView); // FadingActionBarHelper helper = new FadingActionBarHelper() // .actionBarBackground(R.drawable.action_bar_shape_background) // .headerLayout(R.layout.photo_list__info_header) // .contentLayout(R.layout.fragment_photo_list); // Constants.mainActivity.setContentView(helper.createView(Constants.mainActivity)); // helper.initActionBar(Constants.mainActivity); return rootView; } View headerView; private void attachHeaderView(final View root) { headerView = LayoutInflater.from(TIFApp.getAppContext()).inflate(R.layout.photo_list__info_header, null); Typeface titleTypeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Light.ttf"); Typeface sizeTypeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Thin.ttf"); final ImageView cover_im = (ImageView) headerView.findViewById(R.id.photo_list_header_image); final RelativeLayout shell = ((RelativeLayout) headerView.findViewById(R.id.header_relative_layout)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, TIFApp.getDisplayHeight() / 2); shell.setLayoutParams(params); TextView title = ((TextView) shell.findViewById(R.id.photo_album_title)); TextView size = ((TextView) shell.findViewById(R.id.size_of_album)); title.setText(this.albumTitle); size.setText(this.albumSizeWithNoun); title.setTypeface(titleTypeface); size.setTypeface(sizeTypeface); ImageLoader.getInstance().loadImage(args.getString("cover"), new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { cover_im.setImageBitmap(PhotoUrlHelper.fastBlur(loadedImage, 10)); cover_im.setScaleType(ImageView.ScaleType.CENTER_CROP); RelativeLayout l = ((RelativeLayout) root.findViewById(R.id.while_loading_rel_layout)); l.startAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.fade_out)); } }); gridOfPhotos.addHeaderView(headerView); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Constants.isPhotoListFragmentLoaded = true; } @Override public void onResume() { super.onResume(); Constants.isPhotoListFragmentLoaded = true; } @Override public void onDetach() { super.onDetach(); mListener = null; Constants.isPhotoListFragmentLoaded = false; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // inflater.inflate(R.menu.main, null); } boolean temp = false; boolean updated = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } int _lastInScreen; int _subtract; float _ratio; int _count = 100; @Override public void onScroll(final AbsListView view, int firstVisibleItem, final int visibleItemCount, int totalItemCount) { _lastInScreen = firstVisibleItem + visibleItemCount; if (_lastInScreen >= totalItemCount && totalItemCount >= 100 && totalItemCount != VKHelper.countOfPhotos) { if (_lastInScreen < VKHelper.countOfPhotos) { _subtract = VKHelper.countOfPhotos - _lastInScreen; _ratio = (_subtract / 100f); if (_ratio < 2) { _count = 0; } if (_ratio > 1) { _count = 100; --_ratio; } else { _count = (int) (_ratio * 100); } if (OfflineMode.isOnline()) { getElsePhotos(firstVisibleItem, visibleItemCount, totalItemCount, view); scrollPhotoListToBottom(gridOfPhotos, _lastInScreen); } } } } private void getElsePhotos(int firstVisibleItem, final int visibleItemCount, final int totalItemCount, final AbsListView view) { if (firstVisibleItem + visibleItemCount >= totalItemCount && !updated) { VKHelper.getPhotoList(OfflineMode.loadLong(Constants.VK_GROUP_ID), Constants.ALBUM_ID, 1, _count, new VKRequestListener() { @Override public void onSuccess() { OfflineMode.saveJSON(Constants.ALBUM_ID, vkJson); handleResponse(OfflineMode.loadJSON(Constants.ALBUM_ID), columns, view); initPhotoList(); } @Override public void onError() { //show no toast } }); updated = true; } } public interface OnFragmentInteractionListener { // TODO: Update argument type and name public void onFragmentInteraction(Uri uri); } int columns; View view = null; public boolean doRequest(final View view) { this.view = view; float scaleFactor = getResources().getDisplayMetrics().density * 80; int number = getActivity().getWindowManager().getDefaultDisplay().getWidth(); final int columns = (int) ((float) number / scaleFactor); this.columns = columns; VKHelper.offsetCounter = 0; if (OfflineMode.isOnline()) { temp = false; if (type == 0) { VKHelper.getPhotoList(Constants.USER_ID, Constants.ALBUM_ID, 1, 100, new VKRequestListener() { @Override public void onSuccess() { OfflineMode.saveJSON(Constants.ALBUM_ID, vkJson); handleResponse(OfflineMode.loadJSON(Constants.ALBUM_ID), columns, view); attachHeaderView(view); initPhotoList(); } @Override public void onError() { // show NO default toast? } }); } else { VKHelper.getPhotoList(Constants.TEMP_OWNER_ID, Constants.ALBUM_ID, 1, 100, new VKRequestListener() { @Override public void onSuccess() { OfflineMode.saveJSON(Constants.ALBUM_ID, vkJson); handleResponse(OfflineMode.loadJSON(Constants.ALBUM_ID), columns, view); attachHeaderView(view); initPhotoList(); } @Override public void onError() { // show NO default toast? } }); } isRequestNull = true; } if (!OfflineMode.isOnline() && !OfflineMode.isJsonNull(Constants.ALBUM_ID)) { handleResponse(OfflineMode.loadJSON(Constants.ALBUM_ID), columns, view); isRequestNull = true; } else { if (temp) { isRequestNull = false; TIFApp.showCommonErrorToast(); } } return isRequestNull; } public static int albumSize; GridViewWithHeaderAndFooter gridOfPhotos; FloatingActionButton floatingActionButton; PhotoListAdapter photoListAdapter; ArrayList<VKApiPhoto> dozenPhotos; protected void handleResponse(JSONObject jsonObject, final int columns, View view) { dozenPhotos = VKHelper.getPhotosFromJSONArray(jsonObject); albumSize = VKHelper.countOfPhotos; for (int i = 0; i < dozenPhotos.size(); i++) { finalPhotos.add(dozenPhotos.get(i)); } gridOfPhotos.setNumColumns(columns); // if (VKSdk.isLoggedIn()) { // // gridOfPhotos.setOnTouchListener(new ShowHideOnScroll(floatingActionButton)); // } else { // gridOfPhotos.setOnTouchListener(null); // } } private void initPhotoList(){ if (photoListAdapter == null) { Log.d("finalPhotos.size= " + finalPhotos.size(), "getActivity = " + getActivity()); photoListAdapter = new PhotoListAdapter(finalPhotos, getActivity().getLayoutInflater()); } else { photoListAdapter.notifyDataSetChanged(); } gridOfPhotos.setAdapter(photoListAdapter); if (photoListAdapter == null) { Log.d("finalPhotos.size= " + finalPhotos.size(), "getActivity = " + getActivity().getLayoutInflater()); photoListAdapter = new PhotoListAdapter(finalPhotos, getActivity().getLayoutInflater()); } else { photoListAdapter.notifyDataSetChanged(); } gridOfPhotos.setAdapter(photoListAdapter); updated = false; gridOfPhotos.setOnScrollListener(this); if (type == 0) { gridOfPhotos.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { getActivity().getSupportFragmentManager().popBackStack(); getActivity().getSupportFragmentManager().popBackStack(); Constants.tempPostAttachCounter++; Constants.tempPhotoPostAttach.add(finalPhotos.get(position)); refreshMakePostFragment(0); } }); floatingActionButton.setVisibility(View.GONE); } else { gridOfPhotos.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // int position = position1-10; Log.d("positionO"," = "+(position-columns)); final Fragment fragment = new FragmentFullScreenViewer(); args.clear(); args.putParcelable("fromPhoto", finalPhotos.get(position)); args.putSerializable("finalPhotos", finalPhotos); args.putInt("position", position-columns); // } args.putInt("sizeOfAlbum", sizeOfAlbum); fragment.setArguments(args); FragmentManager fragmentManager = getFragmentManager(); final FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter, R.anim.exit); transaction.add(R.id.container, fragment).addToBackStack("String").commit(); } }); if (VKSdk.isLoggedIn()) { floatingActionButton.setVisibility(View.VISIBLE); } } } private void scrollPhotoListToBottom(final GridView gridOfPhotos, final int lastItem) { gridOfPhotos.post(new Runnable() { @Override public void run() { gridOfPhotos.setSelection(lastItem); } }); } }