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 44 boolean hasPerDomainConfig = false; 45 46 private boolean mReturnActualTime = false; 47 private SSLContext mSSLContext = null; 48 setUp()49 public void setUp() { 50 mTimeMillis = 0; 51 mActiveNetworkType = ConnectivityManager.TYPE_WIFI; 52 mIsRoaming = false; 53 mIsMetered = false; 54 mMaxBytesOverMobile = Long.MAX_VALUE; 55 mRecommendedMaxBytesOverMobile = Long.MAX_VALUE; 56 mBroadcastsSent.clear(); 57 mLastBroadcastOptions = null; 58 mReturnActualTime = false; 59 try { 60 mSSLContext = SSLContext.getDefault(); 61 } catch (GeneralSecurityException e) { 62 throw new RuntimeException(e); 63 } 64 } 65 incrementTimeMillis(long delta)66 void incrementTimeMillis(long delta) { 67 mTimeMillis += delta; 68 } 69 70 @Override currentTimeMillis()71 public long currentTimeMillis() { 72 if (mReturnActualTime) { 73 return System.currentTimeMillis(); 74 } 75 return mTimeMillis; 76 } 77 78 @Override getNetwork(JobParameters params)79 public Network getNetwork(JobParameters params) { 80 if (mActiveNetworkType == null) { 81 return null; 82 } else { 83 final Network network = mock(Network.class); 84 try { 85 when(network.openConnection(any())).then(new Answer<URLConnection>() { 86 @Override 87 public URLConnection answer(InvocationOnMock invocation) throws Throwable { 88 final URL url = (URL) invocation.getArguments()[0]; 89 return url.openConnection(); 90 } 91 }); 92 } catch (IOException ignored) { 93 } 94 return network; 95 } 96 } 97 98 @Override getNetworkCapabilities(Network network)99 public NetworkCapabilities getNetworkCapabilities(Network network) { 100 if (mActiveNetworkType == null) { 101 return null; 102 } else { 103 final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder(); 104 if (!mIsMetered) builder.addCapability(NET_CAPABILITY_NOT_METERED); 105 if (!mIsRoaming) builder.addCapability(NET_CAPABILITY_NOT_ROAMING); 106 return builder.build(); 107 } 108 } 109 110 @Override getMaxBytesOverMobile()111 public long getMaxBytesOverMobile() { 112 return mMaxBytesOverMobile; 113 } 114 115 @Override getRecommendedMaxBytesOverMobile()116 public long getRecommendedMaxBytesOverMobile() { 117 return mRecommendedMaxBytesOverMobile; 118 } 119 120 @Override sendBroadcast(Intent intent)121 public void sendBroadcast(Intent intent) { 122 mBroadcastsSent.add(intent); 123 mLastBroadcastOptions = null; 124 } 125 126 @Override sendBroadcast(Intent intent, String receiverPermission, Bundle options)127 public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { 128 mBroadcastsSent.add(intent); 129 mLastBroadcastOptions = options; 130 } 131 132 @Override userOwnsPackage(int uid, String pckg)133 public boolean userOwnsPackage(int uid, String pckg) throws NameNotFoundException { 134 return true; 135 } 136 137 @Override isCleartextTrafficPermitted(String packageName, String hostname)138 public boolean isCleartextTrafficPermitted(String packageName, String hostname) { 139 return mCleartextTrafficPermitted; 140 } 141 142 @Override getSSLContextForPackage(Context context, String pckg)143 public SSLContext getSSLContextForPackage(Context context, String pckg) { 144 return mSSLContext; 145 } 146 147 @Override hasPerDomainConfig(String pckg)148 public boolean hasPerDomainConfig(String pckg) { 149 return hasPerDomainConfig; 150 } 151 setSSLContext(SSLContext context)152 public void setSSLContext(SSLContext context) { 153 mSSLContext = context; 154 } 155 setReturnActualTime(boolean flag)156 public void setReturnActualTime(boolean flag) { 157 mReturnActualTime = flag; 158 } 159 } 160