/*
* Copyright (C) 2013 Chris Lacy 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.tweetlanes.android.core.view;
import android.app.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ViewSwitcher;
import com.tweetlanes.android.core.R;
import com.tweetlanes.android.core.model.ComposeTweetDefault;
import com.tweetlanes.android.core.model.LaneDescriptor;
import com.tweetlanes.android.core.widget.viewpagerindicator.TitleProvider;
import org.tweetalib.android.TwitterFetchResult;
import org.tweetalib.android.TwitterFetchUser;
import org.tweetalib.android.TwitterManager;
import org.tweetalib.android.model.TwitterUser;
public class ProfileActivity extends BaseLaneActivity {
private ProfileAdapter mProfileAdapter;
private ViewSwitcher mViewSwitcher;
private TwitterUser mUser;
private String mScreenName;
/*
* (non-Javadoc)
*
* @see
* com.tweetlanes.android.core.view.BaseLaneActivity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent returnIntent = new Intent();
setResult(RESULT_OK, returnIntent);
String clearCompose = getIntent().getStringExtra("clearCompose");
boolean savedStateRecreate = false;
if (savedInstanceState != null && savedInstanceState.containsKey("Recreate")) {
savedStateRecreate = savedInstanceState.getBoolean("Recreate");
}
mScreenName = getIntent().getStringExtra("userScreenName");
if (mScreenName == null) {
Uri data = getIntent().getData();
mScreenName = data.toString()
.replace("com.tweetlanes.android.core.profile://", "")
.replace("@", "");
}
if (mScreenName == null) {
restartApp();
return;
}
BaseLaneFragment fragment = super.getFragmentAtIndex(0);
super.setCurrentComposeFragment((fragment instanceof DirectMessageFeedFragment) ? super.COMPOSE_DIRECT_MESSAGE
: super.COMPOSE_TWEET);
if ((clearCompose != null && clearCompose.equals("true")) && !savedStateRecreate) {
clearCompose();
getIntent().removeExtra("clearCompose");
}
TwitterFetchUser.FinishedCallback callback = TwitterManager.get()
.getFetchUserInstance().new FinishedCallback() {
public void finished(TwitterFetchResult result, TwitterUser user) {
if (result.isSuccessful()) {
mUser = user;
updateViewVisibility();
} else {
// TODO: Handle this properly
finish();
}
}
};
boolean requestedUser = false;
String profileIdAsString = getIntent().getStringExtra("userId");
Long mappedProfileId = TwitterManager
.getUserIdFromScreenName(mScreenName);
if (mappedProfileId != null) {
mUser = TwitterManager.get().getUser(mappedProfileId, callback);
requestedUser = true;
} else if (profileIdAsString != null) {
long profileId = Long.parseLong(profileIdAsString);
if (profileId > 0) {
mUser = TwitterManager.get().getUser(profileId, callback);
requestedUser = true;
}
}
if (!requestedUser) {
mUser = TwitterManager.get().getUser(mScreenName, callback);
}
mViewSwitcher = (ViewSwitcher) findViewById(R.id.rootViewSwitcher);
updateViewVisibility();
setComposeDefault();
}
@Override
protected void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putBoolean("Recreate", true);
}
/*
* (non-Javadoc)
*
* @see com.tweetlanes.android.core.view.BaseLaneActivity#onDestroy()
*/
@Override
protected void onDestroy() {
// By clearing this variable and checking whether it's valid in
// updateViewVisibility(), an exception is averted whe nthe Activity is
// destroyed, yet a callback is still initiated from a Twitter fetch
// operation. A better solution is needed here, but this works for now.
mProfileAdapter = null;
super.onDestroy();
}
/*
*
*/
@Override
protected ComposeTweetDefault getComposeTweetDefault() {
return new ComposeTweetDefault(getApp().getCurrentAccountScreenName(),
"@" + mScreenName + " ", null, null);
}
/*
* (non-Javadoc)
*
* @see
* com.tweetlanes.android.core.view.BaseLaneActivity#getAdapterForViewPager()
*/
@Override
protected PagerAdapter getAdapterForViewPager() {
if (mProfileAdapter == null) {
mProfileAdapter = new ProfileAdapter(getSupportFragmentManager());
}
return mProfileAdapter;
}
/*
* (non-Javadoc)
*
* @see
* com.tweetlanes.android.core.view.BaseLaneActivity#getFragmentStatePagerAdapter
* ()
*/
@Override
protected FragmentStatePagerAdapter getFragmentStatePagerAdapter() {
return mProfileAdapter;
}
/*
*
*/
private void updateViewVisibility() {
configureActionBarView();
mViewSwitcher.reset();
if (mUser == null) {
mViewSwitcher.setDisplayedChild(0);
} else {
mViewSwitcher.setDisplayedChild(1);
// Will be NULL if the callback was called after the Activity was
// released
if (mProfileAdapter != null) {
mProfileAdapter.notifyDataSetChanged();
}
}
}
/*
*
*/
@Override
public boolean configureOptionsMenu(Menu menu) {
boolean result = super.configureOptionsMenu(menu);
configureActionBarView();
return result;
}
/*
*
*/
void configureActionBarView() {
if (mScreenName != null) {
final ActionBar actionBar = getActionBar();
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle("@" + mScreenName);
final LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final int layout = R.layout.profile_title_thin;
/*
* // TODO: This is messy, and likely won't work for large screen
* devices. Need to come up with a better solution int layout; if
* (getResources().getConfiguration().orientation ==
* Configuration.ORIENTATION_LANDSCAPE) { layout=
* R.layout.profile_title_thin; } else { layout =
* R.layout.profile_title; }
*/
final View abView = inflator.inflate(layout, null);
final ImageView verified = (ImageView) abView.findViewById(R.id.verifiedImage);
verified.setVisibility(mUser != null && mUser.getVerified() ? View.VISIBLE : View.GONE);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(abView);
}
}
/*
* (non-Javadoc)
*
* @see
* com.tweetlanes.android.core.view.BaseLaneActivity#onOptionsItemSelected(android
* .view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (super.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return false;
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
clearCompose();
}
/*
*
*/
class ProfileAdapter extends FragmentStatePagerAdapter implements
TitleProvider {
public ProfileAdapter(FragmentManager supportFragmentManager) {
super(supportFragmentManager);
}
@Override
public Fragment getItem(int position) {
Fragment result;
if (mUser != null) {
LaneDescriptor laneDescriptor = getApp()
.getProfileLaneDescriptor(position);
switch (laneDescriptor.getLaneType()) {
case PROFILE_PROFILE:
result = ProfileFragment.newInstance(position,
mUser.getId());
break;
case PROFILE_PROFILE_TIMELINE:
case PROFILE_MENTIONS:
case PROFILE_FAVORITES:
result = TweetFeedFragment
.newInstance(position,
laneDescriptor.getContentHandleBase(),
mUser.getScreenName(),
Long.toString(mUser.getId()),
getApp().getCurrentAccountKey());
break;
default:
result = PlaceholderPagerFragment.newInstance(position,
laneDescriptor.getLaneTitle(), position);
break;
}
} else {
result = LoadingFragment.newInstance(position);
}
return result;
}
@Override
public int getCount() {
return getApp().getProfileLaneDefinitions().size();
}
@Override
public String getTitle(int position) {
return getApp().getProfileLaneDescriptor(position).getLaneTitle()
.toUpperCase();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
}