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