1686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka/*
2686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * Copyright (C) 2017 The Android Open Source Project
3686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka *
4686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
5686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * you may not use this file except in compliance with the License.
6686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * You may obtain a copy of the License at
7686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka *
8686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
9686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka *
10686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * Unless required by applicable law or agreed to in writing, software
11686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
12686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * See the License for the specific language governing permissions and
14686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka * limitations under the License.
15686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka */
16686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
17686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankapackage com.android.servicestests.apps.conntestapp;
18686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
19686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.app.Activity;
20686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.content.BroadcastReceiver;
21686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.content.Context;
22686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.content.Intent;
23686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.content.IntentFilter;
24b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shankaimport android.net.INetworkPolicyManager;
25686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.os.AsyncTask;
26686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.os.Bundle;
27b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shankaimport android.os.INetworkManagementService;
28b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shankaimport android.os.Process;
29686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.os.RemoteException;
30b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shankaimport android.os.ServiceManager;
31686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport android.util.Log;
32686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
33734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shankaimport com.android.internal.annotations.GuardedBy;
34686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankaimport com.android.servicestests.aidl.INetworkStateObserver;
35686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
36686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shankapublic class ConnTestActivity extends Activity {
37686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private static final String TAG = ConnTestActivity.class.getSimpleName();
38686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
39686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private static final String TEST_PKG = ConnTestActivity.class.getPackage().getName();
40686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private static final String ACTION_FINISH_ACTIVITY = TEST_PKG + ".FINISH";
41686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private static final String EXTRA_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer";
42686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
43734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    private static final Object INSTANCE_LOCK = new Object();
44734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    @GuardedBy("instanceLock")
45734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    private static Activity sInstance;
46734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka
47686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private BroadcastReceiver finishCommandReceiver = null;
48686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
49686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    @Override
50686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    public void onCreate(Bundle savedInstanceState) {
51686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        super.onCreate(savedInstanceState);
52734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        synchronized (INSTANCE_LOCK) {
53734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka            sInstance = this;
54734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        }
55734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        Log.i(TAG, "onCreate called");
56686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
57686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        notifyNetworkStateObserver();
58686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
59686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        finishCommandReceiver = new BroadcastReceiver() {
60686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            @Override
61686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            public void onReceive(Context context, Intent intent) {
62734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka                Log.i(TAG, "finish command received");
63686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                ConnTestActivity.this.finish();
64686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            }
65686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        };
66686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        registerReceiver(finishCommandReceiver, new IntentFilter(ACTION_FINISH_ACTIVITY));
67686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    }
68686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
69686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    @Override
70734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    public void onResume() {
71734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        super.onResume();
72734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        Log.i(TAG, "onResume called");
73734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    }
74734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka
75734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    @Override
76686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    public void onStop() {
77734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        Log.i(TAG, "onStop called");
78686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        if (finishCommandReceiver != null) {
79686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            unregisterReceiver(finishCommandReceiver);
80686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        }
81686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        super.onStop();
82686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    }
83686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
84734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    @Override
85734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    public void finish() {
86734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        synchronized (INSTANCE_LOCK) {
87734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka            sInstance = null;
88734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        }
89734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        Log.i(TAG, "finish called");
90734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        super.finish();
91734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    }
92734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka
93734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    public static void finishSelf() {
94734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        synchronized (INSTANCE_LOCK) {
95734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka            if (sInstance != null) {
96734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka                sInstance.finish();
97734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka            }
98734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka        }
99734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka    }
100734b0b716325e55700bb99e99bbb0f170edf65bcSudheer Shanka
101686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    private void notifyNetworkStateObserver() {
102686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        if (getIntent() == null) {
103686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            return;
104686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        }
105686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
106686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        final Bundle extras = getIntent().getExtras();
107686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        if (extras == null) {
108686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            return;
109686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        }
110686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        final INetworkStateObserver observer = INetworkStateObserver.Stub.asInterface(
111686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                extras.getBinder(EXTRA_NETWORK_STATE_OBSERVER));
112686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        if (observer != null) {
113686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            AsyncTask.execute(() -> {
114686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                try {
115b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka                    observer.onNetworkStateChecked(checkNetworkStatus());
116686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                } catch (RemoteException e) {
117686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                    Log.e(TAG, "Error occured while notifying the observer: " + e);
118686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka                }
119686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka            });
120686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        }
121686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    }
122686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka
123686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    /**
124b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka     * Checks whether the network is restricted.
125686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka     *
126b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka     * @return null if network is not restricted, otherwise an error message.
127686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka     */
128b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka    private String checkNetworkStatus() {
129b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka        final INetworkManagementService nms = INetworkManagementService.Stub.asInterface(
130b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka                ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
131b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka        final INetworkPolicyManager npms = INetworkPolicyManager.Stub.asInterface(
132b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka                ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
133686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        try {
134b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            final boolean restrictedByFwRules = nms.isNetworkRestricted(Process.myUid());
135b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            final boolean restrictedByUidRules = npms.isUidNetworkingBlocked(Process.myUid(), true);
136b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            if (restrictedByFwRules || restrictedByUidRules) {
137b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka                return "Network is restricted by fwRules: " + restrictedByFwRules
138b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka                        + " and uidRules: " + restrictedByUidRules;
139b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            }
140b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            return null;
141b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka        } catch (RemoteException e) {
142b8f2316fb457861ca6cb31575eaa2e985358dd8bSudheer Shanka            return "Error talking to system server: " + e;
143686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka        }
144686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka    }
145686bb2d337517b0b3f4ff4a6062c84a3ee730307Sudheer Shanka}