com.gh4a.activities.GistActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.gh4a.activities.GistActivity.java

Source

/*
 * Copyright 2011 Azwan Adli Abdullah
 *
 * 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.gh4a.activities;

import java.io.IOException;
import java.util.Map;

import org.eclipse.egit.github.core.Gist;
import org.eclipse.egit.github.core.GistFile;
import org.eclipse.egit.github.core.service.GistService;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.gh4a.BackgroundTask;
import com.gh4a.BaseActivity;
import com.gh4a.Constants;
import com.gh4a.Gh4Application;
import com.gh4a.R;
import com.gh4a.loader.GistLoader;
import com.gh4a.loader.GistStarLoader;
import com.gh4a.loader.LoaderCallbacks;
import com.gh4a.loader.LoaderResult;
import com.gh4a.utils.ApiHelpers;
import com.gh4a.utils.StringUtils;
import com.gh4a.utils.UiUtils;

public class GistActivity extends BaseActivity implements View.OnClickListener {
    private String mGistId;
    private Gist mGist;
    private Boolean mIsStarred;

    private LoaderCallbacks<Gist> mGistCallback = new LoaderCallbacks<Gist>(this) {
        @Override
        protected Loader<LoaderResult<Gist>> onCreateLoader() {
            return new GistLoader(GistActivity.this, mGistId);
        }

        @Override
        protected void onResultReady(Gist result) {
            fillData(result);
            setContentShown(true);
            supportInvalidateOptionsMenu();
        }
    };

    private LoaderCallbacks<Boolean> mStarCallback = new LoaderCallbacks<Boolean>(this) {
        @Override
        protected Loader<LoaderResult<Boolean>> onCreateLoader() {
            return new GistStarLoader(GistActivity.this, mGistId);
        }

        @Override
        protected void onResultReady(Boolean result) {
            mIsStarred = result;
            supportInvalidateOptionsMenu();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.gist);
        setContentShown(false);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(getString(R.string.gist_title, mGistId));
        actionBar.setDisplayHomeAsUpEnabled(true);

        getSupportLoaderManager().initLoader(0, null, mGistCallback);
        getSupportLoaderManager().initLoader(1, null, mStarCallback);
    }

    @Override
    protected void onInitExtras(Bundle extras) {
        super.onInitExtras(extras);
        mGistId = extras.getString(Constants.Gist.ID);
    }

    @Override
    public void onRefresh() {
        LoaderManager lm = getSupportLoaderManager();
        lm.getLoader(0).onContentChanged();
        lm.getLoader(1).onContentChanged();
        mGist = null;
        mIsStarred = null;
        setContentShown(false);
        super.onRefresh();
    }

    private void fillData(final Gist gist) {
        mGist = gist;

        if (gist.getOwner() != null) {
            getSupportActionBar().setSubtitle(gist.getOwner().getLogin());
        }

        TextView tvDesc = (TextView) findViewById(R.id.tv_desc);
        tvDesc.setText(TextUtils.isEmpty(gist.getDescription()) ? getString(R.string.gist_no_description)
                : gist.getDescription());

        TextView tvCreatedAt = (TextView) findViewById(R.id.tv_created_at);
        tvCreatedAt.setText(StringUtils.formatRelativeTime(this, gist.getCreatedAt(), true));

        Map<String, GistFile> files = gist.getFiles();
        if (files != null && !files.isEmpty()) {
            ViewGroup container = (ViewGroup) findViewById(R.id.file_container);
            LayoutInflater inflater = getLayoutInflater();

            container.removeAllViews();
            for (GistFile gistFile : files.values()) {
                TextView rowView = (TextView) inflater.inflate(R.layout.selectable_label, container, false);

                rowView.setText(gistFile.getFilename());
                rowView.setTextColor(UiUtils.resolveColor(this, android.R.attr.textColorPrimary));
                rowView.setOnClickListener(this);
                rowView.setTag(gistFile);
                container.addView(rowView);
            }
        } else {
            findViewById(R.id.file_card).setVisibility(View.GONE);
        }

        findViewById(R.id.tv_private).setVisibility(gist.isPublic() ? View.GONE : View.VISIBLE);
    }

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, GistViewerActivity.class);
        GistFile gist = (GistFile) view.getTag();
        intent.putExtra(Constants.Gist.FILENAME, gist.getFilename());
        intent.putExtra(Constants.Gist.ID, mGistId);
        startActivity(intent);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuItem starItem = menu.add(0, R.id.star, 0, R.string.repo_star_action).setIcon(R.drawable.star);
        MenuItemCompat.setShowAsAction(starItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);

        if (mGist != null) {
            MenuItem shareItem = menu.add(0, R.id.share, 0, R.string.share).setIcon(R.drawable.social_share);
            MenuItemCompat.setShowAsAction(shareItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
        }

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean authorized = Gh4Application.get().isAuthorized();

        MenuItem starAction = menu.findItem(R.id.star);
        starAction.setVisible(authorized);
        if (authorized) {
            if (mIsStarred == null) {
                MenuItemCompat.setActionView(starAction, R.layout.ab_loading);
                MenuItemCompat.expandActionView(starAction);
            } else if (mIsStarred) {
                starAction.setTitle(R.string.repo_unstar_action);
                starAction.setIcon(R.drawable.unstar);
            } else {
                starAction.setTitle(R.string.repo_star_action);
                starAction.setIcon(R.drawable.star);
            }
        }

        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.share:
            String login = ApiHelpers.getUserLogin(this, mGist.getOwner());
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_gist_subject, mGistId, login));
            shareIntent.putExtra(Intent.EXTRA_TEXT, mGist.getHtmlUrl());
            shareIntent = Intent.createChooser(shareIntent, getString(R.string.share_title));
            startActivity(shareIntent);
            return true;
        case R.id.star:
            MenuItemCompat.setActionView(item, R.layout.ab_loading);
            MenuItemCompat.expandActionView(item);
            new UpdateStarTask().schedule();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected Intent navigateUp() {
        String login = mGist != null && mGist.getOwner() != null ? mGist.getOwner().getLogin() : null;
        if (login != null) {
            Intent intent = new Intent(this, GistListActivity.class);
            intent.putExtra(Constants.User.LOGIN, login);
            return intent;
        }
        return null;
    }

    private class UpdateStarTask extends BackgroundTask<Void> {
        public UpdateStarTask() {
            super(GistActivity.this);
        }

        @Override
        protected Void run() throws IOException {
            GistService gistService = (GistService) Gh4Application.get().getService(Gh4Application.GIST_SERVICE);
            if (mIsStarred) {
                gistService.unstarGist(mGistId);
            } else {
                gistService.starGist(mGistId);
            }
            return null;
        }

        @Override
        protected void onSuccess(Void result) {
            mIsStarred = !mIsStarred;
            supportInvalidateOptionsMenu();
        }
    }
}