18a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki/* 28a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Copyright (C) 2012 The Android Open Source Project 38a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * 48a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 58a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * you may not use this file except in compliance with the License. 68a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * You may obtain a copy of the License at 78a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * 88a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 98a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * 108a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Unless required by applicable law or agreed to in writing, software 118a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 128a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * See the License for the specific language governing permissions and 148a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * limitations under the License. 158a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki */ 168a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 178a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukipackage com.android.providers.contacts.debug; 188a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 19623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport com.android.providers.contacts.R; 20623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 218a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.app.Activity; 228a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.content.Intent; 238a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.net.Uri; 248a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.os.AsyncTask; 258a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.os.Bundle; 268a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.util.Log; 278a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.view.View; 288a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.view.View.OnClickListener; 298a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.view.Window; 308a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport android.widget.Button; 318a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 328a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukiimport java.io.IOException; 338a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 348a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki/** 358a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Activity to export all app data files as a zip file on sdcard, and send it via email. 368a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * 378a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Usage: 388a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * adb shell am start -a com.android.providers.contacts.DUMP_DATABASE 398a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki */ 408a6e02add7c70666cdb506310c134af7d91c323cMakoto Onukipublic class ContactsDumpActivity extends Activity implements OnClickListener { 418a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private static String TAG = "ContactsDumpActivity"; 428a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private Button mConfirmButton; 438a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private Button mCancelButton; 448a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private Button mDeleteButton; 458a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 468a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 478a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki protected void onCreate(Bundle savedInstanceState) { 488a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki // Be sure to call the super class. 498a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki super.onCreate(savedInstanceState); 508a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 518a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki requestWindowFeature(Window.FEATURE_LEFT_ICON); 528a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 538a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki setContentView(R.layout.contact_dump_activity); 548a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 558a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 568a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki android.R.drawable.ic_dialog_alert); 578a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 588a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mConfirmButton = (Button) findViewById(R.id.confirm); 598a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mCancelButton = (Button) findViewById(R.id.cancel); 608a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mDeleteButton = (Button) findViewById(R.id.delete); 618a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki updateDeleteButton(); 628a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 638a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 648a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private void updateDeleteButton() { 65623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki mDeleteButton.setEnabled(DataExporter.dumpFileExists(this)); 668a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 678a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 688a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 698a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki public void onClick(View v) { 708a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki switch (v.getId()) { 718a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki case R.id.confirm: 728a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mConfirmButton.setEnabled(false); 738a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mCancelButton.setEnabled(false); 748a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki new DumpDbTask().execute(); 758a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki break; 768a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki case R.id.delete: 778a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki cleanup(); 788a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki updateDeleteButton(); 798a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki break; 808a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki case R.id.cancel: 818a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki finish(); 828a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki break; 838a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 848a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 858a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 868a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki private void cleanup() { 87623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki DataExporter.removeDumpFiles(this); 888a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 898a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 90623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki private class DumpDbTask extends AsyncTask<Void, Void, Uri> { 918a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki /** 928a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki * Starts spinner while task is running. 938a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki */ 948a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 958a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki protected void onPreExecute() { 968a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki setProgressBarIndeterminateVisibility(true); 978a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 988a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 998a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 100623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki protected Uri doInBackground(Void... params) { 1018a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki try { 102623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return DataExporter.exportData(getApplicationContext()); 1038a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } catch (IOException e) { 1048a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki Log.e(TAG, "Failed to export", e); 105623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return null; 1068a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1078a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1088a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 1098a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 110623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki protected void onPostExecute(Uri uri) { 111623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki if (uri != null) { 112623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki emailFile(uri); 1138a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1148a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1158a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1168a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 117623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki private void emailFile(Uri uri) { 118623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki Log.i(TAG, "Drafting email"); 1198a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki Intent intent = new Intent(Intent.ACTION_SEND); 1208a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.debug_dump_email_subject)); 1218a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.debug_dump_email_body)); 1228a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki intent.setType(DataExporter.ZIP_MIME_TYPE); 123623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki intent.putExtra(Intent.EXTRA_STREAM, uri); 1248a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki startActivityForResult(Intent.createChooser(intent, 1258a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki getString(R.string.debug_dump_email_sender_picker)), 0); 1268a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1278a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki 1288a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki @Override 1298a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1308a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki updateDeleteButton(); 1318a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mConfirmButton.setEnabled(true); 1328a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki mCancelButton.setEnabled(true); 1338a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki } 1348a6e02add7c70666cdb506310c134af7d91c323cMakoto Onuki} 135