1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.development; 18 19 import java.io.File; 20 import java.io.FileOutputStream; 21 import java.io.IOException; 22 23 import android.app.Activity; 24 import android.app.IActivityController; 25 import android.app.IActivityManager; 26 import android.app.Service; 27 import android.content.BroadcastReceiver; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 import android.os.AsyncTask; 32 import android.os.Bundle; 33 import android.os.IBinder; 34 import android.os.IPowerManager; 35 import android.os.Process; 36 import android.os.RemoteException; 37 import android.os.ServiceManager; 38 import android.util.Log; 39 import android.view.View; 40 import android.widget.Button; 41 42 public class CacheAbuser extends Activity { 43 Button mStartInternalAbuse; 44 Button mStartSlowInternalAbuse; 45 Button mStartExternalAbuse; 46 Button mStartSlowExternalAbuse; 47 Button mStopAbuse; 48 49 AsyncTask<Void, Void, Void> mInternalAbuseTask; 50 AsyncTask<Void, Void, Void> mExternalAbuseTask; 51 52 static class AbuseTask extends AsyncTask<Void, Void, Void> { 53 final File mBaseDir; 54 final boolean mQuick; 55 final byte[] mBuffer; 56 AbuseTask(File cacheDir, boolean quick)57 AbuseTask(File cacheDir, boolean quick) { 58 File dir = new File(cacheDir, quick ? "quick" : "slow"); 59 mBaseDir = new File(dir, Long.toString(System.currentTimeMillis())); 60 mQuick = quick; 61 mBuffer = quick ? new byte[1024*1024] : new byte[1024]; 62 } 63 64 @Override doInBackground(Void... params)65 protected Void doInBackground(Void... params) { 66 long num = 0; 67 while (!isCancelled()) { 68 long dir1num = num/100; 69 long dir2num = num%100; 70 File dir = new File(mBaseDir, Long.toString(dir1num)); 71 File file = new File(dir, Long.toString(dir2num)); 72 FileOutputStream fos = null; 73 try { 74 dir.mkdirs(); 75 fos = new FileOutputStream(file, false); 76 fos.write(mBuffer); 77 } catch (IOException e) { 78 Log.w("CacheAbuser", "Write failed to " + file + ": " + e); 79 try { 80 Thread.sleep(5*1000); 81 } catch (InterruptedException e1) { 82 } 83 } finally { 84 try { 85 if (fos != null) { 86 fos.close(); 87 } 88 } catch (IOException e) { 89 } 90 } 91 num++; 92 } 93 return null; 94 } 95 } 96 97 @Override onCreate(Bundle icicle)98 public void onCreate(Bundle icicle) { 99 super.onCreate(icicle); 100 101 setContentView(R.layout.cache_abuser); 102 103 mStartInternalAbuse = (Button) findViewById(R.id.start_internal_abuse); 104 mStartInternalAbuse.setOnClickListener(new View.OnClickListener() { 105 public void onClick(View v) { 106 if (mInternalAbuseTask == null) { 107 mInternalAbuseTask = new AbuseTask(getCacheDir(), true); 108 mInternalAbuseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 109 updateButtonState(); 110 } 111 } 112 }); 113 114 mStartSlowInternalAbuse = (Button) findViewById(R.id.start_slow_internal_abuse); 115 mStartSlowInternalAbuse.setOnClickListener(new View.OnClickListener() { 116 public void onClick(View v) { 117 if (mInternalAbuseTask == null) { 118 mInternalAbuseTask = new AbuseTask(getCacheDir(), false); 119 mInternalAbuseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 120 updateButtonState(); 121 } 122 } 123 }); 124 125 mStartExternalAbuse = (Button) findViewById(R.id.start_external_abuse); 126 mStartExternalAbuse.setOnClickListener(new View.OnClickListener() { 127 public void onClick(View v) { 128 if (mExternalAbuseTask == null) { 129 mExternalAbuseTask = new AbuseTask(getExternalCacheDir(), true); 130 mExternalAbuseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 131 updateButtonState(); 132 } 133 } 134 }); 135 136 mStartSlowExternalAbuse = (Button) findViewById(R.id.start_slow_external_abuse); 137 mStartSlowExternalAbuse.setOnClickListener(new View.OnClickListener() { 138 public void onClick(View v) { 139 if (mExternalAbuseTask == null) { 140 mExternalAbuseTask = new AbuseTask(getExternalCacheDir(), false); 141 mExternalAbuseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 142 updateButtonState(); 143 } 144 } 145 }); 146 147 mStopAbuse = (Button) findViewById(R.id.stop_abuse); 148 mStopAbuse.setOnClickListener(new View.OnClickListener() { 149 public void onClick(View v) { 150 stopAbuse(); 151 } 152 }); 153 154 updateButtonState(); 155 } 156 157 @Override onStart()158 public void onStart() { 159 super.onStart(); 160 updateButtonState(); 161 } 162 163 @Override onStop()164 public void onStop() { 165 super.onStop(); 166 stopAbuse(); 167 } 168 stopAbuse()169 void stopAbuse() { 170 if (mInternalAbuseTask != null) { 171 mInternalAbuseTask.cancel(false); 172 mInternalAbuseTask = null; 173 } 174 if (mExternalAbuseTask != null) { 175 mExternalAbuseTask.cancel(false); 176 mExternalAbuseTask = null; 177 } 178 updateButtonState(); 179 } 180 updateButtonState()181 void updateButtonState() { 182 mStartInternalAbuse.setEnabled(mInternalAbuseTask == null); 183 mStartSlowInternalAbuse.setEnabled(mInternalAbuseTask == null); 184 mStartExternalAbuse.setEnabled(mExternalAbuseTask == null); 185 mStartSlowExternalAbuse.setEnabled(mExternalAbuseTask == null); 186 mStopAbuse.setEnabled(mInternalAbuseTask != null 187 || mExternalAbuseTask != null); 188 } 189 } 190