1/*
2 * Copyright (C) 2010 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 */
16package com.android.contacts.vcard;
17
18import android.app.Activity;
19import android.app.AlertDialog;
20import android.app.Dialog;
21import android.content.ComponentName;
22import android.content.Context;
23import android.content.DialogInterface;
24import android.content.Intent;
25import android.content.ServiceConnection;
26import android.net.Uri;
27import android.os.Bundle;
28import android.os.IBinder;
29import android.util.Log;
30
31import com.android.contacts.R;
32
33/**
34 * The Activity for canceling vCard import/export.
35 */
36public class CancelActivity extends Activity implements ServiceConnection {
37    private final String LOG_TAG = "VCardCancel";
38
39    /* package */ final static String JOB_ID = "job_id";
40    /* package */ final static String DISPLAY_NAME = "display_name";
41
42    /**
43     * Type of the process to be canceled. Only used for choosing appropriate title/message.
44     * Must be {@link VCardService#TYPE_IMPORT} or {@link VCardService#TYPE_EXPORT}.
45     */
46    /* package */ final static String TYPE = "type";
47
48    private class RequestCancelListener implements DialogInterface.OnClickListener {
49        @Override
50        public void onClick(DialogInterface dialog, int which) {
51            bindService(new Intent(CancelActivity.this,
52                    VCardService.class), CancelActivity.this, Context.BIND_AUTO_CREATE);
53        }
54    }
55
56    private class CancelListener
57            implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
58        @Override
59        public void onClick(DialogInterface dialog, int which) {
60            finish();
61        }
62        @Override
63        public void onCancel(DialogInterface dialog) {
64            finish();
65        }
66    }
67
68    private final CancelListener mCancelListener = new CancelListener();
69    private int mJobId;
70    private String mDisplayName;
71    private int mType;
72
73    @Override
74    public void onCreate(Bundle savedInstanceState) {
75        super.onCreate(savedInstanceState);
76        final Uri uri = getIntent().getData();
77        mJobId = Integer.parseInt(uri.getQueryParameter(JOB_ID));
78        mDisplayName = uri.getQueryParameter(DISPLAY_NAME);
79        mType = Integer.parseInt(uri.getQueryParameter(TYPE));
80        showDialog(R.id.dialog_cancel_confirmation);
81    }
82
83    @Override
84    protected Dialog onCreateDialog(int id, Bundle bundle) {
85        switch (id) {
86        case R.id.dialog_cancel_confirmation: {
87            final String message;
88            if (mType == VCardService.TYPE_IMPORT) {
89                message = getString(R.string.cancel_import_confirmation_message, mDisplayName);
90            } else {
91                message = getString(R.string.cancel_export_confirmation_message, mDisplayName);
92            }
93            final AlertDialog.Builder builder = new AlertDialog.Builder(this)
94                    .setMessage(message)
95                    .setPositiveButton(android.R.string.ok, new RequestCancelListener())
96                    .setOnCancelListener(mCancelListener)
97                    .setNegativeButton(android.R.string.cancel, mCancelListener);
98            return builder.create();
99        }
100        case R.id.dialog_cancel_failed:
101            final AlertDialog.Builder builder = new AlertDialog.Builder(this)
102                    .setTitle(R.string.cancel_vcard_import_or_export_failed)
103                    .setIconAttribute(android.R.attr.alertDialogIcon)
104                    .setMessage(getString(R.string.fail_reason_unknown))
105                    .setOnCancelListener(mCancelListener)
106                    .setPositiveButton(android.R.string.ok, mCancelListener);
107            return builder.create();
108        default:
109            Log.w(LOG_TAG, "Unknown dialog id: " + id);
110            break;
111        }
112        return super.onCreateDialog(id, bundle);
113    }
114
115    @Override
116    public void onServiceConnected(ComponentName name, IBinder binder) {
117        VCardService service = ((VCardService.MyBinder) binder).getService();
118
119        try {
120            final CancelRequest request = new CancelRequest(mJobId, mDisplayName);
121            service.handleCancelRequest(request, null);
122        } finally {
123            unbindService(this);
124        }
125
126        finish();
127    }
128
129    @Override
130    public void onServiceDisconnected(ComponentName name) {
131        // do nothing
132    }
133}
134