/* * 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.repo; 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_REPOSITORY; import static com.github.mobile.ResultCodes.RESOURCE_CHANGED; import static com.github.mobile.ui.repo.RepositoryPagerAdapter.ITEM_CODE; import static com.github.mobile.util.TypefaceUtils.ICON_CODE; import static com.github.mobile.util.TypefaceUtils.ICON_COMMIT; import static com.github.mobile.util.TypefaceUtils.ICON_ISSUE_OPEN; import static com.github.mobile.util.TypefaceUtils.ICON_NEWS; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.widget.ProgressBar; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.github.kevinsawicki.wishlist.ViewUtils; import com.github.mobile.Intents.Builder; import com.github.mobile.R.id; import com.github.mobile.R.layout; import com.github.mobile.R.menu; import com.github.mobile.R.string; import com.github.mobile.core.repo.RefreshRepositoryTask; import com.github.mobile.core.repo.RepositoryUtils; import com.github.mobile.core.repo.StarRepositoryTask; import com.github.mobile.core.repo.StarredRepositoryTask; import com.github.mobile.core.repo.UnstarRepositoryTask; import com.github.mobile.ui.TabPagerActivity; import com.github.mobile.ui.user.UserViewActivity; import com.github.mobile.util.AvatarLoader; import com.github.mobile.util.ToastUtils; import com.google.inject.Inject; import com.github.mobile.util.ShareUtils; import org.eclipse.egit.github.core.Repository; import org.eclipse.egit.github.core.User; /** * Activity to view a repository */ public class RepositoryViewActivity extends TabPagerActivity<RepositoryPagerAdapter> { /** * Create intent for this activity * * @param repository * @return intent */ public static Intent createIntent(Repository repository) { return new Builder("repo.VIEW").repo(repository).toIntent(); } private Repository repository; @Inject private AvatarLoader avatars; private ProgressBar loadingBar; private boolean isStarred; private boolean starredStatusChecked; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); repository = getSerializableExtra(EXTRA_REPOSITORY); loadingBar = finder.find(id.pb_loading); User owner = repository.getOwner(); ActionBar actionBar = getSupportActionBar(); actionBar.setTitle(repository.getName()); actionBar.setSubtitle(owner.getLogin()); actionBar.setDisplayHomeAsUpEnabled(true); if (owner.getAvatarUrl() != null && RepositoryUtils.isComplete(repository)) configurePager(); else { avatars.bind(getSupportActionBar(), owner); ViewUtils.setGone(loadingBar, false); setGone(true); new RefreshRepositoryTask(this, repository) { @Override protected void onSuccess(Repository fullRepository) throws Exception { super.onSuccess(fullRepository); repository = fullRepository; configurePager(); } @Override protected void onException(Exception e) throws RuntimeException { super.onException(e); ToastUtils.show(RepositoryViewActivity.this, string.error_repo_load); ViewUtils.setGone(loadingBar, true); } }.execute(); } } @Override public boolean onCreateOptionsMenu(Menu optionsMenu) { getSupportMenuInflater().inflate(menu.repository, optionsMenu); return super.onCreateOptionsMenu(optionsMenu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem followItem = menu.findItem(id.m_star); followItem.setVisible(starredStatusChecked); followItem.setTitle(isStarred ? string.unstar : string.star); return super.onPrepareOptionsMenu(menu); } @Override public boolean onSearchRequested() { if (pager.getCurrentItem() == 1) { Bundle args = new Bundle(); args.putSerializable(EXTRA_REPOSITORY, repository); startSearch(null, false, args, false); return true; } else return false; } @Override public void onBackPressed() { if (adapter == null || pager.getCurrentItem() != ITEM_CODE || !adapter.onBackPressed()) super.onBackPressed(); } private void configurePager() { avatars.bind(getSupportActionBar(), repository.getOwner()); configureTabPager(); ViewUtils.setGone(loadingBar, true); setGone(false); checkStarredRepositoryStatus(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case id.m_star: starRepository(); return true; case id.m_share: shareRepository(); return true; case id.m_refresh: checkStarredRepositoryStatus(); return super.onOptionsItemSelected(item); case id.m_contributors: startActivity(RepositoryContributorsActivity.createIntent(repository)); return true; case android.R.id.home: finish(); Intent intent = UserViewActivity.createIntent(repository.getOwner()); intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onDialogResult(int requestCode, int resultCode, Bundle arguments) { adapter.onDialogResult(pager.getCurrentItem(), requestCode, resultCode, arguments); } @Override protected RepositoryPagerAdapter createAdapter() { return new RepositoryPagerAdapter(this, repository.isHasIssues()); } @Override protected int getContentView() { return layout.tabbed_progress_pager; } @Override protected String getIcon(int position) { switch (position) { case 0: return ICON_NEWS; case 1: return ICON_CODE; case 2: return ICON_COMMIT; case 3: return ICON_ISSUE_OPEN; default: return super.getIcon(position); } } private void starRepository() { if (isStarred) new UnstarRepositoryTask(this, repository) { @Override protected void onSuccess(Void v) throws Exception { super.onSuccess(v); isStarred = !isStarred; setResult(RESOURCE_CHANGED); } @Override protected void onException(Exception e) throws RuntimeException { super.onException(e); ToastUtils.show(RepositoryViewActivity.this, string.error_unstarring_repository); } }.start(); else new StarRepositoryTask(this, repository) { @Override protected void onSuccess(Void v) throws Exception { super.onSuccess(v); isStarred = !isStarred; setResult(RESOURCE_CHANGED); } @Override protected void onException(Exception e) throws RuntimeException { super.onException(e); ToastUtils.show(RepositoryViewActivity.this, string.error_starring_repository); } }.start(); } private void checkStarredRepositoryStatus() { starredStatusChecked = false; new StarredRepositoryTask(this, repository) { @Override protected void onSuccess(Boolean watching) throws Exception { super.onSuccess(watching); isStarred = watching; starredStatusChecked = true; invalidateOptionsMenu(); } }.execute(); } private void shareRepository() { String repoUrl = repository.getHtmlUrl(); if (TextUtils.isEmpty(repoUrl)) repoUrl = "https://github.com/" + repository.generateId(); Intent sharingIntent = ShareUtils.create(repository.generateId(), repoUrl); startActivity(sharingIntent); } }