aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java
blob: e016921f78d6b50b20032b37dd6445fafacd7ed9 (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
package cgeo.geocaching.settings;

import cgeo.geocaching.R;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RxUtils;

import ch.boye.httpclientandroidlib.HttpResponse;

import org.apache.commons.lang3.StringUtils;

import rx.Observable;
import rx.android.app.AppObservable;
import rx.functions.Action1;
import rx.functions.Func0;

import android.app.ProgressDialog;
import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;

public class RegisterSend2CgeoPreference extends AbstractClickablePreference {

    public RegisterSend2CgeoPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RegisterSend2CgeoPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected OnPreferenceClickListener getOnPreferenceClickListener(final SettingsActivity activity) {
        return new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                // satisfy static code analysis
                if (activity == null) {
                    return true;
                }

                final String deviceName = Settings.getWebDeviceName();
                final String deviceCode = Settings.getWebDeviceCode();

                if (StringUtils.isBlank(deviceName)) {
                    ActivityMixin.showToast(activity, R.string.err_missing_device_name);
                    return false;
                }

                final ProgressDialog progressDialog = ProgressDialog.show(activity,
                        activity.getString(R.string.init_sendToCgeo),
                        activity.getString(R.string.init_sendToCgeo_registering), true);
                progressDialog.setCancelable(false);

                AppObservable.bindActivity(activity, Observable.defer(new Func0<Observable<Integer>>() {
                    @Override
                    public Observable<Integer> call() {
                        final String nam = StringUtils.defaultString(deviceName);
                        final String cod = StringUtils.defaultString(deviceCode);

                        final Parameters params = new Parameters("name", nam, "code", cod);
                        HttpResponse response = Network.getRequest("http://send2.cgeo.org/auth.html", params);

                        if (response != null && response.getStatusLine().getStatusCode() == 200) {
                            //response was OK
                            final String[] strings = StringUtils.split(Network.getResponseData(response), ',');
                            if (strings != null) {
                                Settings.setWebNameCode(nam, strings[0]);
                                try {
                                    return Observable.just(Integer.parseInt(strings[1].trim()));
                                } catch (final Exception e) {
                                    Log.e("RegisterSend2CgeoPreference", e);
                                }
                            }
                        }

                        return Observable.empty();
                    }
                }).firstOrDefault(0)).subscribeOn(RxUtils.networkScheduler).subscribe(new Action1<Integer>() {
                    @Override
                    public void call(final Integer pin) {
                        progressDialog.dismiss();
                        if (pin > 0) {
                            Dialogs.message(activity, R.string.init_sendToCgeo,
                                    activity.getString(R.string.init_sendToCgeo_register_ok)
                                            .replace("####", String.valueOf(pin)));
                        } else {
                            Dialogs.message(activity, R.string.init_sendToCgeo, R.string.init_sendToCgeo_register_fail);
                        }
                    }
                });

                return true;
            }
        };
    }

}