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; 2622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.widget.Toast; 2722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.util.Log; 2822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport android.location.LocationManager; 2922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xieimport com.android.internal.location.GpsNetInitiatedHandler; 3022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 3122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie/** 3222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * This activity is shown to the user for him/her to accept or deny network-initiated 3322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * requests. It uses the alert dialog style. It will be launched from a notification. 3422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie */ 3522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xiepublic class NetInitiatedActivity extends AlertActivity implements DialogInterface.OnClickListener { 3622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 3722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private static final String TAG = "NetInitiatedActivity"; 3822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 3922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private static final boolean DEBUG = true; 4022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private static final boolean VERBOSE = false; 4122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 42746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE; 43746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE; 4422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 4522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie // Dialog button text 4622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie public static final String BUTTON_TEXT_ACCEPT = "Accept"; 4722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie public static final String BUTTON_TEXT_DENY = "Deny"; 4822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 4922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie // Received ID from intent, -1 when no notification is in progress 5022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private int notificationId = -1; 5122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 5222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie /** Used to detect when NI request is received */ 5322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private BroadcastReceiver mNetInitiatedReceiver = new BroadcastReceiver() { 5422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie @Override 5522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie public void onReceive(Context context, Intent intent) { 5622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "NetInitiatedReceiver onReceive: " + intent.getAction()); 5722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (intent.getAction() == GpsNetInitiatedHandler.ACTION_NI_VERIFY) { 5822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie handleNIVerify(intent); 5922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 6022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 6122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie }; 6222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 6322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie @Override 6422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie protected void onCreate(Bundle savedInstanceState) { 6522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie super.onCreate(savedInstanceState); 6622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 6722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie // Set up the "dialog" 6822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie final Intent intent = getIntent(); 6922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie final AlertController.AlertParams p = mAlertParams; 7022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mIconId = com.android.internal.R.drawable.ic_dialog_usb; 7122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mTitle = intent.getStringExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_TITLE); 7222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mMessage = intent.getStringExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_MESSAGE); 7322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mPositiveButtonText = BUTTON_TEXT_ACCEPT; 7422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mPositiveButtonListener = this; 7522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mNegativeButtonText = BUTTON_TEXT_DENY; 7622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie p.mNegativeButtonListener = this; 7722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 7822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie notificationId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1); 7922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "onCreate, notifId: " + notificationId); 8022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 8122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie setupAlert(); 8222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 8322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 8422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie @Override 8522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie protected void onResume() { 8622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie super.onResume(); 8722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "onResume"); 8822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie registerReceiver(mNetInitiatedReceiver, new IntentFilter(GpsNetInitiatedHandler.ACTION_NI_VERIFY)); 8922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 9022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 9122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie @Override 9222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie protected void onPause() { 9322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie super.onPause(); 9422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "onPause"); 9522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie unregisterReceiver(mNetInitiatedReceiver); 9622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 9722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 9822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie /** 9922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie * {@inheritDoc} 10022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie */ 10122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie public void onClick(DialogInterface dialog, int which) { 10222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (which == POSITIVE_BUTTON) { 10322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie sendUserResponse(GpsNetInitiatedHandler.GPS_NI_RESPONSE_ACCEPT); 10422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 10522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (which == NEGATIVE_BUTTON) { 10622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie sendUserResponse(GpsNetInitiatedHandler.GPS_NI_RESPONSE_DENY); 10722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 10822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 10922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie // No matter what, finish the activity 11022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie finish(); 11122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie notificationId = -1; 11222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 11322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 11422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie // Respond to NI Handler under GpsLocationProvider, 1 = accept, 2 = deny 11522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private void sendUserResponse(int response) { 11622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "sendUserResponse, response: " + response); 11722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie LocationManager locationManager = (LocationManager) 11822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie this.getSystemService(Context.LOCATION_SERVICE); 11922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie locationManager.sendNiResponse(notificationId, response); 12022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 12122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 12222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private void handleNIVerify(Intent intent) { 12322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie int notifId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1); 12422d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie notificationId = notifId; 12522d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 12622d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie if (DEBUG) Log.d(TAG, "handleNIVerify action: " + intent.getAction()); 12722d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 12822d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie 12922d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie private void showNIError() { 13022d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie Toast.makeText(this, "NI error" /* com.android.internal.R.string.usb_storage_error_message */, 13122d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie Toast.LENGTH_LONG).show(); 13222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 13322d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie} 134