/*
* Copyright 2012 GitHub Inc.
*
* 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.github.mobile.ui.gist;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
import static com.github.mobile.Intents.EXTRA_GIST;
import static com.github.mobile.Intents.EXTRA_GIST_ID;
import static com.github.mobile.Intents.EXTRA_GIST_IDS;
import static com.github.mobile.Intents.EXTRA_POSITION;
import android.content.Intent;
import android.os.Bundle;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.MenuItem;
import com.github.mobile.Intents.Builder;
import com.github.mobile.R.drawable;
import com.github.mobile.R.id;
import com.github.mobile.R.layout;
import com.github.mobile.R.string;
import com.github.mobile.core.OnLoadListener;
import com.github.mobile.core.gist.GistStore;
import com.github.mobile.ui.ConfirmDialogFragment;
import com.github.mobile.ui.FragmentProvider;
import com.github.mobile.ui.PagerActivity;
import com.github.mobile.ui.UrlLauncher;
import com.github.mobile.ui.ViewPager;
import com.github.mobile.util.AvatarLoader;
import com.google.inject.Inject;
import java.io.Serializable;
import java.util.List;
import org.eclipse.egit.github.core.Gist;
/**
* Activity to display a collection of Gists in a pager
*/
public class GistsViewActivity extends PagerActivity implements
OnLoadListener<Gist> {
private static final int REQUEST_CONFIRM_DELETE = 1;
/**
* Create an intent to show a single gist
*
* @param gist
* @return intent
*/
public static Intent createIntent(Gist gist) {
return new Builder("gists.VIEW").gist(gist).add(EXTRA_POSITION, 0)
.toIntent();
}
/**
* Create an intent to show gists with an initial selected Gist
*
* @param gists
* @param position
* @return intent
*/
public static Intent createIntent(List<Gist> gists, int position) {
String[] ids = new String[gists.size()];
int index = 0;
for (Gist gist : gists)
ids[index++] = gist.getId();
return new Builder("gists.VIEW")
.add(EXTRA_GIST_IDS, (Serializable) ids)
.add(EXTRA_POSITION, position).toIntent();
}
private ViewPager pager;
private String[] gists;
private Gist gist;
private int initialPosition;
@Inject
private GistStore store;
@Inject
private AvatarLoader avatars;
private GistsPagerAdapter adapter;
private final UrlLauncher urlLauncher = new UrlLauncher(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.pager);
gists = getStringArrayExtra(EXTRA_GIST_IDS);
gist = getSerializableExtra(EXTRA_GIST);
initialPosition = getIntExtra(EXTRA_POSITION);
pager = finder.find(id.vp_pages);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Support opening this activity with a single Gist that may be present
// in the intent but not currently present in the store
if (gists == null && gist != null) {
if (gist.getCreatedAt() != null) {
Gist stored = store.getGist(gist.getId());
if (stored == null)
store.addGist(gist);
}
gists = new String[] { gist.getId() };
}
adapter = new GistsPagerAdapter(this, gists);
pager.setAdapter(adapter);
pager.setOnPageChangeListener(this);
pager.scheduleSetItem(initialPosition, this);
onPageSelected(initialPosition);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, GistsActivity.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
return true;
case id.m_delete:
String gistId = gists[pager.getCurrentItem()];
Bundle args = new Bundle();
args.putString(EXTRA_GIST_ID, gistId);
ConfirmDialogFragment.show(this, REQUEST_CONFIRM_DELETE,
getString(string.confirm_gist_delete_title),
getString(string.confirm_gist_delete_message), args);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onDialogResult(int requestCode, int resultCode, Bundle arguments) {
if (REQUEST_CONFIRM_DELETE == requestCode && RESULT_OK == resultCode) {
final String gistId = arguments.getString(EXTRA_GIST_ID);
new DeleteGistTask(this, gistId).start();
return;
}
super.onDialogResult(requestCode, resultCode, arguments);
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
String gistId = gists[position];
Gist gist = store.getGist(gistId);
updateActionBar(gist, gistId);
}
@Override
public void startActivity(Intent intent) {
Intent converted = urlLauncher.convert(intent);
if (converted != null)
super.startActivity(converted);
else
super.startActivity(intent);
}
@Override
protected FragmentProvider getProvider() {
return adapter;
}
private void updateActionBar(Gist gist, String gistId) {
ActionBar actionBar = getSupportActionBar();
if (gist == null) {
actionBar.setSubtitle(null);
actionBar.setLogo(null);
actionBar.setIcon(drawable.app_icon);
} else if (gist.getUser() != null) {
avatars.bind(actionBar, gist.getUser());
actionBar.setSubtitle(gist.getUser().getLogin());
} else {
actionBar.setSubtitle(string.anonymous);
actionBar.setLogo(null);
actionBar.setIcon(drawable.app_icon);
}
actionBar.setTitle(getString(string.gist_title) + gistId);
}
@Override
public void loaded(Gist gist) {
if (gists[pager.getCurrentItem()].equals(gist.getId()))
updateActionBar(gist, gist.getId());
}
}