/* * 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 mobisocial.musubi.App; import mobisocial.musubi.R; import mobisocial.musubi.model.helpers.FeedManager; import mobisocial.musubi.provider.MusubiContentProvider; import mobisocial.musubi.provider.MusubiContentProvider.Provided; import mobisocial.musubi.service.MusubiService; import mobisocial.musubi.ui.fragments.FeedViewFragment; import mobisocial.musubi.ui.util.EmojiSpannableFactory; import mobisocial.musubi.ui.util.UiUtil; import mobisocial.musubi.util.LessSpammyContentObserver; import mobisocial.nfc.Nfc; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.Spannable; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; /** * A view of a single feed, which can be panned left/right to see other feeds * based on this panner's query. * * TODO: PannerActivity<QueryType, AdapterType> */ public class FeedPannerActivity extends MusubiBaseActivity implements OnPageChangeListener, LoaderCallbacks<ArrayList<Long>> { private ViewPager mFeedViewPager; private FeedFragmentAdapter mFragmentAdapter; private Nfc mNfc; private FeedManager mFeedManager; private Uri mFeedUri; LessSpammyContentObserver mObserver; final ArrayList<Long> mFeeds = new ArrayList<Long>(); private boolean mDualPane; private InputMethodManager mInputMethodManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNfc = new Nfc(this); mFeedManager = new FeedManager(App.getDatabaseSource(this)); mObserver = new LessSpammyContentObserver(new Handler(getMainLooper())) { @Override public void lessSpammyOnChange(boolean arg0) { long feedId = Long.parseLong(mFeedUri.getLastPathSegment()); String feedName = UiUtil.getFeedNameFromMembersList(mFeedManager, mFeedManager.lookupFeed(feedId)); Spannable feedSpan = EmojiSpannableFactory.getInstance(FeedPannerActivity.this).newSpannable(feedName); setTitle(feedSpan); } }; setContentView(R.layout.activity_feed_home); mDualPane = findViewById(R.id.feed_pager) == null; if(mDualPane) { Intent i = new Intent(); i.setData(getIntent().getData()); i.setClass(this, FeedListActivity.class); finish(); return; } mInputMethodManager = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); mFeedViewPager = (ViewPager)findViewById(R.id.feed_pager); mFeedViewPager.setOnPageChangeListener(this); int id = getResources().getIdentifier("action_bar_title", "id", "android"); if(id == 0) id = R.id.abs__action_bar_title; TextView mTitle = (TextView)findViewById(id); mTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FeedPannerActivity.this, FeedDetailsActivity.class); intent.setDataAndType(mFeedUri, MusubiContentProvider.getType(Provided.FEEDS_ID)); startActivity(intent); } }); setTitle("Musubi Conversation"); if (getIntent() != null && getIntent().getData() != null) { mFeedUri = getIntent().getData(); } //clear the intent so we dont try to scroll to that page again setIntent(null); mFragmentAdapter = new FeedFragmentAdapter(); mFeedViewPager.setAdapter(mFragmentAdapter); getSupportLoaderManager().initLoader(0, null, this); } @Override protected void onPause() { super.onPause(); mNfc.onPause(this); App.setCurrentFeed(this, null); getContentResolver().unregisterContentObserver(mObserver); } //this is called after new intent which makes it always have the right logic //for picking which feed to show. @Override protected void onResume() { super.onResume(); mNfc.onResume(this); App.setCurrentFeed(this, mFeedUri); getContentResolver().registerContentObserver(MusubiService.FEED_UPDATED, false, mObserver); mObserver.resetTimeout(); mObserver.dispatchChange(false); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); if (mNfc.onNewIntent(this, intent)) return; } class FeedFragmentAdapter extends FragmentStatePagerAdapter { public FeedFragmentAdapter() { super(getSupportFragmentManager()); } @Override public int getCount() { return mFeeds.size(); } @Override public Fragment getItem(int position) { Uri feedUri = MusubiContentProvider.uriForItem(Provided.FEEDS, mFeeds.get(position)); Bundle args = new Bundle(); args.putParcelable(FeedViewFragment.ARG_FEED_URI, feedUri); FeedViewFragment f = new FeedViewFragment(); f.setArguments(args); return f; } } @Override public void onBackPressed() { super.onBackPressed(); finish(); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { long feedId = mFeeds.get(position); mFeedUri = MusubiContentProvider.uriForItem(Provided.FEEDS, feedId); String feedName = UiUtil.getFeedNameFromMembersList(mFeedManager, mFeedManager.lookupFeed(feedId)); App.setCurrentFeed(this, mFeedUri); Spannable span = EmojiSpannableFactory.getInstance(this).newSpannable(feedName); setTitle(span); mInputMethodManager.hideSoftInputFromWindow(mFeedViewPager.getWindowToken(), 0); //TODO: if you want some NFC behavior shown on the feed view, then it would go here //... atleast some code to switch what is being shared as different pages become active //getActionBarHelper().setBackgroundDrawable(new ColorDrawable(Feed.colorFor(feedName))); } @Override public Loader<ArrayList<Long>> onCreateLoader(int id, Bundle args) { return new FeedIdListLoader(this); } @Override public void onLoadFinished(Loader<ArrayList<Long>> loader, ArrayList<Long> data) { mFeeds.clear(); mFeeds.addAll(data); loadInitialFeed(); } @Override public void onLoaderReset(Loader<ArrayList<Long>> loader) { // TODO Auto-generated method stub } static class FeedIdListLoader extends AsyncTaskLoader<ArrayList<Long>> { final FeedManager mFeedManager; ArrayList<Long> mData; public FeedIdListLoader(Context context) { super(context); mFeedManager = new FeedManager(App.getDatabaseSource(context)); } @Override public ArrayList<Long> loadInBackground() { mData = mFeedManager.getFeedIdsForDisplay(); return mData; } @Override protected void onStartLoading() { if (mData != null) { deliverResult(mData); } else { forceLoad(); } } } void loadInitialFeed() { if (mFeeds.size() == 0) { Toast.makeText(this, "No feeds to view!", Toast.LENGTH_SHORT).show(); App.setCurrentFeed(this, null); finish(); return; } if (mFeedUri == null) { Toast.makeText(this, "No feed selected!", Toast.LENGTH_SHORT).show(); return; } long desired_feed = ContentUris.parseId(mFeedUri); int size = mFeeds.size(); for(int i = 0; i < size; ++i) { if(mFeeds.get(i) == desired_feed) { mFeedViewPager.setCurrentItem(i); break; } } } }