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