summaryrefslogtreecommitdiffstats
path: root/src/com/android/email/ControllerResultUiThreadWrapper.java
blob: 9a33b929fad10606dedf1454ddc50a328c17d5bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.email;

import com.android.email.Controller.Result;
import com.android.emailcommon.mail.MessagingException;

import java.util.ArrayList;

import android.os.Handler;

/**
 * A {@link Result} that wraps another {@link Result} and makes sure methods gets called back
 * on the UI thread.
 *
 * <p>Optionally it supports the "synchronous" mode, if you pass null for the {@code handler}
 * parameter, which allows unit tests to run synchronously.
 */
public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
    private final Handler mHandler;
    private final T mWrappee;

    public ControllerResultUiThreadWrapper(Handler handler, T wrappee) {
        mHandler = handler;
        mWrappee = wrappee;
    }

    public T getWrappee() {
        return mWrappee;
    }

    @Override
    protected void setRegistered(boolean registered) {
        super.setRegistered(registered);
        mWrappee.setRegistered(registered);
    }

    private void run(Runnable runnable) {
        if (mHandler == null) {
            runnable.run();
        } else {
            mHandler.post(runnable);
        }
    }

    @Override
    public void loadAttachmentCallback(final MessagingException result, final long accountId,
                final long messageId, final long attachmentId, final int progress) {
        run(new Runnable() {
            public void run() {
                /* It's possible this callback is unregistered after this Runnable was posted and
                 * sitting in the handler queue, so we always need to check if it's still registered
                 * on the UI thread.
                 */
                if (!isRegistered()) return;
                mWrappee.loadAttachmentCallback(result, accountId, messageId, attachmentId,
                        progress);
            }
        });
    }

    @Override
    public void loadMessageForViewCallback(final MessagingException result, final long accountId,
            final long messageId, final int progress) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.loadMessageForViewCallback(result, accountId, messageId, progress);
            }
        });
    }

    @Override
    public void sendMailCallback(final MessagingException result, final long accountId,
            final long messageId, final int progress) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.sendMailCallback(result, accountId, messageId, progress);
            }
        });
    }

    @Override
    public void serviceCheckMailCallback(final MessagingException result, final long accountId,
            final long mailboxId, final int progress, final long tag) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.serviceCheckMailCallback(result, accountId, mailboxId, progress, tag);
            }
        });
    }

    @Override
    public void updateMailboxCallback(final MessagingException result, final long accountId,
            final long mailboxId, final int progress, final int numNewMessages,
            final ArrayList<Long> addedMessages) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.updateMailboxCallback(result, accountId, mailboxId, progress,
                        numNewMessages, addedMessages);
            }
        });
    }

    @Override
    public void updateMailboxListCallback(final MessagingException result, final long accountId,
            final int progress) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.updateMailboxListCallback(result, accountId, progress);
            }
        });
    }

    @Override
    public void deleteAccountCallback(final long accountId) {
        run(new Runnable() {
            public void run() {
                if (!isRegistered()) return;
                mWrappee.deleteAccountCallback(accountId);
            }
        });
    }
}