summaryrefslogtreecommitdiffstats
path: root/info_lookup/src/com/cyanogen/lookup/phonenumber/LookupHandlerThread.java
blob: 01b479eadcc81ea4d97c59859920278c5c4d17bb (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
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!");
        }
    }

    @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;
    }
}