Merge branch 'first-run-index-update' into 'master'
First run index update See merge request fdroid/fdroidclient!714
This commit is contained in:
commit
e374a3da5a
@ -70,8 +70,7 @@ errorprone:
|
||||
- ./gradlew connectedCheck || (adb -e logcat -d '*:E' > logcat.txt; exit 1)
|
||||
|
||||
connected24:
|
||||
only:
|
||||
- fdroid/fdroidclient@master
|
||||
retry: 1
|
||||
<<: *test-template
|
||||
variables:
|
||||
AVD_SDK: "24"
|
||||
@ -79,10 +78,6 @@ connected24:
|
||||
AVD_PACKAGE: "system-images;android-${AVD_SDK};${AVD_TAG};armeabi-v7a"
|
||||
<<: *connected-template
|
||||
|
||||
connected25:
|
||||
<<: *test-template
|
||||
<<: *connected-template
|
||||
|
||||
deploy_nightly:
|
||||
stage: deploy
|
||||
only:
|
||||
|
@ -13,8 +13,9 @@ import android.support.v7.widget.GridLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.fdroid.fdroid.Preferences;
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.UpdateService;
|
||||
@ -40,6 +41,8 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
|
||||
private final TextView emptyState;
|
||||
private final RecyclerView appList;
|
||||
|
||||
private ProgressBar progressBar;
|
||||
|
||||
WhatsNewViewBinder(final AppCompatActivity activity, FrameLayout parent) {
|
||||
this.activity = activity;
|
||||
|
||||
@ -124,6 +127,19 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
|
||||
}
|
||||
|
||||
private void explainEmptyStateToUser() {
|
||||
if (Preferences.get().isIndexNeverUpdated() && UpdateService.isUpdating()) {
|
||||
if (progressBar != null) {
|
||||
return;
|
||||
}
|
||||
LinearLayout linearLayout = (LinearLayout) appList.getParent();
|
||||
progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleLarge);
|
||||
progressBar.setId(R.id.progress_bar);
|
||||
linearLayout.addView(progressBar);
|
||||
emptyState.setVisibility(View.GONE);
|
||||
appList.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder emptyStateText = new StringBuilder();
|
||||
emptyStateText.append(activity.getString(R.string.latest__empty_state__no_recent_apps));
|
||||
emptyStateText.append("\n\n");
|
||||
|
@ -349,8 +349,9 @@ public class FDroidApp extends Application {
|
||||
}
|
||||
Preferences.setup(this);
|
||||
Languages.setLanguage(this);
|
||||
Preferences preferences = Preferences.get();
|
||||
|
||||
if (Preferences.get().promptToSendCrashReports()) {
|
||||
if (preferences.promptToSendCrashReports()) {
|
||||
ACRA.init(this);
|
||||
if (isAcraProcess() || HidingManager.isHidden(this)) {
|
||||
return;
|
||||
@ -359,16 +360,15 @@ public class FDroidApp extends Application {
|
||||
|
||||
PRNGFixes.apply();
|
||||
|
||||
curTheme = Preferences.get().getTheme();
|
||||
Preferences.get().configureProxy();
|
||||
curTheme = preferences.getTheme();
|
||||
preferences.configureProxy();
|
||||
|
||||
// bug specific to exactly 5.0 makes it only work with the old index
|
||||
// which includes an ugly, hacky workaround
|
||||
// https://gitlab.com/fdroid/fdroidclient/issues/1014
|
||||
if (Build.VERSION.SDK_INT == 21) {
|
||||
Preferences p = Preferences.get();
|
||||
p.setExpertMode(true);
|
||||
p.setForceOldIndex(true);
|
||||
preferences.setExpertMode(true);
|
||||
preferences.setForceOldIndex(true);
|
||||
}
|
||||
|
||||
InstalledAppProviderService.compareToPackageManager(this);
|
||||
@ -376,7 +376,7 @@ public class FDroidApp extends Application {
|
||||
// If the user changes the preference to do with filtering rooted apps,
|
||||
// it is easier to just notify a change in the app provider,
|
||||
// so that the newly updated list will correctly filter relevant apps.
|
||||
Preferences.get().registerAppsRequiringRootChangeListener(new Preferences.ChangeListener() {
|
||||
preferences.registerAppsRequiringRootChangeListener(new Preferences.ChangeListener() {
|
||||
@Override
|
||||
public void onPreferenceChange() {
|
||||
getContentResolver().notifyChange(AppProvider.getContentUri(), null);
|
||||
@ -386,14 +386,14 @@ public class FDroidApp extends Application {
|
||||
// If the user changes the preference to do with filtering anti-feature apps,
|
||||
// it is easier to just notify a change in the app provider,
|
||||
// so that the newly updated list will correctly filter relevant apps.
|
||||
Preferences.get().registerAppsRequiringAntiFeaturesChangeListener(new Preferences.ChangeListener() {
|
||||
preferences.registerAppsRequiringAntiFeaturesChangeListener(new Preferences.ChangeListener() {
|
||||
@Override
|
||||
public void onPreferenceChange() {
|
||||
getContentResolver().notifyChange(AppProvider.getContentUri(), null);
|
||||
}
|
||||
});
|
||||
|
||||
Preferences.get().registerUnstableUpdatesChangeListener(new Preferences.ChangeListener() {
|
||||
preferences.registerUnstableUpdatesChangeListener(new Preferences.ChangeListener() {
|
||||
@Override
|
||||
public void onPreferenceChange() {
|
||||
AppProvider.Helper.calcSuggestedApks(FDroidApp.this);
|
||||
@ -403,7 +403,6 @@ public class FDroidApp extends Application {
|
||||
CleanCacheService.schedule(this);
|
||||
|
||||
notificationHelper = new NotificationHelper(getApplicationContext());
|
||||
UpdateService.schedule(getApplicationContext());
|
||||
bluetoothAdapter = getBluetoothAdapter();
|
||||
|
||||
// There are a couple things to pay attention to with this config: memory usage,
|
||||
@ -452,21 +451,26 @@ public class FDroidApp extends Application {
|
||||
.build();
|
||||
ImageLoader.getInstance().init(config);
|
||||
|
||||
if (preferences.isIndexNeverUpdated()) {
|
||||
// force this check to ensure it starts fetching the index on initial runs
|
||||
networkState = ConnectivityMonitorService.getNetworkState(this);
|
||||
}
|
||||
ConnectivityMonitorService.registerAndStart(this);
|
||||
UpdateService.schedule(getApplicationContext());
|
||||
|
||||
FDroidApp.initWifiSettings();
|
||||
WifiStateChangeService.start(this, null);
|
||||
// if the HTTPS pref changes, then update all affected things
|
||||
Preferences.get().registerLocalRepoHttpsListeners(new ChangeListener() {
|
||||
preferences.registerLocalRepoHttpsListeners(new ChangeListener() {
|
||||
@Override
|
||||
public void onPreferenceChange() {
|
||||
WifiStateChangeService.start(getApplicationContext(), null);
|
||||
}
|
||||
});
|
||||
|
||||
configureTor(Preferences.get().isTorEnabled());
|
||||
configureTor(preferences.isTorEnabled());
|
||||
|
||||
if (Preferences.get().isKeepingInstallHistory()) {
|
||||
if (preferences.isKeepingInstallHistory()) {
|
||||
InstallHistoryService.register(this);
|
||||
}
|
||||
|
||||
@ -492,7 +496,7 @@ public class FDroidApp extends Application {
|
||||
atStartTime.edit().putInt("build-version", Build.VERSION.SDK_INT).apply();
|
||||
|
||||
final String queryStringKey = "http-downloader-query-string";
|
||||
if (Preferences.get().sendVersionAndUUIDToServers()) {
|
||||
if (preferences.sendVersionAndUUIDToServers()) {
|
||||
HttpDownloader.queryString = atStartTime.getString(queryStringKey, null);
|
||||
if (HttpDownloader.queryString == null) {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
|
@ -101,7 +101,6 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
||||
public static final String PREF_PROXY_PORT = "proxyPort";
|
||||
public static final String PREF_SHOW_NFC_DURING_SWAP = "showNfcDuringSwap";
|
||||
public static final String PREF_POST_PRIVILEGED_INSTALL = "postPrivilegedInstall";
|
||||
public static final String PREF_TRIED_EMPTY_UPDATE = "triedEmptyUpdate";
|
||||
public static final String PREF_PREVENT_SCREENSHOTS = "preventScreenshots";
|
||||
public static final String PREF_PANIC_EXIT = "pref_panic_exit";
|
||||
public static final String PREF_PANIC_HIDE = "pref_panic_hide";
|
||||
@ -114,10 +113,14 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
||||
public static final int OVER_NETWORK_ON_DEMAND = 1;
|
||||
public static final int OVER_NETWORK_ALWAYS = 2;
|
||||
|
||||
// not shown in Settings
|
||||
private static final String PREF_LAST_UPDATE_CHECK = "lastUpdateCheck";
|
||||
|
||||
// these preferences are not listed in preferences.xml so the defaults are set here
|
||||
@SuppressWarnings("PMD.AvoidUsingHardCodedIP")
|
||||
public static final String DEFAULT_PROXY_HOST = "127.0.0.1"; // TODO move to preferences.xml
|
||||
public static final int DEFAULT_PROXY_PORT = 8118; // TODO move to preferences.xml
|
||||
private static final int DEFAULT_LAST_UPDATE_CHECK = -1;
|
||||
private static final boolean DEFAULT_SHOW_NFC_DURING_SWAP = true;
|
||||
private static final boolean DEFAULT_POST_PRIVILEGED_INSTALL = false;
|
||||
private static final boolean DEFAULT_PANIC_EXIT = true;
|
||||
@ -321,18 +324,23 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used the first time F-Droid is installed to flag whether or not we have tried to request
|
||||
* apps from the repo. This is used so that when there is no apps available, we can differentiate
|
||||
* between whether the repos actually have no apps (in which case we don't need to continue
|
||||
* asking), or whether there is no apps because we have never actually asked to update the repos.
|
||||
*/
|
||||
public boolean hasTriedEmptyUpdate() {
|
||||
return preferences.getBoolean(PREF_TRIED_EMPTY_UPDATE, IGNORED_B);
|
||||
public long getLastUpdateCheck() {
|
||||
return preferences.getLong(PREF_LAST_UPDATE_CHECK, DEFAULT_LAST_UPDATE_CHECK);
|
||||
}
|
||||
|
||||
public void setTriedEmptyUpdate(boolean value) {
|
||||
preferences.edit().putBoolean(PREF_TRIED_EMPTY_UPDATE, value).apply();
|
||||
public void setLastUpdateCheck(long lastUpdateCheck) {
|
||||
preferences.edit().putLong(PREF_LAST_UPDATE_CHECK, lastUpdateCheck).apply();
|
||||
}
|
||||
|
||||
public void resetLastUpdateCheck() {
|
||||
setLastUpdateCheck(DEFAULT_LAST_UPDATE_CHECK);
|
||||
}
|
||||
|
||||
/**
|
||||
* The first time the app has been run since fresh install or clearing all data.
|
||||
*/
|
||||
public boolean isIndexNeverUpdated() {
|
||||
return getLastUpdateCheck() == DEFAULT_LAST_UPDATE_CHECK;
|
||||
}
|
||||
|
||||
public boolean getUnstableUpdates() {
|
||||
|
@ -29,7 +29,6 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
@ -41,7 +40,6 @@ import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.JobIntentService;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
@ -82,11 +80,11 @@ public class UpdateService extends JobIntentService {
|
||||
public static final int STATUS_ERROR_LOCAL_SMALL = 4;
|
||||
public static final int STATUS_INFO = 5;
|
||||
|
||||
private static final String STATE_LAST_UPDATED = "lastUpdateCheck";
|
||||
private static final int JOB_ID = 0xfedcba;
|
||||
|
||||
private static final int NOTIFY_ID_UPDATING = 0;
|
||||
|
||||
private static UpdateService updateService;
|
||||
private static Handler toastHandler;
|
||||
|
||||
private NotificationManager notificationManager;
|
||||
@ -118,11 +116,19 @@ public class UpdateService extends JobIntentService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add work to the queue for processing now
|
||||
* Add work to the queue for processing now.
|
||||
* <p>
|
||||
* This also shows a {@link Toast} if the Data/WiFi Settings make it so the
|
||||
* update process is not allowed to run and the device is attached to a
|
||||
* network (e.g. is not offline or in Airplane Mode).
|
||||
*
|
||||
* @see JobIntentService#enqueueWork(Context, Class, int, Intent)
|
||||
*/
|
||||
private static void enqueueWork(Context context, @NonNull Intent intent) {
|
||||
if (FDroidApp.networkState > 0 && !Preferences.get().isOnDemandDownloadAllowed()) {
|
||||
Toast.makeText(context, R.string.updates_disabled_by_settings, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
enqueueWork(context, UpdateService.class, JOB_ID, intent);
|
||||
}
|
||||
|
||||
@ -188,6 +194,8 @@ public class UpdateService extends JobIntentService {
|
||||
/**
|
||||
* Whether or not a repo update is currently in progress. Used to show feedback throughout
|
||||
* the app to users, so they know something is happening.
|
||||
*
|
||||
* @see <a href="https://stackoverflow.com/a/608600">set a global variable when it is running that your client can check</a>
|
||||
*/
|
||||
public static boolean isUpdating() {
|
||||
return updateService != null;
|
||||
@ -239,8 +247,6 @@ public class UpdateService extends JobIntentService {
|
||||
|
||||
}
|
||||
|
||||
private static UpdateService updateService;
|
||||
|
||||
public static void stopNow(Context context) {
|
||||
if (updateService != null) {
|
||||
updateService.stopSelf(JOB_ID);
|
||||
@ -494,10 +500,7 @@ public class UpdateService extends JobIntentService {
|
||||
}
|
||||
}
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
|
||||
SharedPreferences.Editor e = prefs.edit();
|
||||
e.putLong(STATE_LAST_UPDATED, System.currentTimeMillis());
|
||||
e.apply();
|
||||
fdroidPrefs.setLastUpdateCheck(System.currentTimeMillis());
|
||||
|
||||
if (errorRepos == 0) {
|
||||
if (changes) {
|
||||
|
@ -1095,7 +1095,7 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
private static void resetTransient(SQLiteDatabase db) {
|
||||
Utils.debugLog(TAG, "Removing all index tables, they will be recreated next time F-Droid updates.");
|
||||
|
||||
Preferences.get().setTriedEmptyUpdate(false);
|
||||
Preferences.get().resetLastUpdateCheck();
|
||||
|
||||
db.beginTransaction();
|
||||
try {
|
||||
@ -1147,7 +1147,7 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
return;
|
||||
}
|
||||
|
||||
Preferences.get().setTriedEmptyUpdate(false);
|
||||
Preferences.get().resetLastUpdateCheck();
|
||||
|
||||
db.execSQL("drop table " + AppMetadataTable.NAME);
|
||||
db.execSQL("drop table " + ApkTable.NAME);
|
||||
|
@ -158,16 +158,9 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationB
|
||||
bottomNavigation.selectTab(adapter.adapterPositionFromItemId(selectedMenuId));
|
||||
}
|
||||
|
||||
/**
|
||||
* The first time the app is run, we will have an empty app list. To deal with this, we will
|
||||
* attempt to update with the default repo. However, if we have tried this at least once, then
|
||||
* don't try to do it automatically again.
|
||||
*/
|
||||
private void initialRepoUpdateIfRequired() {
|
||||
Preferences prefs = Preferences.get();
|
||||
if (!prefs.hasTriedEmptyUpdate()) {
|
||||
if (Preferences.get().isIndexNeverUpdated() && !UpdateService.isUpdating()) {
|
||||
Utils.debugLog(TAG, "We haven't done an update yet. Forcing repo update.");
|
||||
prefs.setTriedEmptyUpdate(true);
|
||||
UpdateService.updateNow(this);
|
||||
}
|
||||
}
|
||||
|
@ -129,6 +129,7 @@ This often occurs with apps installed via Google Play or other sources, if they
|
||||
<item quantity="one">Download update for %1$d app.</item>
|
||||
<item quantity="other">Download updates for %1$d apps.</item>
|
||||
</plurals>
|
||||
<string name="updates_disabled_by_settings">All updates disabled by Data/WiFi Settings</string>
|
||||
|
||||
<string name="ok">OK</string>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user