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