122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie/*
222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * Copyright (C) 2007 Google Inc.
322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie *
422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * Licensed under the Apache License, Version 2.0 (the "License");
522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * you may not use this file except in compliance with the License.
622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * You may obtain a copy of the License at
722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie *
822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie *      http://www.apache.org/licenses/LICENSE-2.0
922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie *
1022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * Unless required by applicable law or agreed to in writing, software
1122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * distributed under the License is distributed on an "AS IS" BASIS,
1222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * See the License for the specific language governing permissions and
1422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * limitations under the License.
1522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie */
1622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
1722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiepackage com.android.internal.app;
1822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
1922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.app.AlertDialog;
2022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.content.BroadcastReceiver;
2122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.content.Context;
2222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.content.DialogInterface;
2322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.content.Intent;
2422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.content.IntentFilter;
2522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.os.Bundle;
267adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shinimport android.os.Handler;
277adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shinimport android.os.Message;
2822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.widget.Toast;
2922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.util.Log;
3022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.location.LocationManager;
31dea74b0285ef946cceb4f56e576800cbedbc3a95Hakan Gustavsson
32dea74b0285ef946cceb4f56e576800cbedbc3a95Hakan Gustavssonimport com.android.internal.R;
3322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport com.android.internal.location.GpsNetInitiatedHandler;
3422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
3522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie/**
3622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * This activity is shown to the user for him/her to accept or deny network-initiated
3722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * requests. It uses the alert dialog style. It will be launched from a notification.
3822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie */
3922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiepublic class NetInitiatedActivity extends AlertActivity implements DialogInterface.OnClickListener {
4022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
4122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private static final String TAG = "NetInitiatedActivity";
4222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
4322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private static final boolean DEBUG = true;
4422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private static final boolean VERBOSE = false;
4522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
46746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer    private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE;
47746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer    private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE;
4822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
497adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    private static final int GPS_NO_RESPONSE_TIME_OUT = 1;
5022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    // Received ID from intent, -1 when no notification is in progress
5122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private int notificationId = -1;
527adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    private int timeout = -1;
537adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    private int default_response = -1;
547adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    private int default_response_timeout = 6;
5522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
5622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    /** Used to detect when NI request is received */
5722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private BroadcastReceiver mNetInitiatedReceiver = new BroadcastReceiver() {
5822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        @Override
5922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        public void onReceive(Context context, Intent intent) {
6022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            if (DEBUG) Log.d(TAG, "NetInitiatedReceiver onReceive: " + intent.getAction());
6122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            if (intent.getAction() == GpsNetInitiatedHandler.ACTION_NI_VERIFY) {
6222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie                handleNIVerify(intent);
6322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            }
6422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        }
6522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    };
6622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
677adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    private final Handler mHandler = new Handler() {
687adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        public void handleMessage(Message msg) {
697adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            switch (msg.what) {
707adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            case GPS_NO_RESPONSE_TIME_OUT: {
717adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin                if (notificationId != -1) {
727adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin                    sendUserResponse(default_response);
737adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin                }
747adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin                finish();
757adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            }
767adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            break;
777adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            default:
787adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin            }
797adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        }
807adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin    };
817adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin
8222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    @Override
8322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    protected void onCreate(Bundle savedInstanceState) {
8422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        super.onCreate(savedInstanceState);
8522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
8622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        // Set up the "dialog"
8722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        final Intent intent = getIntent();
8822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        final AlertController.AlertParams p = mAlertParams;
89dea74b0285ef946cceb4f56e576800cbedbc3a95Hakan Gustavsson        Context context = getApplicationContext();
9022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        p.mTitle = intent.getStringExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_TITLE);
9122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        p.mMessage = intent.getStringExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_MESSAGE);
92dea74b0285ef946cceb4f56e576800cbedbc3a95Hakan Gustavsson        p.mPositiveButtonText = String.format(context.getString(R.string.gpsVerifYes));
9322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        p.mPositiveButtonListener = this;
94dea74b0285ef946cceb4f56e576800cbedbc3a95Hakan Gustavsson        p.mNegativeButtonText = String.format(context.getString(R.string.gpsVerifNo));
9522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        p.mNegativeButtonListener = this;
9622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
9722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        notificationId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1);
987adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        timeout = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_TIMEOUT, default_response_timeout);
997adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        default_response = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_DEFAULT_RESPONSE, GpsNetInitiatedHandler.GPS_NI_RESPONSE_ACCEPT);
1007adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        if (DEBUG) Log.d(TAG, "onCreate() : notificationId: " + notificationId + " timeout: " + timeout + " default_response:" + default_response);
10122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
1027adcdecf808fce832b8711aeeeb30b73371ee4aeAlexy Shin        mHandler.sendMessageDelayed(mHandler.obtainMessage(GPS_NO_RESPONSE_TIME_OUT), (timeout * 1000));
10322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        setupAlert();
10422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
10522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
10622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    @Override
10722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    protected void onResume() {
10822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        super.onResume();
10922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (DEBUG) Log.d(TAG, "onResume");
11022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        registerReceiver(mNetInitiatedReceiver, new IntentFilter(GpsNetInitiatedHandler.ACTION_NI_VERIFY));
11122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
11222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
11322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    @Override
11422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    protected void onPause() {
11522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        super.onPause();
11622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (DEBUG) Log.d(TAG, "onPause");
11722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        unregisterReceiver(mNetInitiatedReceiver);
11822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
11922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
12022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    /**
12122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie     * {@inheritDoc}
12222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie     */
12322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    public void onClick(DialogInterface dialog, int which) {
12422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (which == POSITIVE_BUTTON) {
12522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            sendUserResponse(GpsNetInitiatedHandler.GPS_NI_RESPONSE_ACCEPT);
12622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        }
12722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (which == NEGATIVE_BUTTON) {
12822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            sendUserResponse(GpsNetInitiatedHandler.GPS_NI_RESPONSE_DENY);
12922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        }
13022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
13122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        // No matter what, finish the activity
13222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        finish();
13322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        notificationId = -1;
13422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
13522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
13630f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang    // Respond to NI Handler under GnssLocationProvider, 1 = accept, 2 = deny
13722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private void sendUserResponse(int response) {
13822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (DEBUG) Log.d(TAG, "sendUserResponse, response: " + response);
13922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        LocationManager locationManager = (LocationManager)
14022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie            this.getSystemService(Context.LOCATION_SERVICE);
14122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        locationManager.sendNiResponse(notificationId, response);
14222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
14322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
14422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private void handleNIVerify(Intent intent) {
14522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        int notifId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1);
14622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        notificationId = notifId;
14722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
14822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        if (DEBUG) Log.d(TAG, "handleNIVerify action: " + intent.getAction());
14922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
15022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie
15122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    private void showNIError() {
15222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie        Toast.makeText(this, "NI error" /* com.android.internal.R.string.usb_storage_error_message */,
15322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie                Toast.LENGTH_LONG).show();
15422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie    }
15522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie}
156