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}