1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.providers.contacts.debug; 18 19 import com.android.providers.contacts.R; 20 21 import android.app.Activity; 22 import android.content.Intent; 23 import android.net.Uri; 24 import android.os.AsyncTask; 25 import android.os.Bundle; 26 import android.util.Log; 27 import android.view.View; 28 import android.view.View.OnClickListener; 29 import android.view.Window; 30 import android.widget.Button; 31 32 import java.io.IOException; 33 34 /** 35 * Activity to export all app data files as a zip file on sdcard, and send it via email. 36 * 37 * Usage: 38 * adb shell am start -a com.android.providers.contacts.DUMP_DATABASE 39 */ 40 public class ContactsDumpActivity extends Activity implements OnClickListener { 41 private static String TAG = "ContactsDumpActivity"; 42 private Button mConfirmButton; 43 private Button mCancelButton; 44 private Button mDeleteButton; 45 46 @Override onCreate(Bundle savedInstanceState)47 protected void onCreate(Bundle savedInstanceState) { 48 // Be sure to call the super class. 49 super.onCreate(savedInstanceState); 50 51 requestWindowFeature(Window.FEATURE_LEFT_ICON); 52 53 setContentView(R.layout.contact_dump_activity); 54 55 getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 56 android.R.drawable.ic_dialog_alert); 57 58 mConfirmButton = (Button) findViewById(R.id.confirm); 59 mCancelButton = (Button) findViewById(R.id.cancel); 60 mDeleteButton = (Button) findViewById(R.id.delete); 61 updateDeleteButton(); 62 } 63 updateDeleteButton()64 private void updateDeleteButton() { 65 mDeleteButton.setEnabled(DataExporter.dumpFileExists(this)); 66 } 67 68 @Override onClick(View v)69 public void onClick(View v) { 70 switch (v.getId()) { 71 case R.id.confirm: 72 mConfirmButton.setEnabled(false); 73 mCancelButton.setEnabled(false); 74 new DumpDbTask().execute(); 75 break; 76 case R.id.delete: 77 cleanup(); 78 updateDeleteButton(); 79 break; 80 case R.id.cancel: 81 finish(); 82 break; 83 } 84 } 85 cleanup()86 private void cleanup() { 87 DataExporter.removeDumpFiles(this); 88 } 89 90 private class DumpDbTask extends AsyncTask<Void, Void, Uri> { 91 /** 92 * Starts spinner while task is running. 93 */ 94 @Override onPreExecute()95 protected void onPreExecute() { 96 setProgressBarIndeterminateVisibility(true); 97 } 98 99 @Override doInBackground(Void... params)100 protected Uri doInBackground(Void... params) { 101 try { 102 return DataExporter.exportData(getApplicationContext()); 103 } catch (IOException e) { 104 Log.e(TAG, "Failed to export", e); 105 return null; 106 } 107 } 108 109 @Override onPostExecute(Uri uri)110 protected void onPostExecute(Uri uri) { 111 if (uri != null) { 112 emailFile(uri); 113 } 114 } 115 } 116 emailFile(Uri uri)117 private void emailFile(Uri uri) { 118 Log.i(TAG, "Drafting email"); 119 Intent intent = new Intent(Intent.ACTION_SEND); 120 intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.debug_dump_email_subject)); 121 intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.debug_dump_email_body)); 122 intent.setType(DataExporter.ZIP_MIME_TYPE); 123 intent.putExtra(Intent.EXTRA_STREAM, uri); 124 startActivityForResult(Intent.createChooser(intent, 125 getString(R.string.debug_dump_email_sender_picker)), 0); 126 } 127 128 @Override onActivityResult(int requestCode, int resultCode, Intent data)129 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 130 updateDeleteButton(); 131 mConfirmButton.setEnabled(true); 132 mCancelButton.setEnabled(true); 133 } 134 } 135