/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.lowstoragetest;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import java.io.File;
import java.io.FileOutputStream;
import android.widget.TextView;
import android.widget.Button;
public class LowStorageTest extends Activity {
static final String TAG = "DiskFullTest";
static final long WAIT_FOR_FINISH = 5 * 60 * 60;
static final int NO_OF_BLOCKS_TO_FILL = 1000;
static final int BYTE_SIZE = 1024;
static final int WAIT_FOR_SYSTEM_UPDATE = 10000;
private int mBlockSize = 0;
private final Object fillUpDone = new Object();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
// Update the current data info
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
int totalBlocks = stat.getBlockCount();
mBlockSize = (int) (stat.getBlockSize());
TextView startSizeTextView = (TextView) findViewById(R.id.totalsize);
startSizeTextView.setText(Long.toString((totalBlocks * mBlockSize) / BYTE_SIZE));
Button button = (Button) findViewById(R.id.button_run);
button.setOnClickListener(mStartListener);
}
View.OnClickListener mStartListener = new OnClickListener() {
public void onClick(View v) {
fillDataAndUpdateInfo();
}
};
public void fillDataAndUpdateInfo() {
updateInfo(this);
}
// Fill up 100% of the data partition
public void fillupdisk(Context context) {
final Context contextfill = context;
new Thread() {
@Override
public void run() {
try {
// Fill up all the memory
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
int totalBlocks = stat.getBlockCount();
int noOfBlockToFill = stat.getAvailableBlocks();
FileOutputStream fs =
contextfill.openFileOutput("testdata", Context.MODE_APPEND);
for (int i = 0; i < (noOfBlockToFill / NO_OF_BLOCKS_TO_FILL); i++) {
byte buf[] = new byte[mBlockSize * NO_OF_BLOCKS_TO_FILL];
fs.write(buf);
fs.flush();
}
// Fill up the last few block
byte buf[] = new byte[(noOfBlockToFill % NO_OF_BLOCKS_TO_FILL) * mBlockSize];
fs.write(buf);
fs.flush();
fs.close();
// Finished, update the info
synchronized (fillUpDone) {
fillUpDone.notify();
}
} catch (Exception e) {
Log.v(TAG, e.toString());
}
}
}.start();
}
public void updateInfo(Context context) {
fillupdisk(this);
synchronized (fillUpDone) {
try {
fillUpDone.wait(WAIT_FOR_FINISH);
} catch (Exception e) {
Log.v(TAG, "wait was interrupted.");
}
}
try {
// The stat didn't relect the correct data right away
// put some extra time to make sure if get the right size.
Thread.sleep(WAIT_FOR_SYSTEM_UPDATE);
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long availableBlocks = stat.getAvailableBlocks();
TextView freeSizeTextView = (TextView) findViewById(R.id.freesize);
freeSizeTextView.setText(Long.toString((availableBlocks * mBlockSize) / BYTE_SIZE));
TextView statusTextView = (TextView) findViewById(R.id.status);
statusTextView.setText("Finished. You can start the test now.");
} catch (Exception e) {
Log.v(TAG, e.toString());
}
}
}