convert LocalRepoManager to a proper singleton

This gives us lazy initialization that happens the first time an instance
is needed.  And Peter asked to have this more this way :)
This commit is contained in:
Hans-Christoph Steiner 2014-05-22 20:16:59 -04:00
parent ab165a4d7b
commit b7aad893a3
5 changed files with 30 additions and 39 deletions

View File

@ -23,22 +23,12 @@ import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothManager;
import android.content.ComponentName; import android.content.*;
import android.content.Context; import android.content.pm.*;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Build; import android.os.*;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
@ -55,24 +45,16 @@ import org.fdroid.fdroid.compat.PRNGFixes;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.InstalledAppCacheUpdater; import org.fdroid.fdroid.data.InstalledAppCacheUpdater;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.localrepo.LocalRepoService; import org.fdroid.fdroid.localrepo.LocalRepoService;
import org.fdroid.fdroid.net.WifiStateChangeService; import org.fdroid.fdroid.net.WifiStateChangeService;
import org.thoughtcrime.ssl.pinning.PinningTrustManager; import org.thoughtcrime.ssl.pinning.PinningTrustManager;
import org.thoughtcrime.ssl.pinning.SystemKeyStore; import org.thoughtcrime.ssl.pinning.SystemKeyStore;
import java.io.File; import java.io.File;
import java.security.KeyManagementException; import java.security.*;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Set; import java.util.Set;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.*;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class FDroidApp extends Application { public class FDroidApp extends Application {
@ -82,7 +64,6 @@ public class FDroidApp extends Application {
public static String ssid = ""; public static String ssid = "";
public static String bssid = ""; public static String bssid = "";
public static Repo repo = new Repo(); public static Repo repo = new Repo();
public static LocalRepoManager localRepo = null;
public static Set<String> selectedApps = null; // init in SelectLocalAppsFragment public static Set<String> selectedApps = null; // init in SelectLocalAppsFragment
private static Messenger localRepoServiceMessenger = null; private static Messenger localRepoServiceMessenger = null;
@ -125,8 +106,6 @@ public class FDroidApp extends Application {
// Apply the Google PRNG fixes to properly seed SecureRandom // Apply the Google PRNG fixes to properly seed SecureRandom
PRNGFixes.apply(); PRNGFixes.apply();
localRepo = new LocalRepoManager(getApplicationContext());
// Check that the installed app cache hasn't gotten out of sync somehow. // Check that the installed app cache hasn't gotten out of sync somehow.
// e.g. if we crashed/ran out of battery half way through responding // e.g. if we crashed/ran out of battery half way through responding
// to a package installed intent. It doesn't really matter where // to a package installed intent. It doesn't really matter where

View File

@ -63,7 +63,15 @@ public class LocalRepoManager {
public final File repoDir; public final File repoDir;
public final File iconsDir; public final File iconsDir;
public LocalRepoManager(Context c) { private static LocalRepoManager localRepoManager;
public static LocalRepoManager get(Context context) {
if(localRepoManager == null)
localRepoManager = new LocalRepoManager(context);
return localRepoManager;
}
private LocalRepoManager(Context c) {
context = c; context = c;
pm = c.getPackageManager(); pm = c.getPackageManager();
assetManager = c.getAssets(); assetManager = c.getAssets();

View File

@ -14,6 +14,7 @@ import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.LocalRepoKeyStore; import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.util.Locale; import java.util.Locale;
@ -66,8 +67,9 @@ public class WifiStateChangeService extends Service {
scheme, FDroidApp.ipAddressString, FDroidApp.port); scheme, FDroidApp.ipAddressString, FDroidApp.port);
Certificate localCert = LocalRepoKeyStore.get(getApplication()).getCertificate(); Certificate localCert = LocalRepoKeyStore.get(getApplication()).getCertificate();
FDroidApp.repo.fingerprint = Utils.calcFingerprint(localCert); FDroidApp.repo.fingerprint = Utils.calcFingerprint(localCert);
FDroidApp.localRepo.setUriString(FDroidApp.repo.address); LocalRepoManager lrm = LocalRepoManager.get(WifiStateChangeService.this);
FDroidApp.localRepo.writeIndexPage( lrm.setUriString(FDroidApp.repo.address);
lrm.writeIndexPage(
Utils.getSharingUri(WifiStateChangeService.this, FDroidApp.repo).toString()); Utils.getSharingUri(WifiStateChangeService.this, FDroidApp.repo).toString());
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -23,6 +23,7 @@ import android.widget.*;
import org.fdroid.fdroid.*; import org.fdroid.fdroid.*;
import org.fdroid.fdroid.localrepo.LocalRepoKeyStore; import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.localrepo.LocalRepoService; import org.fdroid.fdroid.localrepo.LocalRepoService;
import org.fdroid.fdroid.net.WifiStateChangeService; import org.fdroid.fdroid.net.WifiStateChangeService;
import org.spongycastle.operator.OperatorCreationException; import org.spongycastle.operator.OperatorCreationException;
@ -73,7 +74,7 @@ public class LocalRepoActivity extends Activity {
LocalBroadcastManager.getInstance(this).registerReceiver(onLocalRepoChange, LocalBroadcastManager.getInstance(this).registerReceiver(onLocalRepoChange,
new IntentFilter(LocalRepoService.STATE)); new IntentFilter(LocalRepoService.STATE));
// if no local repo exists, create one with only FDroid in it // if no local repo exists, create one with only FDroid in it
if (!FDroidApp.localRepo.xmlIndex.exists()) if (!LocalRepoManager.get(this).xmlIndex.exists())
new UpdateAsyncTask(this, new String[] { new UpdateAsyncTask(this, new String[] {
getPackageName(), getPackageName(),
}).execute(); }).execute();
@ -321,26 +322,27 @@ public class LocalRepoActivity extends Activity {
@Override @Override
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {
try { try {
final LocalRepoManager lrm = LocalRepoManager.get(LocalRepoActivity.this);
publishProgress(getString(R.string.deleting_repo)); publishProgress(getString(R.string.deleting_repo));
FDroidApp.localRepo.deleteRepo(); lrm.deleteRepo();
for (String app : selectedApps) { for (String app : selectedApps) {
publishProgress(String.format(getString(R.string.adding_apks_format), app)); publishProgress(String.format(getString(R.string.adding_apks_format), app));
FDroidApp.localRepo.addApp(getApplicationContext(), app); lrm.addApp(getApplicationContext(), app);
} }
FDroidApp.localRepo.writeIndexPage(sharingUri.toString()); lrm.writeIndexPage(sharingUri.toString());
publishProgress(getString(R.string.writing_index_xml)); publishProgress(getString(R.string.writing_index_xml));
FDroidApp.localRepo.writeIndexXML(); lrm.writeIndexXML();
publishProgress(getString(R.string.writing_index_jar)); publishProgress(getString(R.string.writing_index_jar));
FDroidApp.localRepo.writeIndexJar(); lrm.writeIndexJar();
publishProgress(getString(R.string.linking_apks)); publishProgress(getString(R.string.linking_apks));
FDroidApp.localRepo.copyApksToRepo(); lrm.copyApksToRepo();
publishProgress(getString(R.string.copying_icons)); publishProgress(getString(R.string.copying_icons));
// run the icon copy without progress, its not a blocker // run the icon copy without progress, its not a blocker
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {
FDroidApp.localRepo.copyIconsToRepo(); lrm.copyIconsToRepo();
return null; return null;
} }
}.execute(); }.execute();

View File

@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.ActionMode; import android.view.ActionMode;
import android.view.View; import android.view.View;
import android.widget.*; import android.widget.*;
@ -37,6 +36,7 @@ import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.InstalledAppProvider.DataColumns; import org.fdroid.fdroid.data.InstalledAppProvider.DataColumns;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.views.SelectLocalAppsActivity; import org.fdroid.fdroid.views.SelectLocalAppsActivity;
import java.util.HashSet; import java.util.HashSet;
@ -113,7 +113,7 @@ public class SelectLocalAppsFragment extends ListFragment
// build list of existing apps from what is on the file system // build list of existing apps from what is on the file system
if (FDroidApp.selectedApps == null) { if (FDroidApp.selectedApps == null) {
FDroidApp.selectedApps = new HashSet<String>(); FDroidApp.selectedApps = new HashSet<String>();
for (String filename : FDroidApp.localRepo.repoDir.list()) { for (String filename : LocalRepoManager.get(selectLocalAppsActivity).repoDir.list()) {
if (filename.matches(".*\\.apk")) { if (filename.matches(".*\\.apk")) {
String packageName = filename.substring(0, filename.indexOf("_")); String packageName = filename.substring(0, filename.indexOf("_"));
FDroidApp.selectedApps.add(packageName); FDroidApp.selectedApps.add(packageName);