/*
* Copyright (c) 2011, 2012 Roberto Tyley
*
* This file is part of 'Agit' - an Android Git client.
*
* Agit is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Agit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/ .
*/
package com.madgag.agit;
import static android.R.drawable.ic_menu_delete;
import static android.content.DialogInterface.BUTTON_POSITIVE;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.madgag.agit.GitIntents.REPO_STATE_CHANGED_BROADCAST;
import static com.madgag.agit.GitIntents.actionWithSuffix;
import static com.madgag.agit.GitIntents.gitDirFrom;
import static com.madgag.agit.R.string.button_no;
import static com.madgag.agit.R.string.button_yes;
import static com.madgag.agit.R.string.repo_deletion_dialog_confirmation_message;
import static com.madgag.agit.R.string.repo_deletion_dialog_confirmation_title;
import static com.madgag.agit.git.Repos.niceNameFor;
import static com.madgag.android.ActionBarUtil.fixImageTilingOn;
import static com.madgag.android.ActionBarUtil.homewardsWith;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.google.inject.Inject;
import com.madgag.agit.db.ReposDataSource;
import com.madgag.agit.operation.lifecycle.CasualShortTermLifetime;
import com.madgag.agit.operations.GitAsyncTaskFactory;
import com.madgag.agit.operations.GitOperationExecutor;
import com.madgag.agit.operations.RepoDeleter;
import java.io.File;
import org.eclipse.jgit.lib.Repository;
import roboguice.inject.InjectView;
public class RepositoryViewerActivity extends RepoScopedActivityBase {
public static final String TAG = "RMA";
public static Intent manageRepoIntent(Repository repository) {
return manageRepoIntent(repository.getDirectory());
}
public static Intent manageRepoIntent(File gitdir) {
return new GitIntentBuilder("repo.VIEW").gitdir(gitdir).toIntent();
}
private final int DELETION_IN_PROGRESS_DIALOG = 3;
private final int DELETION_CONFIRMATION_DIALOG = DELETION_IN_PROGRESS_DIALOG + 1;
private DialogInterface.OnClickListener DELETION_CONFIRMATION_DIALOG_LISTENER = new DialogInterface
.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int which) {
if (which == BUTTON_POSITIVE) {
doDeletion();
}
}
};
@Inject
GitAsyncTaskFactory gitAsyncTaskFactory;
@InjectView(android.R.id.list)
ListView listView;
@Inject
RepoSummaryAdapter summaryAdapter;
@Inject
GitOperationExecutor gitOperationExecutor;
@Inject
ReposDataSource reposDataSource;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fixImageTilingOn(getSupportActionBar());
setContentView(R.layout.repo_management_activity);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(niceNameFor(repo()));
actionBar.setDisplayHomeAsUpEnabled(true);
listView.setOnItemClickListener(summaryAdapter.getOnItemClickListener());
reposDataSource.registerRepo(gitdir());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getSupportMenuInflater().inflate(R.menu.repo, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return homewardsWith(this, new Intent(this, DashboardActivity.class));
case R.id.delete_repo:
showDialog(DELETION_CONFIRMATION_DIALOG);
return true;
case R.id.sync_repo:
startService(new GitIntentBuilder("repo.SYNC").repository(repo()).toIntent());
return true;
}
return super.onOptionsItemSelected(item);
}
private void doDeletion() {
showDialog(DELETION_IN_PROGRESS_DIALOG);
gitAsyncTaskFactory.createTaskFor(new RepoDeleter(repo()), new CasualShortTermLifetime()).execute();
}
BroadcastReceiver operationProgressBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG, "Got broadcast : " + action);
}
};
BroadcastReceiver repoStateChangeBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "repoStateChangeBroadcastReceiver got broadcast : " + intent);
if (!gitdir().exists()) {
finish();
}
}
};
protected Dialog onCreateDialog(int id) {
switch (id) {
case DELETION_IN_PROGRESS_DIALOG:
ProgressDialog deletionDialog = new ProgressDialog(this);
deletionDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
deletionDialog.setMessage("Deleting repo...");
deletionDialog.setIndeterminate(true);
return deletionDialog;
case DELETION_CONFIRMATION_DIALOG:
return new AlertDialog.Builder(this)
.setIcon(R.drawable.icon)
.setTitle(repo_deletion_dialog_confirmation_title)
.setMessage(repo_deletion_dialog_confirmation_message)
.setPositiveButton(button_yes, DELETION_CONFIRMATION_DIALOG_LISTENER)
.setNegativeButton(button_no, DELETION_CONFIRMATION_DIALOG_LISTENER)
.create();
default:
return super.onCreateDialog(id);
}
}
@Override
protected void onNewIntent(Intent newIntent) {
Log.i(TAG, "onNewIntent called with " + newIntent + " " + gitDirFrom(newIntent));
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(operationProgressBroadcastReceiver, new IntentFilter("org.openintents.git.operation.progress" +
".update"));
registerReceiver(repoStateChangeBroadcastReceiver, new IntentFilter(actionWithSuffix
(REPO_STATE_CHANGED_BROADCAST)));
updateUI();
}
void updateUI() {
listView.setAdapter(summaryAdapter);
// TextView remotesSummary = (TextView) findViewById(remotes_summary);
// remotesSummary.setText(new RDTRemote(repo()).summariseAll());
//
// TextView branchesSummary = (TextView) findViewById(branches_summary);
// branchesSummary.setText(new RDTBranch(repo()).summariseAll());
//
// TextView tagsSummary = (TextView) findViewById(tags_summary);
// tagsSummary.setText(new RDTTag(repo()).summariseAll());
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(operationProgressBroadcastReceiver);
unregisterReceiver(repoStateChangeBroadcastReceiver);
}
public static PendingIntent manageRepoPendingIntent(File gitdir, Context context) {
Log.i(TAG, "manageRepoPendingIntent yeah - creating with " + gitdir);
Intent intentForNotification = manageRepoIntent(gitdir);
intentForNotification.setFlags(FLAG_ACTIVITY_NEW_TASK);
return PendingIntent.getActivity(context, gitdir.hashCode(), intentForNotification, 0);
}
}