/* * Copyright 2012 The Stanford MobiSocial Laboratory * * 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 mobisocial.musubi.ui; import java.util.ArrayList; import java.util.List; import mobisocial.metrics.MusubiMetrics; import mobisocial.metrics.UsageMetrics; import mobisocial.musubi.App; import mobisocial.musubi.R; import mobisocial.musubi.model.helpers.IdentitiesManager; import mobisocial.musubi.provider.MusubiContentProvider; import mobisocial.musubi.provider.MusubiContentProvider.Provided; import mobisocial.musubi.service.MusubiService; import mobisocial.musubi.social.QRInviteDialog; import mobisocial.musubi.ui.fragments.ContactsFragment; import mobisocial.musubi.ui.util.UiUtil; import mobisocial.musubi.util.LessSpammyContentObserver; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.ContactsContract; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.MenuInflater; import com.viewpagerindicator.TabPageIndicator; import com.viewpagerindicator.TitleProvider; public class RelationshipsActivity extends MusubiBaseActivity { @SuppressWarnings("unused") private static final String TAG = "RelationshipsActivity"; public static final String EXTRA_SHOW_REQUESTS = "extra_show_requests"; private IdentitiesManager mIdentitiesManager; private ViewPager mViewPager; private final List<Fragment> mFragments = new ArrayList<Fragment>(); private final List<String> mLabels = new ArrayList<String>(); private LessSpammyContentObserver mObserver; private TabPageIndicator mTitleIndicator; private static final int REQUEST_ADD_ANDROID_CONTACT = 2; private static final int LABELS_FRIENDS = 0; private static final int LABELS_PENDING = 1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tabbed); SQLiteOpenHelper databaseSource = App.getDatabaseSource(this); mIdentitiesManager = new IdentitiesManager(databaseSource); setTitle("Relationships"); mLabels.add(LABELS_FRIENDS, "Friends"); mLabels.add(LABELS_PENDING, "New"); mFragments.add(ContactsFragment.newInstance(ContactsFragment.ContactListType.WHITE_LIST)); mFragments.add(ContactsFragment.newInstance(ContactsFragment.ContactListType.GRAY_LIST)); PagerAdapter adapter = new ViewFragmentAdapter(getSupportFragmentManager(), mFragments, mLabels); mViewPager = (ViewPager)findViewById(R.id.feed_pager); mViewPager.setAdapter(adapter); //Bind the title indicator to the adapter mTitleIndicator = (TabPageIndicator)findViewById(R.id.feed_titles); mTitleIndicator.setViewPager(mViewPager); //mTitleIndicator.setTextColor(Color.DKGRAY); //mTitleIndicator.setSelectedColor(Color.BLACK); //let the title pager do the propagation of messages //mTitleIndicator.setOnPageChangeListener(this); Intent intent = getIntent(); boolean showRequests = intent.getBooleanExtra(EXTRA_SHOW_REQUESTS, false); if (showRequests) { mViewPager.setCurrentItem(1); } else { mViewPager.setCurrentItem(0); } fillInCounter(); mObserver = new LessSpammyContentObserver(new Handler(getMainLooper())) { @Override public void lessSpammyOnChange(boolean selfChange) { fillInCounter(); } }; } @Override public void onDestroy() { super.onDestroy(); } @Override public void onPause() { super.onPause(); getContentResolver().unregisterContentObserver(mObserver); } @Override public void onResume() { super.onResume(); fillInCounter(); getContentResolver().registerContentObserver(MusubiService.WHITELIST_APPENDED, false, mObserver); mObserver.resetTimeout(); mObserver.dispatchChange(false); } private void fillInCounter() { int count = mIdentitiesManager.getPendingGraylistCount(); if (count > 0) { mLabels.set(LABELS_PENDING, "New (" + count + ")"); } else { mLabels.set(LABELS_PENDING, "New"); } mTitleIndicator.invalidate(); } public class ViewFragmentAdapter extends FragmentPagerAdapter implements TitleProvider { final int NUM_ITEMS; final List<Fragment> mFragments; final List<String> mTitles; public ViewFragmentAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) { super(fm); mFragments = fragments; mTitles = titles; assert(mTitles.size() == mFragments.size()); NUM_ITEMS = mFragments.size(); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public String getTitle(int position) { return mTitles.get(position); } } /* Creates the menu items */ public boolean onCreateOptionsMenu(android.support.v4.view.Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.relationships_activity, menu); return true; } /* Handles item selections */ public boolean onOptionsItemSelected(android.support.v4.view.MenuItem item) { switch (item.getItemId()) { case R.id.menu_add_contact: showDialog(AddContactDialog.newInstance(), false); return true; } return super.onOptionsItemSelected(item); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_ADD_ANDROID_CONTACT) { if(resultCode == Activity.RESULT_OK) { Uri added = UiUtil.addedContact(this, data, null); if(added != null) { Intent i = new Intent(this, ViewProfileActivity.class); i.setDataAndType(added, MusubiContentProvider.getType(Provided.IDENTITIES_ID)); startActivity(i); } } } } public static class AddContactDialog extends DialogFragment implements DialogInterface.OnClickListener { String[] labels = new String[] { "Send Invitation", "Add to address book", "QR Code" }; enum codes { REQUEST_INVITE, REQUEST_ADD_CONTACT, REQUEST_QR }; String title = "Add Contact..."; public static AddContactDialog newInstance() { AddContactDialog d = new AddContactDialog(); Bundle args = new Bundle(); d.setArguments(args); return d; } public AddContactDialog() { } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()).setTitle(title) .setItems(labels, this).create(); } @Override public void onClick(DialogInterface dialog, int which) { UsageMetrics m = new UsageMetrics(getActivity()); switch (codes.values()[which]) { case REQUEST_QR: m.report(MusubiMetrics.CLICKED_QR_INVITE); ((MusubiBaseActivity)getActivity()).showDialog(QRInviteDialog.newInstance(), false); break; case REQUEST_INVITE: m.report(MusubiMetrics.CLICKED_SEND_INVITE); startActivity(EmailInviteActivity.getInviteIntent(getActivity())); break; case REQUEST_ADD_CONTACT: m.report(MusubiMetrics.CLICKED_ADD_CONTACT); Intent i = new Intent(Intent.ACTION_INSERT_OR_EDIT); i.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); getActivity().startActivityForResult(i, REQUEST_ADD_ANDROID_CONTACT); break; } } } }