17e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei/* 27e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * Copyright (C) 2017 The Android Open Source Project 37e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * 47e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 57e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * except in compliance with the License. You may obtain a copy of the License at 67e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * 77e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * http://www.apache.org/licenses/LICENSE-2.0 87e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * 97e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * Unless required by applicable law or agreed to in writing, software distributed under the 107e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 117e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * KIND, either express or implied. See the License for the specific language governing 127e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei * permissions and limitations under the License. 137e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei */ 147e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei 157e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyuleipackage com.android.settings.anomaly.tester; 167e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei 177e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyuleiimport android.app.Activity; 189d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.content.Intent; 197e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyuleiimport android.os.Bundle; 209d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.os.Handler; 219d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.os.ResultReceiver; 229d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.provider.Settings; 239d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.util.Log; 24693fe62fe09b24b5f9895e7a11d289db8f013964jackqdyuleiimport android.view.View; 259d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.widget.Button; 269d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.widget.EditText; 279d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport android.widget.Toast; 287e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei 299d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport com.android.settings.anomaly.tester.service.AnomalyService; 309d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport com.android.settings.anomaly.tester.utils.AnomalyActions; 319d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyuleiimport com.android.settings.anomaly.tester.utils.AnomalyPolicyBuilder; 329d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 339d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei/** 349d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei * Main activity to control and start anomaly 359d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei */ 367e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyuleipublic class AnomalyActivity extends Activity { 379d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei private static final String TAG = AnomalyActivity.class.getSimpleName(); 389d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 399d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei public static final String KEY_TARGET_BUTTON = "target_button"; 409d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 419d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei private AnomalyResultReceiver mResultReceiver; 427e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei 437e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei @Override 447e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei protected void onCreate(Bundle savedInstanceState) { 457e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei super.onCreate(savedInstanceState); 467e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei setContentView(R.layout.activity_main); 479d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei mResultReceiver = new AnomalyResultReceiver(new Handler()); 487e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei } 49693fe62fe09b24b5f9895e7a11d289db8f013964jackqdyulei 50693fe62fe09b24b5f9895e7a11d289db8f013964jackqdyulei public void startBluetoothAnomaly(View view) { 519d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei try { 529d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei // Enable anomaly detection and change the threshold 539d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei final String config = new AnomalyPolicyBuilder() 549d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_ANOMALY_DETECTION_ENABLED, true) 559d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, true) 569d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_BLUETOOTH_SCAN_THRESHOLD, 579d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei getValueFromEditText(R.id.bluetooth_threshold)) 589d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei .build(); 599d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei Settings.Global.putString(getContentResolver(), 609d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei Settings.Global.ANOMALY_DETECTION_CONSTANTS, config); 619d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 629d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei // Start the anomaly service 639d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei Intent intent = new Intent(this, AnomalyService.class); 649d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei intent.putExtra(AnomalyActions.KEY_ACTION, AnomalyActions.ACTION_BLE_SCAN_UNOPTIMIZED); 659d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei intent.putExtra(AnomalyActions.KEY_DURATION_MS, 669d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei getValueFromEditText(R.id.bluetooth_run_time)); 679d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei intent.putExtra(AnomalyActions.KEY_RESULT_RECEIVER, mResultReceiver); 689d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei intent.putExtra(KEY_TARGET_BUTTON, view.getId()); 699d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei startService(intent); 709d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 719d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei view.setEnabled(false); 729d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } catch (NumberFormatException e) { 739d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show(); 740cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei } 750cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei } 760cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei 770cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei public void startWakelockAnomaly(View view) { 780cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei try { 790cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei // Enable anomaly detection and change the threshold 800cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei final String config = new AnomalyPolicyBuilder() 810cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_ANOMALY_DETECTION_ENABLED, true) 820cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_WAKELOCK_DETECTION_ENABLED, true) 830cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei .addPolicy(AnomalyPolicyBuilder.KEY_WAKELOCK_THRESHOLD, 840cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei getValueFromEditText(R.id.wakelock_threshold)) 850cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei .build(); 860cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei Settings.Global.putString(getContentResolver(), 870cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei Settings.Global.ANOMALY_DETECTION_CONSTANTS, 880cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei config); 890cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei 900cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei // Start the anomaly service 910cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei Intent intent = new Intent(this, AnomalyService.class); 920cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei intent.putExtra(AnomalyActions.KEY_ACTION, AnomalyActions.ACTION_WAKE_LOCK); 930cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei intent.putExtra(AnomalyActions.KEY_DURATION_MS, 940cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei getValueFromEditText(R.id.wakelock_run_time)); 950cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei intent.putExtra(AnomalyActions.KEY_RESULT_RECEIVER, mResultReceiver); 960cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei intent.putExtra(KEY_TARGET_BUTTON, view.getId()); 970cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei startService(intent); 980cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei 990cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei view.setEnabled(false); 1000cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei } catch (NumberFormatException e) { 1010cc62f860c22d7d0b82716732429e97a3d13361bjackqdyulei Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show(); 1029d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1039d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1049d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1059d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei private long getValueFromEditText(final int id) throws NumberFormatException { 1069d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei final EditText editText = findViewById(id); 1079d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei if (editText != null) { 1089d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei final long value = Long.parseLong(editText.getText().toString()); 1099d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei if (value > 0) { 1109d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei return value; 1119d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1129d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1139d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1149d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei throw new NumberFormatException("Number should be positive"); 1159d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1169d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1179d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei private class AnomalyResultReceiver extends ResultReceiver { 1189d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1199d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei public AnomalyResultReceiver(Handler handler) { 1209d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei super(handler); 1219d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1229d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1239d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei @Override 1249d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei protected void onReceiveResult(int resultCode, Bundle resultData) { 1259d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei super.onReceiveResult(resultCode, resultData); 1269d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1279d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei final Button button = findViewById(resultData.getInt(KEY_TARGET_BUTTON)); 1289d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei if (button != null) { 1299d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei button.setEnabled(true); 1309d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 1319d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei 1329d78df0d301e54fe26fdcd363ddbe70915da8adajackqdyulei } 133693fe62fe09b24b5f9895e7a11d289db8f013964jackqdyulei } 1347e97d2d9a50b2083ba561f932e0c1e727e7fa233jackqdyulei} 135