Java tutorial
/* * Twittnuker - Twitter client for Android * * Copyright (C) 2013-2015 vanita5 <mail@vanita5.de> * * This program incorporates a modified version of Twidere. * Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.vanita5.twittnuker.popup; import android.content.Context; import android.content.res.Resources; import android.os.Build; import android.support.annotation.NonNull; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.LayoutInflater.Factory; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ImageView; import android.widget.PopupWindow; import org.apache.commons.lang3.ArrayUtils; import java.util.List; import de.vanita5.twittnuker.R; import de.vanita5.twittnuker.adapter.ArrayAdapter; import de.vanita5.twittnuker.app.TwittnukerApplication; import de.vanita5.twittnuker.model.ParcelableAccount; import de.vanita5.twittnuker.util.ImageLoaderWrapper; import de.vanita5.twittnuker.util.ThemeUtils; import de.vanita5.twittnuker.util.ThemedViewFactory; import de.vanita5.twittnuker.util.Utils; public class AccountSelectorPopupWindow { private final Context mContext; private final View mAnchor; private final PopupWindow mPopup; private final AccountsGridAdapter mAdapter; private final GridView mGridView; private AccountSelectionListener mAccountSelectionListener; public AccountSelectorPopupWindow(Context context, View anchor) { mContext = context; mAnchor = anchor; final int themeAttr; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { themeAttr = android.R.attr.actionOverflowMenuStyle; } else { themeAttr = android.R.attr.popupMenuStyle; } mAdapter = new AccountsGridAdapter(context); final Resources resources = context.getResources(); final LayoutInflater inflater = LayoutInflater.from(context); final int themeColor = ThemeUtils.getUserAccentColor(context); if (!(context instanceof Factory)) { inflater.setFactory2(new ThemedViewFactory(themeColor)); } final View contentView = inflater.inflate(R.layout.popup_account_selector, null); mGridView = (GridView) contentView.findViewById(R.id.grid_view); mGridView.setAdapter(mAdapter); mGridView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); mGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mAccountSelectionListener == null) return; mAccountSelectionListener.onSelectionChanged(getSelectedAccountIds()); } }); mPopup = new PopupWindow(context, null, themeAttr); mPopup.setFocusable(true); mPopup.setWidth(Utils.getActionBarHeight(context) * 2); mPopup.setWindowLayoutMode(0, ViewGroup.LayoutParams.WRAP_CONTENT); mPopup.setContentView(contentView); } public void setAccountSelectionListener(AccountSelectionListener listener) { mAccountSelectionListener = listener; } public boolean isShowing() { return mPopup.isShowing(); } public void dismiss() { mPopup.dismiss(); } public void show() { mPopup.showAsDropDown(mAnchor); } public interface AccountSelectionListener { public void onSelectionChanged(long[] accountIds); } public void setSelectedAccountIds(long[] accountIds) { if (accountIds == null) { mGridView.clearChoices(); } for (int i = 0, j = mAdapter.getCount(); i < j; i++) { mGridView.setItemChecked(i, ArrayUtils.contains(accountIds, mAdapter.getItem(i).account_id)); } } @NonNull public long[] getSelectedAccountIds() { final long[] accountIds = new long[mGridView.getCheckedItemCount()]; final SparseBooleanArray positions = mGridView.getCheckedItemPositions(); for (int i = 0, j = positions.size(), k = 0; i < j; i++) { if (positions.valueAt(i)) { accountIds[k++] = mAdapter.getItem(positions.keyAt(i)).account_id; } } return accountIds; } public void setAccounts(List<ParcelableAccount> accounts) { mAdapter.clear(); if (accounts != null) { mAdapter.addAll(accounts); } } private static class AccountsGridAdapter extends ArrayAdapter<ParcelableAccount> { private final ImageLoaderWrapper mImageLoader; public AccountsGridAdapter(Context context) { super(context, R.layout.grid_item_selector_account); mImageLoader = TwittnukerApplication.getInstance(context).getImageLoaderWrapper(); } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view = super.getView(position, convertView, parent); final ParcelableAccount account = getItem(position); final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); mImageLoader.displayProfileImage(icon, account.profile_image_url); return view; } } }