blob: 1d32c265007bf2432febdd6cf7e44e2855151241 [file] [log] [blame]
/*
* 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.certinstaller;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileObserver;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.security.Credentials;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Lists certificate files in the SD card. User may click one to install it
* to the system keystore.
*/
public class CertFileList extends CertFile
implements Preference.OnPreferenceClickListener {
private static final String TAG = "CertFileList";
private static final String DOWNLOAD_DIR = "download";
private SdCardMonitor mSdCardMonitor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pick_file_pref);
createFileList();
startSdCardMonitor();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopSdCardMonitor();
}
@Override
protected void onInstallationDone(boolean fileDeleted) {
super.onInstallationDone(fileDeleted);
if (!fileDeleted) {
if (isSdCardPresent()) {
setAllFilesEnabled(true);
} else {
Toast.makeText(this, R.string.sdcard_not_present,
Toast.LENGTH_SHORT).show();
finish();
}
}
}
@Override
protected void onError(int errorId) {
if (errorId == CERT_FILE_MISSING_ERROR) {
createFileList();
}
}
private void setAllFilesEnabled(boolean enabled) {
PreferenceScreen root = getPreferenceScreen();
for (int i = 0, n = root.getPreferenceCount(); i < n; i++) {
root.getPreference(i).setEnabled(enabled);
}
}
public boolean onPreferenceClick(Preference pref) {
File file = new File(Environment.getExternalStorageDirectory(),
pref.getTitle().toString());
if (file.isDirectory()) {
Log.w(TAG, "impossible to pick a directory! " + file);
} else {
setAllFilesEnabled(false);
installFromFile(file);
}
return true;
}
private void createFileList() {
if (isFinishing()) {
Log.d(TAG, "finishing, exit createFileList()");
return;
}
if (!isSdCardPresent()) {
Toast.makeText(this, R.string.sdcard_not_present,
Toast.LENGTH_SHORT).show();
finish();
return;
}
try {
PreferenceScreen root = getPreferenceScreen();
root.removeAll();
List<File> allFiles = getAllCertFiles();
if (allFiles.isEmpty()) {
Toast.makeText(this, R.string.no_cert_file_found,
Toast.LENGTH_SHORT).show();
finish();
return;
} else {
int prefixEnd = Environment.getExternalStorageDirectory()
.getCanonicalPath().length() + 1;
for (File file : allFiles) {
Preference pref = new Preference(this);
pref.setTitle(file.getCanonicalPath().substring(prefixEnd));
root.addPreference(pref);
pref.setOnPreferenceClickListener(this);
}
}
} catch (IOException e) {
// should not occur
Log.w(TAG, "createFileList(): " + e);
throw new RuntimeException(e);
}
}
private void startSdCardMonitor() {
if (mSdCardMonitor == null) {
mSdCardMonitor = new SdCardMonitor();
}
mSdCardMonitor.startWatching();
}
private void stopSdCardMonitor() {
if (mSdCardMonitor != null) {
mSdCardMonitor.stopWatching();
}
}
private class SdCardMonitor {
FileObserver mRootMonitor;
FileObserver mDownloadMonitor;
SdCardMonitor() {
File root = Environment.getExternalStorageDirectory();
mRootMonitor = new FileObserver(root.getPath()) {
@Override
public void onEvent(int evt, String path) {
commonHandler(evt, path);
}
};
File download = new File(root, DOWNLOAD_DIR);
mDownloadMonitor = new FileObserver(download.getPath()) {
@Override
public void onEvent(int evt, String path) {
commonHandler(evt, path);
}
};
}
private void commonHandler(int evt, String path) {
switch (evt) {
case FileObserver.CREATE:
case FileObserver.DELETE:
if (isFileAcceptable(path)) {
runOnUiThread(new Runnable() {
public void run() {
createFileList();
}
});
}
break;
}
};
void startWatching() {
mRootMonitor.startWatching();
mDownloadMonitor.startWatching();
}
void stopWatching() {
mRootMonitor.stopWatching();
mDownloadMonitor.stopWatching();
}
}
}