/*
* Copyright 2015. Appsi Mobile
*
* 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.appsimobile.appsii.module.home;
import android.app.DialogFragment;
import android.app.LoaderManager;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.appsimobile.appsii.R;
import com.appsimobile.appsii.module.BaseContactInfo;
import com.appsimobile.appsii.module.PeopleQuery;
import com.appsimobile.appsii.module.people.AbstractPeopleViewHolder;
import com.appsimobile.appsii.module.people.ContactView;
import com.appsimobile.appsii.module.people.PeopleViewHolder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nick on 28/03/15.
*/
public class ContactPickerDialog extends DialogFragment
implements PeopleViewHolder.OnItemClickListener {
Button mOkButton;
Button mCancelButton;
RecyclerView mRecyclerView;
ProfileImageAdapter mProfileImageAdapter;
ContactPickedListener mContactPickedListener;
public ContactPickerDialog() {
setStyle(STYLE_NO_TITLE, 0);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mProfileImageAdapter = new ProfileImageAdapter(getActivity());
mProfileImageAdapter.setOnItemClickListener(this);
getLoaderManager().initLoader(1, null, new CursorLoaderCallbacks());
}
public void setContactPickedListener(
ContactPickedListener contactPickedListener) {
mContactPickedListener = contactPickedListener;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_contact_picker, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mOkButton = (Button) view.findViewById(R.id.ok_button);
mCancelButton = (Button) view.findViewById(R.id.cancel);
mRecyclerView = (RecyclerView) view.findViewById(R.id.contact_recycler);
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 3));
mRecyclerView.setAdapter(mProfileImageAdapter);
}
void onContactListLoaded(List<? extends BaseContactInfo> contactInfos) {
mProfileImageAdapter.setData(contactInfos);
}
@Override
public void onItemClick(AbstractPeopleViewHolder viewHolder) {
onContactSelected(((PeopleViewHolder) viewHolder).getContactInfo());
}
private void onContactSelected(BaseContactInfo contactInfo) {
if (mContactPickedListener != null) {
mContactPickedListener.onContactPicked(contactInfo);
}
dismiss();
}
interface ContactPickedListener {
void onContactPicked(BaseContactInfo contactInfo);
}
/**
* Created by nick on 02/11/14.
*/
static class ProfileImageAdapter extends RecyclerView.Adapter<AbstractPeopleViewHolder> {
private final List<BaseContactInfo> mContactInfos = new ArrayList<>();
PeopleViewHolder.OnItemClickListener mOnItemClickListener;
private final Context mContext;
public ProfileImageAdapter(Context context) {
mContext = context;
setHasStableIds(true);
}
public BaseContactInfo getItem(int position) {
return mContactInfos.get(position);
}
@Override
public AbstractPeopleViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ContactView view =
(ContactView) inflater.inflate(R.layout.grid_item_people_tile, viewGroup,
false);
view.setShowAsTiles(true);
// View view = inflater.inflate(R.layout.list_item_people_entry, viewGroup, false);
return new PeopleViewHolder(view, mOnItemClickListener,
null /* peopleActionListener */);
}
@Override
public void onBindViewHolder(AbstractPeopleViewHolder viewHolder,
int i) {
BaseContactInfo info = mContactInfos.get(i);
// if there is no contact info, bind to null
// and no need to get any previous items
if (info == null) {
viewHolder.bind(null, null, false);
return;
}
String firstLetter = info.getFirstLetter();
boolean isFirstWithLetter;
if (i == 0) {
isFirstWithLetter = true;
} else {
BaseContactInfo prev = mContactInfos.get(i - 1);
if (prev != null) {
String prevLetter = prev.getFirstLetter();
isFirstWithLetter =
!TextUtils.equals(prevLetter.toLowerCase(), firstLetter.toLowerCase());
} else {
isFirstWithLetter = true;
}
}
viewHolder.bind(info, firstLetter, isFirstWithLetter);
}
@Override
public long getItemId(int position) {
BaseContactInfo contactInfo = mContactInfos.get(position);
return contactInfo.mContactId;
}
@Override
public int getItemCount() {
return mContactInfos.size();
}
public void setData(List<? extends BaseContactInfo> contactInfos) {
mContactInfos.clear();
for (int i = 0; i < contactInfos.size(); i++) {
BaseContactInfo contactInfo = contactInfos.get(i);
mContactInfos.add(contactInfo);
}
notifyDataSetChanged();
}
public void clear() {
mContactInfos.clear();
notifyDataSetChanged();
}
public void onTrimMemory(int level) {
}
public void setOnItemClickListener(
PeopleViewHolder.OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
}
class CursorLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
baseUri = ContactsContract.Contacts.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(ContactsContract.Directory.DEFAULT)).build();
String select =
"((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND ("
+ ContactsContract.Contacts.DISPLAY_NAME + " != '' ))";
return new CursorLoader(getActivity(), baseUri,
PeopleQuery.CONTACTS_SUMMARY_PROJECTION, select, null,
ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
List<? extends BaseContactInfo> contactInfos =
PeopleQuery.cursorToContactInfos(data);
onContactListLoaded(contactInfos);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
}
}