PhotoVIewAttacher and PIcasso unzoom picture on fragment change - android

Ok, so, I have implemented photoviewattacher and picasso into one imageview, when I swipe image 1 to change the picture to image 2 and try to get back, the image 1 is still zoomed where I left it. How to solve this? Here is the code:
private PhotoViewAttacher mAttacher;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout resource that'll be returned
View rootView = inflater.inflate(R.layout.fragment_katalozi_slike, container, false);
// Get the arguments that was supplied when
// the fragment was instantiated in the
// CustomPagerAdapter
Bundle args = getArguments();
final ImageView imageView = (ImageView) rootView.findViewById(R.id.imageViewAdapterZaListanjeKataloga);
mAttacher = new PhotoViewAttacher(imageView);
Callback imageLoadedCallback = new Callback() {
#Override
public void onSuccess() {
if (mAttacher != null) {
mAttacher.update();
} else {
mAttacher = new PhotoViewAttacher(imageView);
}
}
#Override
public void onError() {
// TODO Auto-generated method stub
}
};
Picasso.with(getActivity()).load(args.getString("url")).placeholder(R.drawable.load).error(R.drawable.error).into(imageView, imageLoadedCallback);
((TextView) rootView.findViewById(R.id.brojStranaNaSliciKataloga)).setText(String.valueOf(args.getInt("trenutnaStranica")) + "/" + String.valueOf(args.getInt("konacanBrojStranica")));
ImageButton imageButton = (ImageButton) rootView.findViewById(R.id.shareButtonKatalozi);
ImageButton locirajMe = (ImageButton) rootView.findViewById(R.id.locirajButtonKatalozi);
final String zaShare = args.getString("linkKataloga");
locirajMe.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
getLatLng(String.valueOf(Static.prodavci.getId()));
}
});
imageButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
shareIt(zaShare);
}
});
return rootView;
}

You do
#Override
public void onDestroyView() {
super.onDestroyView();
mAttacher.cleanup();
}
worked for me.

Related

get fragment width, viewtreeobserver listener not working

I have a fragment that can be in a details activity (if the device has a small viewport) or on the main activity (if the viewport is big, e.g. a tablet).
Inside of the fragment there is an ImageView that I need to resize according to the width of the fragment. I did some research and I found out that the "canonical" way to achieve this is to add a listener to the viewtreeobserver. However, for some reason, it is not working:
This is my Fragment:
public class MediaDetailFragment extends Fragment implements DetailsMvpView {
private static final String RESOURCE = "resource";
#Inject DetailPresenter mPresenter;
#BindView(R.id.media_image_flipper)
ViewFlipper mImageFlipper;
#BindView(R.id.title_textview)
TextView mTitleTextView;
#BindView(R.id.button_share)
ImageButton mShare;
#BindView(R.id.button_trailers) ImageButton mTrailers;
#BindView(R.id.keyword_recyclerview)
RecyclerView mKeywordRecyclerView;
#BindView(R.id.overview_content_textview) TextView mOverviewTextView;
#BindView(R.id.main_image_holder) ViewGroup mImageHolder;
#BindView(R.id.parent_cardview)
CardView mParentCardView;
#BindString(R.string.youtube_base_url) String mYoutubeUrl;
#BindBool(R.bool.isTablet) boolean mIsTablet;
private Media mMedia;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
public static MediaDetailFragment insertOnTarget(AppCompatActivity activity, int target, Media media) {
MediaDetailFragment fragment = MediaDetailFragment.instantiateWithArguments(media);
FragmentManager fm = activity.getSupportFragmentManager();
fm.beginTransaction()
.replace(target, fragment)
.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.commit();
return fragment;
}
#Override
public void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMedia = getArguments().getParcelable(RESOURCE);
}
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container,
#Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.media_details_fragment, container, false);
((BaseActivity)getActivity()).activityComponent().inject(this);
ButterKnife.bind(this, rootView);
getActivity().getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
mTitleTextView.setText(mMedia.title());
mOverviewTextView.setText(mMedia.overview());
mKeywordRecyclerView.setAdapter(new KeywordAdapter(getContext()));
return rootView;
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final View view = getView();
if (view == null) return;
view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
if (mIsTablet) {
mImageFlipper.getLayoutParams().height =
ViewUtil.setHeightForAspectRatio(view.getWidth(), ViewUtil.PORTRAIT);
} else {
mImageFlipper.getLayoutParams().height =
ViewUtil.setHeightForAspectRatio(mDisplayMetrics.widthPixels, ViewUtil.PORTRAIT);
}
});
}
#Override
public void onStart() {
super.onStart();
mShare.setOnClickListener(v -> {startActivity(new Intent(Intent.ACTION_SEND)
.putExtra(Intent.EXTRA_TEXT, String.format(mYoutubeUrl, mMedia.overview())));});
mTrailers.setOnClickListener(v -> mPresenter.loadMovies(mMedia.id()));
mPresenter.attachView(this);
mPresenter.loadImages(mMedia.id());
mPresenter.loadKeywords(mMedia.id());
}
#Override
public void onStop() {
mPresenter.detachView();
super.onStop();
}
#Override
public void showImages(String images) {
ImageView imageView = new ImageView(getContext());
ViewUtil.loadImage(images, imageView, getContext(), true, true);
mImageFlipper.addView(imageView, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
#Override
public void showKeywords(List<String> keywords) {
((KeywordAdapter) mKeywordRecyclerView.getAdapter()).setKeywords(keywords);
}
#Override
public void showVideos(List<Video> videos) {
TrailerDialogFragment.newInstance(videos).show(getFragmentManager(), null);
}
#Override
public void showError() {
}
private static MediaDetailFragment instantiateWithArguments(Media media) {
Bundle bundle = new Bundle();
bundle.putParcelable(RESOURCE, media);
MediaDetailFragment fragment = new MediaDetailFragment();
fragment.setArguments(bundle);
return fragment;
}
}
I call attach the listener on the onactivitycreated callback.
Can you help me to figure out the missing piece?
Thank you.
For some uncanny reason, the code works when I wrap it inside of a runnable. This is my solution:
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final View view = getView();
if (view == null) return;
view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
view.post(() -> {
if (mIsTablet) {
mImageFlipper.getLayoutParams().height =
ViewUtil.setHeightForAspectRatio(view.getWidth(), ViewUtil.PORTRAIT);
} else {
mImageFlipper.getLayoutParams().height =
ViewUtil.setHeightForAspectRatio(mDisplayMetrics.widthPixels, ViewUtil.PORTRAIT);
}
});
});
}
I could finally solve it but I don't understand why. If anyone of you knows why this could've happened, please let me know.

issue while hiding a View on ViewPager's fragment

am trying to hide and show a View when imageView is being tapped , i have 3 fragments in my ViewPager so the problem is that when am on my first View and i tap the imageView it works fine (my View got hided) but when am on Fragment no. 2 or three and i tap on the imageView it never hides the View its only working on my first fragment , this is my code :
public class MainActivity extends AppCompatActivity {
private static int[] imageArray;
static ImageLoader imageLoader;
static ArrayList<String> urlArray;
static DisplayImageOptions options;
static ProgressBar spinner;
static PhotoViewAttacher mAttacher;
static Boolean isToolBarShown = true;
static Button nextButton , previousButton;
static ViewPager viewPager ;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
urlArray = new ArrayList<>();
urlArray.add("http://i.imgur.com/uLRgvM8.png");
urlArray.add("http://i.imgur.com/LUuJ4FO.png");
urlArray.add("http://i.imgur.com/7SSBNBA.jpg");
// Create global configuration and initialize ImageLoader with this config
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300)).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.memoryCache(new WeakMemoryCache()).build();
ImageLoader.getInstance().init(config);
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder().cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true).build();
//initialize image view
ImageView imageView = (ImageView) findViewById(R.id.imageView);
ImageFragmentPagerAdapter imageFragmentPagerAdapter = new ImageFragmentPagerAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(1);
viewPager.setAdapter(imageFragmentPagerAdapter);
}
public static class ImageFragmentPagerAdapter extends FragmentPagerAdapter {
public ImageFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
#Override
public int getCount() {
return urlArray.size();
}
#Override
public Fragment getItem(int position) {
//SwipeFragment fragment = new SwipeFragment();
return SwipeFragment.newInstance(position);
}
}
public static class SwipeFragment extends Fragment {
private int position;
private ImageView imageView;
private RelativeLayout relativeLayout;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View swipeView = inflater.inflate(R.layout.swipe_fragment, container, false);
imageView = (ImageView) swipeView.findViewById(R.id.imageView);
spinner = (ProgressBar) swipeView.findViewById(R.id.spinner);
relativeLayout = (RelativeLayout) swipeView.findViewById(R.id.tool_bar);
Bundle bundle = getArguments();
nextButton = (Button)swipeView.findViewById(R.id.next_button);
previousButton = (Button)swipeView.findViewById(R.id.button_previous);
position = bundle.getInt("position");
Toast.makeText(getContext(),"NEW PAGE CALLED",Toast.LENGTH_SHORT).show();
if (isToolBarShown){
relativeLayout.setVisibility(View.VISIBLE);
}else {
relativeLayout.setVisibility(View.GONE);
}
mAttacher = new PhotoViewAttacher(imageView);
// viewPager.OnPageChangeListener(new ViewPager.OnPageChangeListener() {
// #Override
// public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//
//
// }
//
// #Override
// public void onPageSelected(int position) {
//
// loadImageView(position,imageView);
//
// }
//
// #Override
// public void onPageScrollStateChanged(int state) {
//
// }
// });
previousButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
viewPager.setCurrentItem(viewPager.getCurrentItem()-1,true);
}
});
nextButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
viewPager.setCurrentItem(viewPager.getCurrentItem()+1,true);
}
});
return swipeView;
}
public void loadImageView(int position, final ImageView imageView ){
imageLoader.displayImage(urlArray.get(position), imageView, options, new ImageLoadingListener() {
#Override
public void onLoadingStarted(String imageUri, View view) {
}
#Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
spinner.setVisibility(View.GONE);
}
#Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mAttacher = new PhotoViewAttacher(imageView);
mAttacher.setOnViewTapListener(new PhotoViewAttacher.OnViewTapListener() {
#Override
public void onViewTap(View view, float x, float y) {
if (view == imageView){
if (relativeLayout.getVisibility() == View.VISIBLE){
isToolBarShown = false;
relativeLayout.setVisibility(View.GONE);
}else {
isToolBarShown = true;
relativeLayout.setVisibility(View.VISIBLE);
}
Log.d("OOPS","WHAT THE.., WHAT IS WRONG HERE");
}
}
});
if(mAttacher!=null){
mAttacher.update();
}else{
mAttacher = new PhotoViewAttacher(imageView);
}
spinner.setVisibility(View.GONE);
}
#Override
public void onLoadingCancelled(String imageUri, View view) {
spinner.setVisibility(View.GONE);
}
}, new ImageLoadingProgressListener() {
#Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
spinner.setVisibility(View.VISIBLE);
spinner.setProgress((current*100)/total);
}
});
}
static SwipeFragment newInstance(int position) {
SwipeFragment swipeFragment = new SwipeFragment();
Bundle bundle = new Bundle();
bundle.putInt("position", position);
swipeFragment.setArguments(bundle);
return swipeFragment;
}
#Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load data here
// if (getView() != null) {
// isViewShown = true;
// // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data
// loadImageView(position , imageView);
// } else {
// isViewShown = false;
// }
}
}
}}
am trying to hide and show the RelativeView , if anybody knows whats wrong or missing in my code then please do correct me
i think you have to try fragmentstatepageradapter instead of FragmentPagerAdapter. it may help you. you can see the the difference betwwen them here :
Difference between FragmentPagerAdapter and FragmentStatePagerAdapter
You didn't provide all of code, but as you said in comments mAttacher is your static variable from outside of SwipeFragment. I think that
relativeLayout
spinner
imageLoader
are also static members from outside of SwipeFragment. If they are from your R.layout.swipe_fragment layout then you should use each relativeLayout, spinner and imageLoader instance per SwipeFragment.
Now you are swiping to another fragment and you see it. But instances of classes i mentioned above are from another fragment. And that is why it does not working for you as it should. Try to do that. And you can provide more of code.
Good luck!
Setting viewpager offscreenpagelimit mayt help you:)
mViewPager.setoffscreenpagelimit(2)
//2 is important over here.
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
//use above function to set fragment

How to switch to next page(call another class) from ImageButton that Extend Fragment android programming

This is the PagesFragment file.
public class PagesFragment extends Fragment {
public PagesFragment(){
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_pages, container, false);
ImageButton s1 = (ImageButton)rootView.findViewById(R.id.speakers_1);
s1.setOnClickListener(listener);
ImageButton s2 = (ImageButton)rootView.findViewById(R.id.speakers_2);
s2.setOnClickListener(listener2);
ImageButton s3 = (ImageButton)rootView.findViewById(R.id.speakers_3);
s3.setOnClickListener(listener3);
return rootView;
}
ImageButton.OnClickListener listener = new OnClickListener() {
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
};
public void speak_1 (View theButton)
{
Intent i = new Intent(this.getActivity(),speaker1.class);
startActivity(i);
}
}
This is the xml file
<ImageButton
android:id="#+id/speakers_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/txtLabel"
android:layout_marginLeft="17dp"
android:layout_marginTop="17dp"
android:onClick="speak_1"
android:src="#drawable/speakers_1" />
How can I call speak_1? I also want to switch to another xml when the ImageButton is clicked. Thank you.
Passing different listener for each ImageButton separately is quite strange. Try to do it this way:
public class PagesFragment extends Fragment implements View.OnClickListener {
public PagesFragment() {
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_pages, container, false);
ImageButton s1 = (ImageButton)rootView.findViewById(R.id.speakers_1);
s1.setOnClickListener(this);
ImageButton s2 = (ImageButton)rootView.findViewById(R.id.speakers_2);
s2.setOnClickListener(this);
ImageButton s3 = (ImageButton)rootView.findViewById(R.id.speakers_3);
s3.setOnClickListener(this);
return rootView;
}
#Override
public void onClick(View v) {
// here you can handle your ImageButton clicks
int id = v.getId();
if (id == R.id.speakers_1) {
speak_1();
} else if (id == R.id.speakers_2) {
speak_2();
} // etc...
}
public void speak_1() {
Intent i = new Intent(this.getActivity(),speaker1.class);
startActivity(i);
}
public void speak_2() {
Intent i = new Intent(this.getActivity(),speaker2.class);
startActivity(i);
}
}
It's also good practice to make first letter of a class name capital, it's a standard naming convention (Speaker1 instead of speaker1).
To call a method just use speak_1(arg0) inside onClick()
Example
ImageButton.OnClickListener listener = new OnClickListener() {
#Override
public void onClick(View arg0) {
speak_1(arg0);
}
};
Do it this way:
public class PagesFragment extends Fragment implements View.OnClickListener{
public PagesFragment(){
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_pages, container, false);
ImageButton s1 = (ImageButton)rootView.findViewById(R.id.speakers_1);
s1.setOnClickListener(this);
ImageButton s2 = (ImageButton)rootView.findViewById(R.id.speakers_2);
s2.setOnClickListener(this);
ImageButton s3 = (ImageButton)rootView.findViewById(R.id.speakers_3);
s3.setOnClickListener(this);
return rootView;
}
public void speak_1(View theButton)
{
Intent i = new Intent(this.getActivity(),speaker1.class);
startActivity(i);
}
#Override
public void onClick(View view) {
if(view instance of ImageButton)
speak_1(view);
}
}

How Can i Access the button inflated using fragment?

My complete code is given here. But not showing the Activity.
Showing null pointer Exception when adding clickListener().
How Can i Access the button inflated using fragment
//Cant add complete code. Showing add more details.//
public class Activity extends Activity{
private static final String KEY_SUCCESS="success";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction transaction=fragmentManager.beginTransaction();
Fragment fragment=new PlaceholderFragment();
transaction.add(R.id.container,fragment);
transaction.addToBackStack("welcome");
transaction.commit();
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
Button loginButton;
private String userNameString;
private String passwordString;
public PlaceholderFragment() {
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView;
rootView = inflater.inflate(R.layout.fragment_welcome, container, false);
try{
loginButton= (Button) rootView.findViewById(R.id.LoginFormButton);
}catch (NullPointerException e){
e.printStackTrace();
}
loginButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent logIntent = new Intent(getActivity(), BearerLoggedActivity.class);
startActivity(logIntent);
}
});
return rootView;
}
}
}
fragment.getView().findViewById(id)
That should do it, but I usually prefer to have all my listeners and business logic in the Fragment itself keeping the Activity as minimal possible. A small demo :
public class FirstFragment extends Fragment {
Button btn;
private OnFragmentClickListener listener;
#Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.first_fragment,
container, false);
//Do stuff to the fragment view in here if you want
btn = (Button) v.findViewById(R.id.breplace);
btn.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mainIntent = new Intent(getActivity(),
MyActivity.class);
startActivity(mainIntent);
}
});
return v;
}
Hope this helps !
If I understand correctly, what you are looking for is:
fragment.getView().findViewById(id);
Please add this on your Fragment class
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.image_layout, container, false);
//ImageView imageView = (ImageView) view.findViewById(R.id.imageView1);
//imageView.setImageResource(imageResourceId);
//imageView.setBackgroundResource(imageResourceId);
Button button = (Button) view.findViewById(R.id.btn1);
button.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mainIntent = new Intent(getActivity(),
NextActivity.class);
startActivity(mainIntent);
}
});
return view;
}
Your problem will be solved

onClickListener doesn't working in fragment

public class MainFragment extends Fragment {
public static final String TAG = MainFragment.class.getSimpleName();
private static final String ABOUT_SCHEME = "settings";
private static final String ABOUT_AUTHORITY = "main";
public static final Uri ABOUT_URI = new Uri.Builder().scheme(ABOUT_SCHEME).authority(ABOUT_AUTHORITY).build();
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.mainbutton, container, false);
return v;
}
}
According to below link:
How to handle button clicks using the XML onClick within Fragments
public class StartFragment extends Fragment implements OnClickListener{
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_start, container, false);
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(this);
return v;
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.StartButton:
/* ... */
break;
}
}
}
source doesn't work too.
#J.Romero is right. Try this code, I change the onClick method and add some debug log.
public class StartFragment extends Fragment implements OnClickListener {
private static final LOG_TAG = "com.example.activity"
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_start, container, false);
if (v != null) {
Button mButton = (Button) v.findViewById(R.id.StartButton);
Log.d(TAG, "View is not null");
if (mButton != null) {
b.setOnClickListener(this);
Log.d(TAG, "mButton is not null");
}
}
return v;
}
#Override
public void onClick(View v) {
if (v == mButton) {
//do something
}
}
}
you can NOT access the UI element in onCreateView method - EVER
use onActivityCreated method , thats tell the fragment the activity is fully created and ready to interact
#Override
public void onActivityCreated(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
}
});
}
Try this way:
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
/*Your code*/
}
});

Categories

Resources