1 package com.android.providers.downloads; 2 3 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; 4 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; 5 6 import static org.mockito.ArgumentMatchers.any; 7 import static org.mockito.Mockito.mock; 8 import static org.mockito.Mockito.when; 9 10 import android.app.job.JobParameters; 11 import android.content.Context; 12 import android.content.Intent; 13 import android.content.pm.PackageManager.NameNotFoundException; 14 import android.net.ConnectivityManager; 15 import android.net.Network; 16 import android.net.NetworkCapabilities; 17 import android.net.NetworkInfo; 18 import android.net.NetworkInfo.DetailedState; 19 import android.os.Bundle; 20 21 import org.mockito.invocation.InvocationOnMock; 22 import org.mockito.stubbing.Answer; 23 24 import java.io.IOException; 25 import java.net.URL; 26 import java.net.URLConnection; 27 import java.security.GeneralSecurityException; 28 import java.util.ArrayList; 29 import java.util.List; 30 31 import javax.net.ssl.SSLContext; 32 33 public class FakeSystemFacade implements SystemFacade { 34 long mTimeMillis = 0; 35 Integer mActiveNetworkType = ConnectivityManager.TYPE_WIFI; 36 boolean mIsRoaming = false; 37 boolean mIsMetered = false; 38 long mMaxBytesOverMobile = Long.MAX_VALUE; 39 long mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; 40 List<Intent> mBroadcastsSent = new ArrayList<Intent>(); 41 Bundle mLastBroadcastOptions; 42 boolean mCleartextTrafficPermitted = true; 43 private boolean mReturnActualTime = false; 44 private SSLContext mSSLContext = null; 45 setUp()46 public void setUp() { 47 mTimeMillis = 0; 48 mActiveNetworkType = ConnectivityManager.TYPE_WIFI; 49 mIsRoaming = false; 50 mIsMetered = false; 51 mMaxBytesOverMobile = Long.MAX_VALUE; 52 mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; 53 mBroadcastsSent.clear(); 54 mLastBroadcastOptions = null; 55 mReturnActualTime = false; 56 try { 57 mSSLContext = SSLContext.getDefault(); 58 } catch (GeneralSecurityException e) { 59 throw new RuntimeException(e); 60 } 61 } 62 incrementTimeMillis(long delta)63 void incrementTimeMillis(long delta) { 64 mTimeMillis += delta; 65 } 66 67 @Override currentTimeMillis()68 public long currentTimeMillis() { 69 if (mReturnActualTime) { 70 return System.currentTimeMillis(); 71 } 72 return mTimeMillis; 73 } 74 75 @Override getNetwork(JobParameters params)76 public Network getNetwork(JobParameters params) { 77 if (mActiveNetworkType == null) { 78 return null; 79 } else { 80 final Network network = mock(Network.class); 81 try { 82 when(network.openConnection(any())).then(new Answer<URLConnection>() { 83 @Override 84 public URLConnection answer(InvocationOnMock invocation) throws Throwable { 85 final URL url = (URL) invocation.getArguments()[0]; 86 return url.openConnection(); 87 } 88 }); 89 } catch (IOException ignored) { 90 } 91 return network; 92 } 93 } 94 95 @Override getNetworkCapabilities(Network network)96 public NetworkCapabilities getNetworkCapabilities(Network network) { 97 if (mActiveNetworkType == null) { 98 return null; 99 } else { 100 final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder(); 101 if (!mIsMetered) builder.addCapability(NET_CAPABILITY_NOT_METERED); 102 if (!mIsRoaming) builder.addCapability(NET_CAPABILITY_NOT_ROAMING); 103 return builder.build(); 104 } 105 } 106 107 @Override getMaxBytesOverMobile()108 public long getMaxBytesOverMobile() { 109 return mMaxBytesOverMobile; 110 } 111 112 @Override getRecommendedMaxBytesOverMobile()113 public long getRecommendedMaxBytesOverMobile() { 114 return mRecommendedMaxBytesOverMobile; 115 } 116 117 @Override sendBroadcast(Intent intent)118 public void sendBroadcast(Intent intent) { 119 mBroadcastsSent.add(intent); 120 mLastBroadcastOptions = null; 121 } 122 123 @Override sendBroadcast(Intent intent, String receiverPermission, Bundle options)124 public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { 125 mBroadcastsSent.add(intent); 126 mLastBroadcastOptions = options; 127 } 128 129 @Override userOwnsPackage(int uid, String pckg)130 public boolean userOwnsPackage(int uid, String pckg) throws NameNotFoundException { 131 return true; 132 } 133 134 @Override isCleartextTrafficPermitted(String packageName, String hostname)135 public boolean isCleartextTrafficPermitted(String packageName, String hostname) { 136 return mCleartextTrafficPermitted; 137 } 138 139 @Override getSSLContextForPackage(Context context, String pckg)140 public SSLContext getSSLContextForPackage(Context context, String pckg) { 141 return mSSLContext; 142 } 143 setSSLContext(SSLContext context)144 public void setSSLContext(SSLContext context) { 145 mSSLContext = context; 146 } 147 setReturnActualTime(boolean flag)148 public void setReturnActualTime(boolean flag) { 149 mReturnActualTime = flag; 150 } 151 } 152