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