summaryrefslogtreecommitdiffstats
path: root/info_lookup/src/com/cyanogen/lookup/phonenumber/LookupHandlerThread.java
blob: fed2126a3df0006073619146b8d6318de1610786 (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
package com.cyanogen.lookup.phonenumber;

import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import com.cyanogen.lookup.phonenumber.provider.LookupProviderImpl;
import com.cyanogen.lookup.phonenumber.request.LookupRequest;

import java.util.HashSet;

public class LookupHandlerThread extends HandlerThread implements Handler.Callback {

    private static final int MSG_FETCH_INFO = 0;
    private static final int MSG_MARK_AS_SPAM = 1;
    private static final String TAG = LookupHandlerThread.class.getSimpleName();

    private Context mContext;
    private Handler mHandler;
    private LookupProviderImpl mLookupProvider;
    private HashSet<LookupRequest> mSubmittedRequests;
    private boolean mInitialized = false;

    public LookupHandlerThread(String name, Context ctx) {
        super(name);
        mContext = ctx;
        mLookupProvider = new LookupProviderImpl(mContext, null);
    }

    public LookupHandlerThread(String name, int priority, Context ctx) {
        super(name, priority);
        mContext = ctx;
        mLookupProvider = new LookupProviderImpl(mContext, null);
    }

    public boolean initialize() {
        if (mInitialized) {
            return true;
        }

        mInitialized = mLookupProvider.initialize();
        if (mInitialized) {
            mSubmittedRequests = new HashSet<>();
            start();
            mHandler = new Handler(getLooper(), this);
        } else {
            Log.w(TAG, "Failed to initialize!");
        }

        return mInitialized;
    }

    public boolean isProviderEnabled() {
        return mLookupProvider.isEnabled();
    }

    public void tearDown() {
        if (mInitialized) {
            quit();
            mLookupProvider.disable();
            mInitialized = false;
        }
    }

    public boolean fetchInfoForPhoneNumber(LookupRequest lookupRequest) {
        if (!mSubmittedRequests.contains(lookupRequest)) {
            Message msg = mHandler.obtainMessage(MSG_FETCH_INFO);
            msg.obj = lookupRequest;
            boolean requested = mHandler.sendMessage(msg);
            if (requested) {
                mSubmittedRequests.add(lookupRequest);
            }
            return requested;
        }

        return false;
    }

    /**
     * Posts a message to {@link #mHandler} which later dispatches a request to the provider
     * implementation that knows how to mark a phone number as spam
     *
     * @param phoneNumber {@link String}
     */
    public void markAsSpam(String phoneNumber) {
        if (TextUtils.isEmpty(phoneNumber)) {
            return;
        }
        if (mHandler != null) {
            Message msg = mHandler.obtainMessage(MSG_MARK_AS_SPAM);
            msg.obj = phoneNumber;
            mHandler.sendMessage(msg);
        } else {
            Log.w(TAG, "No handler!");
        }
    }

    /**
     * Check if the provider supports spam reporting
     *
     * @return {@link Boolean}
     */
    public boolean hasSpamReporting() {
        return mLookupProvider.hasSpamReporting();
    }

    /**
     * Get the display name of the provider
     *
     * @return {@link String}
     */
    public String getProviderName() {
        return mLookupProvider.getDisplayName();
    }

    @Override
    public boolean handleMessage(Message msg) {
        int what = msg.what;
        switch (what) {
            case MSG_FETCH_INFO :
                if (mInitialized) {
                    mLookupProvider.fetchInfo((LookupRequest) msg.obj);
                }
                break;
            case MSG_MARK_AS_SPAM :
                if (mInitialized) {
                    mLookupProvider.markAsSpam((String) msg.obj);
                }
                break;
        }
        return true;
    }
}