From 287c6462ffa78b8f423130aa053810eae3e07048 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 23 Jul 2014 01:30:53 +0200 Subject: [PATCH] Update list automatically when certificates are changed. --- .../CertificateManagerTest.java | 28 +++++++++++++++++++ .../nutomic/zertman/CertificateAdapter.java | 25 ++++++++++++++++- .../nutomic/zertman/CertificateManager.java | 19 ++++++++++++- .../com/nutomic/zertman/MainActivity.java | 12 +++----- 4 files changed, 74 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java b/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java index 99208af..fd64598 100644 --- a/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java +++ b/app/src/androidTest/java/com.nutomic.zertman.test/CertificateManagerTest.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; +import java.util.concurrent.CountDownLatch; import eu.chainfire.libsuperuser.Shell; @@ -31,11 +32,23 @@ public class CertificateManagerTest extends AndroidTestCase { private CertificateManager mCertificateManager; + private CountDownLatch mLatch; + @Override protected void setUp() throws Exception { super.setUp(); mCertificateManager = new CertificateManager(); + mCertificateManager.setOnCertificateChangedListener( + new CertificateManager.OnCertificateChangedListener() { + @Override + public void onCertificateChanged() { + if (mLatch == null) + return; + + mLatch.countDown(); + } + }); assertTrue(Shell.SU.available()); } @@ -44,13 +57,25 @@ public class CertificateManagerTest extends AndroidTestCase { public void testUserCertificates() { Certificate cert = copyCertificate(false); assertTrue(mCertificateManager.getCertificates(false).contains(cert)); + mLatch = new CountDownLatch(1); assertTrue(mCertificateManager.deleteCertificate(cert)); assertReadOnly(); + waitForCallback(); + } + + private void waitForCallback() { + try { + mLatch.await(); + } + catch (InterruptedException e) { + fail(); + } } @MediumTest public void testMoveCertificate() { Certificate cert = copyCertificate(false); + mLatch = new CountDownLatch(2); Certificate newCertificate = mCertificateManager.moveCertificateToSystem(cert); assertReadOnly(); assertNotNull(newCertificate); @@ -61,6 +86,7 @@ public class CertificateManagerTest extends AndroidTestCase { assertTrue(mCertificateManager.getCertificates(true).contains(newCertificate)); assertTrue(mCertificateManager.deleteCertificate(newCertificate)); assertReadOnly(); + waitForCallback(); } /** @@ -100,7 +126,9 @@ public class CertificateManagerTest extends AndroidTestCase { public void testSystemCertificates() { Certificate cert = copyCertificate(true); assertTrue(mCertificateManager.getCertificates(true).contains(cert)); + mLatch = new CountDownLatch(1); assertTrue(mCertificateManager.deleteCertificate(cert)); + waitForCallback(); assertReadOnly(); } diff --git a/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java b/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java index 7e60021..f74a580 100644 --- a/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java +++ b/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java @@ -1,6 +1,7 @@ package com.nutomic.zertman; import android.content.Context; +import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -8,10 +9,13 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.TextView; +import java.util.List; + /** * List Adapter for {@link Certificate}. */ -public class CertificateAdapter extends ArrayAdapter { +public class CertificateAdapter extends ArrayAdapter implements + CertificateManager.OnCertificateChangedListener{ private CertificateManager mCertificateManager; @@ -73,4 +77,23 @@ public class CertificateAdapter extends ArrayAdapter { return convertView; } + @Override + public void onCertificateChanged() { + new UpdateListTask().execute(); + } + + private class UpdateListTask extends AsyncTask> { + @Override + protected List doInBackground(Void... params) { + List ret = mCertificateManager.getCertificates(false); + ret.addAll(mMovedCertificatesStorage.list()); + return ret; + } + + @Override + protected void onPostExecute(List certificate) { + clear(); + addAll(certificate); + } + } } diff --git a/app/src/main/java/com/nutomic/zertman/CertificateManager.java b/app/src/main/java/com/nutomic/zertman/CertificateManager.java index 712fa4a..b5a3310 100644 --- a/app/src/main/java/com/nutomic/zertman/CertificateManager.java +++ b/app/src/main/java/com/nutomic/zertman/CertificateManager.java @@ -19,6 +19,10 @@ public class CertificateManager { public static final File SYSTEM_CERTIFICATES_DIR = new File("/system/etc/security/cacerts"); + public interface OnCertificateChangedListener { + public void onCertificateChanged(); + } + /** * Possible options for partition mounting (used for #remountSystem()). */ @@ -27,6 +31,12 @@ public class CertificateManager { ReadWrite } + private OnCertificateChangedListener mOnCertificateChangedListener; + + public void setOnCertificateChangedListener(OnCertificateChangedListener listener) { + mOnCertificateChangedListener = listener; + } + /** * Lists all certificates for either user or system. * @@ -56,7 +66,11 @@ public class CertificateManager { run("chmod 644 " + SYSTEM_CERTIFICATES_DIR + "/" + certificate.getFile().getName()); remountSystem(Mode.ReadOnly); deleteCertificate(certificate); - return new Certificate(certificate.getFile().getName(), true); + Certificate newCert = new Certificate(certificate.getFile().getName(), true); + if (mOnCertificateChangedListener != null) { + mOnCertificateChangedListener.onCertificateChanged(); + } + return newCert; } /** @@ -68,6 +82,9 @@ public class CertificateManager { remountSystem(Mode.ReadWrite); boolean success = run("rm " + certificate.getFile().getAbsolutePath()); remountSystem(Mode.ReadOnly); + if (mOnCertificateChangedListener != null) { + mOnCertificateChangedListener.onCertificateChanged(); + } return success; } diff --git a/app/src/main/java/com/nutomic/zertman/MainActivity.java b/app/src/main/java/com/nutomic/zertman/MainActivity.java index d13cfe0..90a8778 100644 --- a/app/src/main/java/com/nutomic/zertman/MainActivity.java +++ b/app/src/main/java/com/nutomic/zertman/MainActivity.java @@ -30,14 +30,8 @@ public class MainActivity extends ListActivity { mMovedCertificatesStorage = new MovedCertificatesStorage(this); mCertificateAdapter = new CertificateAdapter(this, mCertificateManager, mMovedCertificatesStorage); - - new Thread(new Runnable() { - @Override - public void run() { - mCertificateAdapter.addAll(mCertificateManager.getCertificates(false)); - mCertificateAdapter.addAll(mMovedCertificatesStorage.list()); - } - }).start(); + mCertificateAdapter.onCertificateChanged(); + mCertificateManager.setOnCertificateChangedListener(mCertificateAdapter); mListView.setAdapter(mCertificateAdapter); } @@ -47,6 +41,8 @@ public class MainActivity extends ListActivity { @Override protected void onResume() { super.onResume(); + + mCertificateAdapter.onCertificateChanged(); final List list = mCertificateManager.getCertificates(false); if (!list.isEmpty()) { new AlertDialog.Builder(this)