Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1167da42 authored by Jeff Hamilton's avatar Jeff Hamilton
Browse files

Move the notification logic out to a listener

so there can be an Activity based version
of the listener as well for NFC VCARD imports.

Removed the now unused showImmediatley from
ImportRequest.

Change-Id: I37292676239444516bcc11486fc53e69b869dfa6
parent 35722935
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -599,17 +599,23 @@
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:theme="@style/BackgroundOnly">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <action android:name="android.intent.action.VIEW" />
                <data android:mimeType="text/directory" />
                <data android:mimeType="text/vcard" />
                <data android:mimeType="text/x-vcard" />
                <data android:mimeType="text/x-vCard" />
                <data android:mimeType="text/vcard" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity android:name=".vcard.NfcImportVCardActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:theme="@style/BackgroundOnly">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data android:mimeType="text/directory" />
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <data android:mimeType="text/vcard" />
                <data android:mimeType="text/x-vcard" />
                <data android:mimeType="text/x-vCard" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
+5 −14
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ public class CancelActivity extends Activity implements ServiceConnection {
    private int mJobId;
    private String mDisplayName;
    private int mType;
    private Messenger mMessenger;

    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -121,29 +120,21 @@ public class CancelActivity extends Activity implements ServiceConnection {
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mMessenger = new Messenger(service);
    public void onServiceConnected(ComponentName name, IBinder binder) {
        VCardService service = ((VCardService.MyBinder) binder).getService();

        boolean callFinish = false;
        try {
            final CancelRequest request = new CancelRequest(mJobId, mDisplayName);
            mMessenger.send(Message.obtain(null, VCardService.MSG_CANCEL_REQUEST, request));
            callFinish = true;
        } catch (RemoteException e) {
            Log.e(LOG_TAG, "RemoteException is thrown when trying to send request");
            showDialog(R.id.dialog_cancel_failed);
            // finish() should be called from the Dialog
            service.handleCancelRequest(request, null);
        } finally {
            unbindService(this);
        }

        if (callFinish) {
        finish();
    }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mMessenger = null;
        // do nothing
    }
}
+12 −7
Original line number Diff line number Diff line
@@ -235,9 +235,11 @@ public class ExportProcessor extends ProcessorBase {
        final String tickerText =
                mService.getString(R.string.exporting_contact_list_title);
        final Notification notification =
                VCardService.constructProgressNotification(mService, VCardService.TYPE_EXPORT,
                        description, tickerText, mJobId, displayName, totalCount, currentCount);
        mNotificationManager.notify(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId, notification);
                NotificationImportExportListener.constructProgressNotification(mService,
                        VCardService.TYPE_EXPORT, description, tickerText, mJobId, displayName,
                        totalCount, currentCount);
        mNotificationManager.notify(NotificationImportExportListener.DEFAULT_NOTIFICATION_TAG,
                mJobId, notification);
    }

    private void doCancelNotification() {
@@ -245,16 +247,19 @@ public class ExportProcessor extends ProcessorBase {
        final String description = mService.getString(R.string.exporting_vcard_canceled_title,
                mExportRequest.destUri.getLastPathSegment());
        final Notification notification =
                VCardService.constructCancelNotification(mService, description);
        mNotificationManager.notify(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId, notification);
                NotificationImportExportListener.constructCancelNotification(mService, description);
        mNotificationManager.notify(NotificationImportExportListener.DEFAULT_NOTIFICATION_TAG,
                mJobId, notification);
    }

    private void doFinishNotification(final String title, final String description) {
        if (DEBUG) Log.d(LOG_TAG, "send finish notification: " + title + ", " + description);
        final Intent intent = new Intent(mService, PeopleActivity.class);
        final Notification notification =
                VCardService.constructFinishNotification(mService, title, description, intent);
        mNotificationManager.notify(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId, notification);
                NotificationImportExportListener.constructFinishNotification(mService, title,
                        description, intent);
        mNotificationManager.notify(NotificationImportExportListener.DEFAULT_NOTIFICATION_TAG,
                mJobId, notification);
    }

    @Override
+11 −27
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
     */
    private volatile boolean mProcessOngoing = true;

    private Messenger mOutgoingMessenger;
    private VCardService mService;
    private final Messenger mIncomingMessenger = new Messenger(new IncomingHandler());

    // Used temporarily when asking users to confirm the file name
@@ -138,10 +138,8 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
                }
                final ExportRequest request = new ExportRequest(mDestinationUri);
                // The connection object will call finish().
                if (trySend(Message.obtain(null, VCardService.MSG_EXPORT_REQUEST, request))) {
                    Log.i(LOG_TAG, "Successfully sent export request. Finish itself");
                    unbindAndFinish();
                }
                mService.handleExportRequest(request, new NotificationImportExportListener(
                        ExportVCardActivity.this));
            }
        }
    }
@@ -160,14 +158,16 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
            return;
        }

        if (startService(new Intent(this, VCardService.class)) == null) {
        Intent intent = new Intent(this, VCardService.class);

        if (startService(intent) == null) {
            Log.e(LOG_TAG, "Failed to start vCard service");
            mErrorReason = getString(R.string.fail_reason_unknown);
            showDialog(R.id.dialog_fail_to_export_with_reason);
            return;
        }

        if (!bindService(new Intent(this, VCardService.class), this, Context.BIND_AUTO_CREATE)) {
        if (!bindService(intent, this, Context.BIND_AUTO_CREATE)) {
            Log.e(LOG_TAG, "Failed to connect to vCard service.");
            mErrorReason = getString(R.string.fail_reason_unknown);
            showDialog(R.id.dialog_fail_to_export_with_reason);
@@ -176,14 +176,11 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
    }

    @Override
    public synchronized void onServiceConnected(ComponentName name, IBinder service) {
    public synchronized void onServiceConnected(ComponentName name, IBinder binder) {
        if (DEBUG) Log.d(LOG_TAG, "connected to service, requesting a destination file name");
        mConnected = true;
        mOutgoingMessenger = new Messenger(service);
        final Message message =
                Message.obtain(null, VCardService.MSG_REQUEST_AVAILABLE_EXPORT_DESTINATION);
        message.replyTo = mIncomingMessenger;
        trySend(message);
        mService = ((VCardService.MyBinder) binder).getService();
        mService.handleRequestAvailableExportDestination(mIncomingMessenger);
        // Wait until MSG_SET_AVAILABLE_EXPORT_DESTINATION message is available.
    }

@@ -191,7 +188,7 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
    @Override
    public synchronized void onServiceDisconnected(ComponentName name) {
        if (DEBUG) Log.d(LOG_TAG, "onServiceDisconnected()");
        mOutgoingMessenger = null;
        mService = null;
        mConnected = false;
        if (mProcessOngoing) {
            // Unexpected disconnect event.
@@ -267,19 +264,6 @@ public class ExportVCardActivity extends Activity implements ServiceConnection,
        }
    }

    private boolean trySend(Message message) {
        try {
            mOutgoingMessenger.send(message);
            return true;
        } catch (RemoteException e) {
            Log.e(LOG_TAG, "RemoteException is thrown when trying to send request");
            unbindService(this);
            mErrorReason = getString(R.string.fail_reason_unknown);
            showDialog(R.id.dialog_fail_to_export_with_reason);
            return false;
        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (DEBUG) Log.d(LOG_TAG, "ExportVCardActivity#onClick() is called");
+43 −65
Original line number Diff line number Diff line
@@ -15,9 +15,10 @@
 */
package com.android.contacts.vcard;

import com.android.contacts.R;
import com.android.vcard.VCardEntry;
import com.android.vcard.VCardEntryCommitter;
import com.android.vcard.VCardEntryConstructor;
import com.android.vcard.VCardEntryHandler;
import com.android.vcard.VCardInterpreter;
import com.android.vcard.VCardParser;
import com.android.vcard.VCardParser_V21;
@@ -28,14 +29,8 @@ import com.android.vcard.exception.VCardNotSupportedException;
import com.android.vcard.exception.VCardVersionException;

import android.accounts.Account;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.ContactsContract.RawContacts;
import android.util.Log;

import java.io.ByteArrayInputStream;
@@ -48,17 +43,15 @@ import java.util.List;
 * Class for processing one import request from a user. Dropped after importing requested Uri(s).
 * {@link VCardService} will create another object when there is another import request.
 */
public class ImportProcessor extends ProcessorBase {
public class ImportProcessor extends ProcessorBase implements VCardEntryHandler {
    private static final String LOG_TAG = "VCardImport";
    private static final boolean DEBUG = VCardService.DEBUG;

    private final VCardService mService;
    private final ContentResolver mResolver;
    private final NotificationManager mNotificationManager;
    private final ImportRequest mImportRequest;
    private final int mJobId;

    private final ImportProgressNotifier mNotifier;
    private final VCardImportExportListener mListener;

    // TODO: remove and show appropriate message instead.
    private final List<Uri> mFailedUris = new ArrayList<Uri>();
@@ -68,17 +61,35 @@ public class ImportProcessor extends ProcessorBase {
    private volatile boolean mCanceled;
    private volatile boolean mDone;

    public ImportProcessor(final VCardService service, final ImportRequest request,
            final int jobId) {
    private int mCurrentCount = 0;
    private int mTotalCount = 0;

    public ImportProcessor(final VCardService service, final VCardImportExportListener listener,
            final ImportRequest request, final int jobId) {
        mService = service;
        mResolver = mService.getContentResolver();
        mNotificationManager = (NotificationManager)
                mService.getSystemService(Context.NOTIFICATION_SERVICE);
        mListener = listener;

        mImportRequest = request;
        mJobId = jobId;
        mNotifier = new ImportProgressNotifier(service, mNotificationManager, jobId,
                request.displayName);
    }

    @Override
    public void onStart() {
        // do nothing
    }

    @Override
    public void onEnd() {
        // do nothing
    }

    @Override
    public void onEntryCreated(VCardEntry entry) {
        mCurrentCount++;
        if (mListener != null) {
            mListener.onImportParsed(mImportRequest, mJobId, entry, mCurrentCount, mTotalCount);
        }
    }

    @Override
@@ -92,8 +103,8 @@ public class ImportProcessor extends ProcessorBase {
        try {
            runInternal();

            if (isCancelled()) {
                doCancelNotification();
            if (isCancelled() && mListener != null) {
                mListener.onImportCanceled(mImportRequest, mJobId);
            }
        } catch (OutOfMemoryError e) {
            Log.e(LOG_TAG, "OutOfMemoryError thrown during import", e);
@@ -136,15 +147,13 @@ public class ImportProcessor extends ProcessorBase {
        final int estimatedVCardType = request.estimatedVCardType;
        final String estimatedCharset = request.estimatedCharset;
        final int entryCount = request.entryCount;
        mNotifier.addTotalCount(entryCount);
        mTotalCount += entryCount;

        final VCardEntryConstructor constructor =
                new VCardEntryConstructor(estimatedVCardType, account, estimatedCharset);
        final VCardEntryCommitter committer = new VCardEntryCommitter(mResolver);
        constructor.addEntryHandler(committer);
        if (!request.showImmediately) {
            constructor.addEntryHandler(mNotifier);
        }
        constructor.addEntryHandler(this);

        InputStream is = null;
        boolean successful = false;
@@ -184,15 +193,17 @@ public class ImportProcessor extends ProcessorBase {
            } else {
                Log.i(LOG_TAG, "Successfully finished importing one vCard file: " + uri);
                List<Uri> uris = committer.getCreatedUris();
                if (mListener != null) {
                    if (uris != null && uris.size() > 0) {
                        // TODO: construct intent showing a list of imported contact list.
                    doFinishNotification(uris.get(0));
                        mListener.onImportFinished(mImportRequest, mJobId, uris.get(0));
                    } else {
                        // Not critical, but suspicious.
                        Log.w(LOG_TAG,
                                "Created Uris is null or 0 length " +
                                "though the creation itself is successful.");
                    doFinishNotification(null);
                        mListener.onImportFinished(mImportRequest, mJobId, null);
                    }
                }
            }
        } else {
@@ -201,39 +212,6 @@ public class ImportProcessor extends ProcessorBase {
        }
    }

    private void doCancelNotification() {
        final String description = mService.getString(R.string.importing_vcard_canceled_title,
                mImportRequest.displayName);
        final Notification notification =
                VCardService.constructCancelNotification(mService, description);
        mNotificationManager.notify(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId, notification);
    }

    private void doFinishNotification(final Uri createdUri) {
        final String description = mService.getString(R.string.importing_vcard_finished_title,
                mImportRequest.displayName);
        final Intent intent;
        if (createdUri != null) {
            final long rawContactId = ContentUris.parseId(createdUri);
            final Uri contactUri = RawContacts.getContactLookupUri(
                    mResolver, ContentUris.withAppendedId(
                            RawContacts.CONTENT_URI, rawContactId));
            intent = new Intent(Intent.ACTION_VIEW, contactUri);
        } else {
            intent = null;
        }
        if (mImportRequest.showImmediately && (intent != null)) {
            mNotificationManager.cancel(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mService.startActivity(intent);
        } else {
            final Notification notification = VCardService.constructFinishNotification(mService,
                    description, null, intent);
            mNotificationManager.notify(VCardService.DEFAULT_NOTIFICATION_TAG, mJobId,
                    notification);
        }
    }

    private boolean readOneVCard(InputStream is, int vcardType, String charset,
            final VCardInterpreter interpreter,
            final int[] possibleVCardVersions) {
Loading