Completely removed preferences from app table.
This commit is contained in:
parent
d47967e03d
commit
3e3af3bbf3
@ -81,6 +81,8 @@ import com.nostra13.universalimageloader.core.assist.ImageScaleType;
|
|||||||
import org.fdroid.fdroid.data.Apk;
|
import org.fdroid.fdroid.data.Apk;
|
||||||
import org.fdroid.fdroid.data.ApkProvider;
|
import org.fdroid.fdroid.data.ApkProvider;
|
||||||
import org.fdroid.fdroid.data.App;
|
import org.fdroid.fdroid.data.App;
|
||||||
|
import org.fdroid.fdroid.data.AppPrefs;
|
||||||
|
import org.fdroid.fdroid.data.AppPrefsProvider;
|
||||||
import org.fdroid.fdroid.data.AppProvider;
|
import org.fdroid.fdroid.data.AppProvider;
|
||||||
import org.fdroid.fdroid.data.InstalledAppProvider;
|
import org.fdroid.fdroid.data.InstalledAppProvider;
|
||||||
import org.fdroid.fdroid.data.RepoProvider;
|
import org.fdroid.fdroid.data.RepoProvider;
|
||||||
@ -317,8 +319,7 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
private String activeDownloadUrlString;
|
private String activeDownloadUrlString;
|
||||||
private LocalBroadcastManager localBroadcastManager;
|
private LocalBroadcastManager localBroadcastManager;
|
||||||
|
|
||||||
private boolean startingIgnoreAll;
|
private AppPrefs startingPrefs;
|
||||||
private int startingIgnoreThis;
|
|
||||||
|
|
||||||
private final Context context = this;
|
private final Context context = this;
|
||||||
|
|
||||||
@ -472,10 +473,9 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
.edit()
|
.edit()
|
||||||
.putString(getPackageNameFromIntent(getIntent()), activeDownloadUrlString)
|
.putString(getPackageNameFromIntent(getIntent()), activeDownloadUrlString)
|
||||||
.apply();
|
.apply();
|
||||||
if (app != null && (app.ignoreAllUpdates != startingIgnoreAll
|
if (app != null && !app.getPrefs(this).equals(startingPrefs)) {
|
||||||
|| app.ignoreThisUpdate != startingIgnoreThis)) {
|
|
||||||
Utils.debugLog(TAG, "Updating 'ignore updates', as it has changed since we started the activity...");
|
Utils.debugLog(TAG, "Updating 'ignore updates', as it has changed since we started the activity...");
|
||||||
setIgnoreUpdates(app.packageName, app.ignoreAllUpdates, app.ignoreThisUpdate);
|
AppPrefsProvider.Helper.update(this, app, app.getPrefs(this));
|
||||||
}
|
}
|
||||||
unregisterDownloaderReceiver();
|
unregisterDownloaderReceiver();
|
||||||
}
|
}
|
||||||
@ -646,18 +646,6 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
supportInvalidateOptionsMenu();
|
supportInvalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setIgnoreUpdates(String packageName, boolean ignoreAll, int ignoreVersionCode) {
|
|
||||||
|
|
||||||
Uri uri = AppProvider.getContentUri(packageName);
|
|
||||||
|
|
||||||
ContentValues values = new ContentValues(2);
|
|
||||||
values.put(Schema.AppTable.Cols.IGNORE_ALLUPDATES, ignoreAll ? 1 : 0);
|
|
||||||
values.put(Schema.AppTable.Cols.IGNORE_THISUPDATE, ignoreVersionCode);
|
|
||||||
|
|
||||||
getContentResolver().update(uri, values, null, null);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object onRetainCustomNonConfigurationInstance() {
|
public Object onRetainCustomNonConfigurationInstance() {
|
||||||
return new ConfigurationChangeHelper(activeDownloadUrlString, app);
|
return new ConfigurationChangeHelper(activeDownloadUrlString, app);
|
||||||
@ -711,8 +699,7 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
|
|
||||||
app = newApp;
|
app = newApp;
|
||||||
|
|
||||||
startingIgnoreAll = app.ignoreAllUpdates;
|
startingPrefs = app.getPrefs(this).createClone();
|
||||||
startingIgnoreThis = app.ignoreThisUpdate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshApkList() {
|
private void refreshApkList() {
|
||||||
@ -733,7 +720,7 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packageManager.getLaunchIntentForPackage(app.packageName) != null && app.canAndWantToUpdate()) {
|
if (packageManager.getLaunchIntentForPackage(app.packageName) != null && app.canAndWantToUpdate(this)) {
|
||||||
MenuItemCompat.setShowAsAction(menu.add(
|
MenuItemCompat.setShowAsAction(menu.add(
|
||||||
Menu.NONE, LAUNCH, 1, R.string.menu_launch)
|
Menu.NONE, LAUNCH, 1, R.string.menu_launch)
|
||||||
.setIcon(R.drawable.ic_play_arrow_white),
|
.setIcon(R.drawable.ic_play_arrow_white),
|
||||||
@ -758,13 +745,13 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
menu.add(Menu.NONE, IGNOREALL, 2, R.string.menu_ignore_all)
|
menu.add(Menu.NONE, IGNOREALL, 2, R.string.menu_ignore_all)
|
||||||
.setIcon(R.drawable.ic_do_not_disturb_white)
|
.setIcon(R.drawable.ic_do_not_disturb_white)
|
||||||
.setCheckable(true)
|
.setCheckable(true)
|
||||||
.setChecked(app.ignoreAllUpdates);
|
.setChecked(app.getPrefs(context).ignoreAllUpdates);
|
||||||
|
|
||||||
if (app.hasUpdates()) {
|
if (app.hasUpdates()) {
|
||||||
menu.add(Menu.NONE, IGNORETHIS, 2, R.string.menu_ignore_this)
|
menu.add(Menu.NONE, IGNORETHIS, 2, R.string.menu_ignore_this)
|
||||||
.setIcon(R.drawable.ic_do_not_disturb_white)
|
.setIcon(R.drawable.ic_do_not_disturb_white)
|
||||||
.setCheckable(true)
|
.setCheckable(true)
|
||||||
.setChecked(app.ignoreThisUpdate >= app.suggestedVersionCode);
|
.setChecked(app.getPrefs(context).ignoreThisUpdate >= app.suggestedVersionCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore on devices without Bluetooth
|
// Ignore on devices without Bluetooth
|
||||||
@ -880,17 +867,17 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case IGNOREALL:
|
case IGNOREALL:
|
||||||
app.ignoreAllUpdates ^= true;
|
app.getPrefs(this).ignoreAllUpdates ^= true;
|
||||||
item.setChecked(app.ignoreAllUpdates);
|
item.setChecked(app.getPrefs(this).ignoreAllUpdates);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case IGNORETHIS:
|
case IGNORETHIS:
|
||||||
if (app.ignoreThisUpdate >= app.suggestedVersionCode) {
|
if (app.getPrefs(this).ignoreThisUpdate >= app.suggestedVersionCode) {
|
||||||
app.ignoreThisUpdate = 0;
|
app.getPrefs(this).ignoreThisUpdate = 0;
|
||||||
} else {
|
} else {
|
||||||
app.ignoreThisUpdate = app.suggestedVersionCode;
|
app.getPrefs(this).ignoreThisUpdate = app.suggestedVersionCode;
|
||||||
}
|
}
|
||||||
item.setChecked(app.ignoreThisUpdate > 0);
|
item.setChecked(app.getPrefs(this).ignoreThisUpdate > 0);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case SEND_VIA_BLUETOOTH:
|
case SEND_VIA_BLUETOOTH:
|
||||||
@ -1600,7 +1587,7 @@ public class AppDetails extends AppCompatActivity {
|
|||||||
installed = true;
|
installed = true;
|
||||||
statusView.setText(getString(R.string.details_installed, app.installedVersionName));
|
statusView.setText(getString(R.string.details_installed, app.installedVersionName));
|
||||||
NfcHelper.setAndroidBeam(appDetails, app.packageName);
|
NfcHelper.setAndroidBeam(appDetails, app.packageName);
|
||||||
if (app.canAndWantToUpdate()) {
|
if (app.canAndWantToUpdate(appDetails)) {
|
||||||
updateWanted = true;
|
updateWanted = true;
|
||||||
btMain.setText(R.string.menu_upgrade);
|
btMain.setText(R.string.menu_upgrade);
|
||||||
} else {
|
} else {
|
||||||
|
@ -103,15 +103,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
*/
|
*/
|
||||||
public String[] requirements;
|
public String[] requirements;
|
||||||
|
|
||||||
/**
|
private AppPrefs prefs;
|
||||||
* True if all updates for this app are to be ignored
|
|
||||||
*/
|
|
||||||
public boolean ignoreAllUpdates;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* True if the current update for this app is to be ignored
|
|
||||||
*/
|
|
||||||
public int ignoreThisUpdate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be displayed at 48dp (x1.0)
|
* To be displayed at 48dp (x1.0)
|
||||||
@ -233,12 +225,6 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
case Cols.REQUIREMENTS:
|
case Cols.REQUIREMENTS:
|
||||||
requirements = Utils.parseCommaSeparatedString(cursor.getString(i));
|
requirements = Utils.parseCommaSeparatedString(cursor.getString(i));
|
||||||
break;
|
break;
|
||||||
case Cols.IGNORE_ALLUPDATES:
|
|
||||||
ignoreAllUpdates = cursor.getInt(i) == 1;
|
|
||||||
break;
|
|
||||||
case Cols.IGNORE_THISUPDATE:
|
|
||||||
ignoreThisUpdate = cursor.getInt(i);
|
|
||||||
break;
|
|
||||||
case Cols.ICON_URL:
|
case Cols.ICON_URL:
|
||||||
iconUrl = cursor.getString(i);
|
iconUrl = cursor.getString(i);
|
||||||
break;
|
break;
|
||||||
@ -471,8 +457,6 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
values.put(Cols.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures));
|
values.put(Cols.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures));
|
||||||
values.put(Cols.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements));
|
values.put(Cols.REQUIREMENTS, Utils.serializeCommaSeparatedString(requirements));
|
||||||
values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
|
values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
|
||||||
values.put(Cols.IGNORE_ALLUPDATES, ignoreAllUpdates ? 1 : 0);
|
|
||||||
values.put(Cols.IGNORE_THISUPDATE, ignoreThisUpdate);
|
|
||||||
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
@ -492,13 +476,21 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
return updates;
|
return updates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AppPrefs getPrefs(Context context) {
|
||||||
|
if (prefs == null) {
|
||||||
|
prefs = AppPrefsProvider.Helper.getPrefsOrDefault(context, this);
|
||||||
|
}
|
||||||
|
return prefs;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if there are new versions (apks) available and the user wants
|
* True if there are new versions (apks) available and the user wants
|
||||||
* to be notified about them
|
* to be notified about them
|
||||||
*/
|
*/
|
||||||
public boolean canAndWantToUpdate() {
|
public boolean canAndWantToUpdate(Context context) {
|
||||||
boolean canUpdate = hasUpdates();
|
boolean canUpdate = hasUpdates();
|
||||||
boolean wantsUpdate = !ignoreAllUpdates && ignoreThisUpdate < suggestedVersionCode;
|
AppPrefs prefs = getPrefs(context);
|
||||||
|
boolean wantsUpdate = !prefs.ignoreAllUpdates && prefs.ignoreThisUpdate < suggestedVersionCode;
|
||||||
return canUpdate && wantsUpdate && !isFiltered();
|
return canUpdate && wantsUpdate && !isFiltered();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -591,8 +583,6 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
dest.writeStringArray(this.categories);
|
dest.writeStringArray(this.categories);
|
||||||
dest.writeStringArray(this.antiFeatures);
|
dest.writeStringArray(this.antiFeatures);
|
||||||
dest.writeStringArray(this.requirements);
|
dest.writeStringArray(this.requirements);
|
||||||
dest.writeByte(this.ignoreAllUpdates ? (byte) 1 : (byte) 0);
|
|
||||||
dest.writeInt(this.ignoreThisUpdate);
|
|
||||||
dest.writeString(this.iconUrl);
|
dest.writeString(this.iconUrl);
|
||||||
dest.writeString(this.iconUrlLarge);
|
dest.writeString(this.iconUrlLarge);
|
||||||
dest.writeString(this.installedVersionName);
|
dest.writeString(this.installedVersionName);
|
||||||
@ -631,8 +621,6 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
|
|||||||
this.categories = in.createStringArray();
|
this.categories = in.createStringArray();
|
||||||
this.antiFeatures = in.createStringArray();
|
this.antiFeatures = in.createStringArray();
|
||||||
this.requirements = in.createStringArray();
|
this.requirements = in.createStringArray();
|
||||||
this.ignoreAllUpdates = in.readByte() != 0;
|
|
||||||
this.ignoreThisUpdate = in.readInt();
|
|
||||||
this.iconUrl = in.readString();
|
this.iconUrl = in.readString();
|
||||||
this.iconUrlLarge = in.readString();
|
this.iconUrlLarge = in.readString();
|
||||||
this.installedVersionName = in.readString();
|
this.installedVersionName = in.readString();
|
||||||
|
@ -5,12 +5,12 @@ public class AppPrefs extends ValueObject {
|
|||||||
/**
|
/**
|
||||||
* True if all updates for this app are to be ignored
|
* True if all updates for this app are to be ignored
|
||||||
*/
|
*/
|
||||||
public final boolean ignoreAllUpdates;
|
public boolean ignoreAllUpdates;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if the current update for this app is to be ignored
|
* True if the current update for this app is to be ignored
|
||||||
*/
|
*/
|
||||||
public final int ignoreThisUpdate;
|
public int ignoreThisUpdate;
|
||||||
|
|
||||||
public AppPrefs(int ignoreThis, boolean ignoreAll) {
|
public AppPrefs(int ignoreThis, boolean ignoreAll) {
|
||||||
ignoreThisUpdate = ignoreThis;
|
ignoreThisUpdate = ignoreThis;
|
||||||
@ -21,4 +21,14 @@ public class AppPrefs extends ValueObject {
|
|||||||
return new AppPrefs(0, false);
|
return new AppPrefs(0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return o != null && o instanceof AppPrefs &&
|
||||||
|
((AppPrefs)o).ignoreAllUpdates == ignoreAllUpdates &&
|
||||||
|
((AppPrefs)o).ignoreThisUpdate == ignoreThisUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppPrefs createClone() {
|
||||||
|
return new AppPrefs(ignoreThisUpdate, ignoreAllUpdates);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import org.fdroid.fdroid.Preferences;
|
|||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
import org.fdroid.fdroid.Utils;
|
import org.fdroid.fdroid.Utils;
|
||||||
import org.fdroid.fdroid.data.Schema.ApkTable;
|
import org.fdroid.fdroid.data.Schema.ApkTable;
|
||||||
|
import org.fdroid.fdroid.data.Schema.AppPrefsTable;
|
||||||
import org.fdroid.fdroid.data.Schema.AppTable;
|
import org.fdroid.fdroid.data.Schema.AppTable;
|
||||||
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
|
import org.fdroid.fdroid.data.Schema.AppTable.Cols;
|
||||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||||
@ -186,6 +187,7 @@ public class AppProvider extends FDroidProvider {
|
|||||||
protected static class AppQuerySelection extends QuerySelection {
|
protected static class AppQuerySelection extends QuerySelection {
|
||||||
|
|
||||||
private boolean naturalJoinToInstalled;
|
private boolean naturalJoinToInstalled;
|
||||||
|
private boolean leftJoinPrefs;
|
||||||
|
|
||||||
AppQuerySelection() {
|
AppQuerySelection() {
|
||||||
// The same as no selection, because "1" will always resolve to true when executing the SQL query.
|
// The same as no selection, because "1" will always resolve to true when executing the SQL query.
|
||||||
@ -217,12 +219,25 @@ public class AppProvider extends FDroidProvider {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean leftJoinToPrefs() {
|
||||||
|
return leftJoinPrefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppQuerySelection requireLeftJoinPrefs() {
|
||||||
|
leftJoinPrefs = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public AppQuerySelection add(AppQuerySelection query) {
|
public AppQuerySelection add(AppQuerySelection query) {
|
||||||
QuerySelection both = super.add(query);
|
QuerySelection both = super.add(query);
|
||||||
AppQuerySelection bothWithJoin = new AppQuerySelection(both.getSelection(), both.getArgs());
|
AppQuerySelection bothWithJoin = new AppQuerySelection(both.getSelection(), both.getArgs());
|
||||||
if (this.naturalJoinToInstalled() || query.naturalJoinToInstalled()) {
|
if (this.naturalJoinToInstalled() || query.naturalJoinToInstalled()) {
|
||||||
bothWithJoin.requireNaturalInstalledTable();
|
bothWithJoin.requireNaturalInstalledTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.leftJoinToPrefs() || query.leftJoinToPrefs()) {
|
||||||
|
bothWithJoin.requireLeftJoinPrefs();
|
||||||
|
}
|
||||||
return bothWithJoin;
|
return bothWithJoin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,6 +247,7 @@ public class AppProvider extends FDroidProvider {
|
|||||||
|
|
||||||
private boolean isSuggestedApkTableAdded;
|
private boolean isSuggestedApkTableAdded;
|
||||||
private boolean requiresInstalledTable;
|
private boolean requiresInstalledTable;
|
||||||
|
private boolean requiresLeftJoinToPrefs;
|
||||||
private boolean categoryFieldAdded;
|
private boolean categoryFieldAdded;
|
||||||
private boolean countFieldAppended;
|
private boolean countFieldAppended;
|
||||||
|
|
||||||
@ -262,6 +278,9 @@ public class AppProvider extends FDroidProvider {
|
|||||||
if (selection.naturalJoinToInstalled()) {
|
if (selection.naturalJoinToInstalled()) {
|
||||||
naturalJoinToInstalledTable();
|
naturalJoinToInstalledTable();
|
||||||
}
|
}
|
||||||
|
if (selection.leftJoinToPrefs()) {
|
||||||
|
leftJoinToPrefs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: What if the selection requires a natural join, but we first get a left join
|
// TODO: What if the selection requires a natural join, but we first get a left join
|
||||||
@ -276,6 +295,16 @@ public class AppProvider extends FDroidProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void leftJoinToPrefs() {
|
||||||
|
if (!requiresLeftJoinToPrefs) {
|
||||||
|
leftJoin(
|
||||||
|
AppPrefsTable.NAME,
|
||||||
|
"prefs",
|
||||||
|
"prefs." + AppPrefsTable.Cols.APP_ID + " = " + getTableName() + "." + Cols.ROW_ID);
|
||||||
|
requiresLeftJoinToPrefs = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void leftJoinToInstalledTable() {
|
public void leftJoinToInstalledTable() {
|
||||||
if (!requiresInstalledTable) {
|
if (!requiresInstalledTable) {
|
||||||
leftJoin(
|
leftJoin(
|
||||||
@ -527,11 +556,16 @@ public class AppProvider extends FDroidProvider {
|
|||||||
|
|
||||||
private AppQuerySelection queryCanUpdate() {
|
private AppQuerySelection queryCanUpdate() {
|
||||||
final String app = getTableName();
|
final String app = getTableName();
|
||||||
final String ignoreCurrent = app + "." + Cols.IGNORE_THISUPDATE + "!= " + app + "." + Cols.SUGGESTED_VERSION_CODE;
|
|
||||||
final String ignoreAll = app + "." + Cols.IGNORE_ALLUPDATES + " != 1";
|
// Need to use COALESCE because the prefs join may not resolve any rows, which means the
|
||||||
|
// ignore* fields will be NULL. In that case, we want to instead use a default value of 0.
|
||||||
|
final String ignoreCurrent = " COALESCE(prefs." + AppPrefsTable.Cols.IGNORE_THIS_UPDATE + ", 0) != " + app + "." + Cols.SUGGESTED_VERSION_CODE;
|
||||||
|
final String ignoreAll = "COALESCE(prefs." + AppPrefsTable.Cols.IGNORE_ALL_UPDATES + ", 0) != 1";
|
||||||
|
|
||||||
final String ignore = " (" + ignoreCurrent + " AND " + ignoreAll + ") ";
|
final String ignore = " (" + ignoreCurrent + " AND " + ignoreAll + ") ";
|
||||||
final String where = ignore + " AND " + app + "." + Cols.SUGGESTED_VERSION_CODE + " > installed." + InstalledAppTable.Cols.VERSION_CODE;
|
final String where = ignore + " AND " + app + "." + Cols.SUGGESTED_VERSION_CODE + " > installed." + InstalledAppTable.Cols.VERSION_CODE;
|
||||||
return new AppQuerySelection(where).requireNaturalInstalledTable();
|
|
||||||
|
return new AppQuerySelection(where).requireNaturalInstalledTable().requireLeftJoinPrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private AppQuerySelection queryRepo(long repoId) {
|
private AppQuerySelection queryRepo(long repoId) {
|
||||||
@ -604,9 +638,9 @@ public class AppProvider extends FDroidProvider {
|
|||||||
|
|
||||||
private AppQuerySelection queryIgnored() {
|
private AppQuerySelection queryIgnored() {
|
||||||
final String table = getTableName();
|
final String table = getTableName();
|
||||||
final String selection = table + "." + Cols.IGNORE_ALLUPDATES + " = 1 OR " +
|
final String selection = "COALESCE(prefs." + AppPrefsTable.Cols.IGNORE_ALL_UPDATES + ", 0) = 1 OR " +
|
||||||
table + "." + Cols.IGNORE_THISUPDATE + " >= " + table + "." + Cols.SUGGESTED_VERSION_CODE;
|
"COALESCE(prefs." + AppPrefsTable.Cols.IGNORE_THIS_UPDATE + ", 0) >= " + table + "." + Cols.SUGGESTED_VERSION_CODE;
|
||||||
return new AppQuerySelection(selection);
|
return new AppQuerySelection(selection).requireLeftJoinPrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private AppQuerySelection queryExcludeSwap() {
|
private AppQuerySelection queryExcludeSwap() {
|
||||||
|
@ -96,8 +96,6 @@ class DBHelper extends SQLiteOpenHelper {
|
|||||||
+ AppTable.Cols.ADDED + " string,"
|
+ AppTable.Cols.ADDED + " string,"
|
||||||
+ AppTable.Cols.LAST_UPDATED + " string,"
|
+ AppTable.Cols.LAST_UPDATED + " string,"
|
||||||
+ AppTable.Cols.IS_COMPATIBLE + " int not null,"
|
+ AppTable.Cols.IS_COMPATIBLE + " int not null,"
|
||||||
+ AppTable.Cols.IGNORE_ALLUPDATES + " int not null,"
|
|
||||||
+ AppTable.Cols.IGNORE_THISUPDATE + " int not null,"
|
|
||||||
+ AppTable.Cols.ICON_URL + " text, "
|
+ AppTable.Cols.ICON_URL + " text, "
|
||||||
+ AppTable.Cols.ICON_URL_LARGE + " text, "
|
+ AppTable.Cols.ICON_URL_LARGE + " text, "
|
||||||
+ "primary key(" + AppTable.Cols.PACKAGE_NAME + "));";
|
+ "primary key(" + AppTable.Cols.PACKAGE_NAME + "));";
|
||||||
|
@ -22,20 +22,6 @@ public class RepoPersister {
|
|||||||
|
|
||||||
private static final String TAG = "RepoPersister";
|
private static final String TAG = "RepoPersister";
|
||||||
|
|
||||||
/**
|
|
||||||
* When an app already exists in the db, and we are updating it on the off chance that some
|
|
||||||
* values changed in the index, some fields should not be updated. Rather, they should be
|
|
||||||
* ignored, because they were explicitly set by the user, and hence can't be automatically
|
|
||||||
* overridden by the index.
|
|
||||||
*
|
|
||||||
* NOTE: In the future, these attributes will be moved to a join table, so that the app table
|
|
||||||
* is essentially completely transient, and can be nuked at any time.
|
|
||||||
*/
|
|
||||||
private static final String[] APP_FIELDS_TO_IGNORE = {
|
|
||||||
Schema.AppTable.Cols.IGNORE_ALLUPDATES,
|
|
||||||
Schema.AppTable.Cols.IGNORE_THISUPDATE,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crappy benchmark with a Nexus 4, Android 5.0 on a fairly crappy internet connection I get:
|
* Crappy benchmark with a Nexus 4, Android 5.0 on a fairly crappy internet connection I get:
|
||||||
* * 25 = 37 seconds
|
* * 25 = 37 seconds
|
||||||
@ -219,13 +205,7 @@ public class RepoPersister {
|
|||||||
*/
|
*/
|
||||||
private ContentProviderOperation updateExistingApp(App app) {
|
private ContentProviderOperation updateExistingApp(App app) {
|
||||||
Uri uri = TempAppProvider.getAppUri(app);
|
Uri uri = TempAppProvider.getAppUri(app);
|
||||||
ContentValues values = app.toContentValues();
|
return ContentProviderOperation.newUpdate(uri).withValues(app.toContentValues()).build();
|
||||||
for (final String toIgnore : APP_FIELDS_TO_IGNORE) {
|
|
||||||
if (values.containsKey(toIgnore)) {
|
|
||||||
values.remove(toIgnore);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ContentProviderOperation.newUpdate(uri).withValues(values).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,8 +59,6 @@ public interface Schema {
|
|||||||
String CATEGORIES = "categories";
|
String CATEGORIES = "categories";
|
||||||
String ANTI_FEATURES = "antiFeatures";
|
String ANTI_FEATURES = "antiFeatures";
|
||||||
String REQUIREMENTS = "requirements";
|
String REQUIREMENTS = "requirements";
|
||||||
String IGNORE_ALLUPDATES = "ignoreAllUpdates";
|
|
||||||
String IGNORE_THISUPDATE = "ignoreThisUpdate";
|
|
||||||
String ICON_URL = "iconUrl";
|
String ICON_URL = "iconUrl";
|
||||||
String ICON_URL_LARGE = "iconUrlLarge";
|
String ICON_URL_LARGE = "iconUrlLarge";
|
||||||
|
|
||||||
@ -79,8 +77,7 @@ public interface Schema {
|
|||||||
LICENSE, AUTHOR, EMAIL, WEB_URL, TRACKER_URL, SOURCE_URL,
|
LICENSE, AUTHOR, EMAIL, WEB_URL, TRACKER_URL, SOURCE_URL,
|
||||||
CHANGELOG_URL, DONATE_URL, BITCOIN_ADDR, LITECOIN_ADDR, FLATTR_ID,
|
CHANGELOG_URL, DONATE_URL, BITCOIN_ADDR, LITECOIN_ADDR, FLATTR_ID,
|
||||||
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
|
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
|
||||||
CATEGORIES, ANTI_FEATURES, REQUIREMENTS, IGNORE_ALLUPDATES,
|
CATEGORIES, ANTI_FEATURES, REQUIREMENTS, ICON_URL, ICON_URL_LARGE,
|
||||||
IGNORE_THISUPDATE, ICON_URL, ICON_URL_LARGE,
|
|
||||||
SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME,
|
SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME,
|
||||||
InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME,
|
InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME,
|
||||||
InstalledApp.SIGNATURE,
|
InstalledApp.SIGNATURE,
|
||||||
|
@ -123,7 +123,7 @@ public abstract class AppListAdapter extends CursorAdapter {
|
|||||||
|
|
||||||
final String installedVersionString = app.installedVersionName;
|
final String installedVersionString = app.installedVersionName;
|
||||||
|
|
||||||
if (app.canAndWantToUpdate() && showStatusUpdate()) {
|
if (app.canAndWantToUpdate(mContext) && showStatusUpdate()) {
|
||||||
return String.format(upgradeFromTo,
|
return String.format(upgradeFromTo,
|
||||||
installedVersionString, app.getSuggestedVersionName());
|
installedVersionString, app.getSuggestedVersionName());
|
||||||
}
|
}
|
||||||
|
@ -50,8 +50,6 @@ public abstract class AppListFragment extends ListFragment implements
|
|||||||
AppTable.Cols.InstalledApp.VERSION_NAME,
|
AppTable.Cols.InstalledApp.VERSION_NAME,
|
||||||
AppTable.Cols.SuggestedApk.VERSION_NAME,
|
AppTable.Cols.SuggestedApk.VERSION_NAME,
|
||||||
AppTable.Cols.SUGGESTED_VERSION_CODE,
|
AppTable.Cols.SUGGESTED_VERSION_CODE,
|
||||||
AppTable.Cols.IGNORE_ALLUPDATES,
|
|
||||||
AppTable.Cols.IGNORE_THISUPDATE,
|
|
||||||
AppTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
|
AppTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -191,8 +191,6 @@ public class Assert {
|
|||||||
values.put(AppTable.Cols.DESCRIPTION, "test description");
|
values.put(AppTable.Cols.DESCRIPTION, "test description");
|
||||||
values.put(AppTable.Cols.LICENSE, "GPL?");
|
values.put(AppTable.Cols.LICENSE, "GPL?");
|
||||||
values.put(AppTable.Cols.IS_COMPATIBLE, 1);
|
values.put(AppTable.Cols.IS_COMPATIBLE, 1);
|
||||||
values.put(AppTable.Cols.IGNORE_ALLUPDATES, 0);
|
|
||||||
values.put(AppTable.Cols.IGNORE_THISUPDATE, 0);
|
|
||||||
|
|
||||||
values.putAll(additionalValues);
|
values.putAll(additionalValues);
|
||||||
|
|
||||||
|
@ -89,9 +89,8 @@ public class AppProviderTest extends FDroidProviderTest {
|
|||||||
boolean ignoreAll, int ignoreVercode) {
|
boolean ignoreAll, int ignoreVercode) {
|
||||||
ContentValues values = new ContentValues(3);
|
ContentValues values = new ContentValues(3);
|
||||||
values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVercode);
|
values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVercode);
|
||||||
values.put(Cols.IGNORE_ALLUPDATES, ignoreAll);
|
App app = insertApp(packageName, "App: " + packageName, values);
|
||||||
values.put(Cols.IGNORE_THISUPDATE, ignoreVercode);
|
AppPrefsProvider.Helper.update(context, app, new AppPrefs(ignoreVercode, ignoreAll));
|
||||||
insertApp(packageName, "App: " + packageName, values);
|
|
||||||
|
|
||||||
InstalledAppTestUtils.install(context, packageName, installedVercode, "v" + installedVercode);
|
InstalledAppTestUtils.install(context, packageName, installedVercode, "v" + installedVercode);
|
||||||
}
|
}
|
||||||
@ -113,7 +112,7 @@ public class AppProviderTest extends FDroidProviderTest {
|
|||||||
|
|
||||||
// Can't "update", although can "install"...
|
// Can't "update", although can "install"...
|
||||||
App notInstalled = AppProvider.Helper.findByPackageName(r, "not installed");
|
App notInstalled = AppProvider.Helper.findByPackageName(r, "not installed");
|
||||||
assertFalse(notInstalled.canAndWantToUpdate());
|
assertFalse(notInstalled.canAndWantToUpdate(context));
|
||||||
|
|
||||||
App installedOnlyOneVersionAvailable = AppProvider.Helper.findByPackageName(r, "installed, only one version available");
|
App installedOnlyOneVersionAvailable = AppProvider.Helper.findByPackageName(r, "installed, only one version available");
|
||||||
App installedAlreadyLatestNoIgnore = AppProvider.Helper.findByPackageName(r, "installed, already latest, no ignore");
|
App installedAlreadyLatestNoIgnore = AppProvider.Helper.findByPackageName(r, "installed, already latest, no ignore");
|
||||||
@ -121,21 +120,21 @@ public class AppProviderTest extends FDroidProviderTest {
|
|||||||
App installedAlreadyLatestIgnoreLatest = AppProvider.Helper.findByPackageName(r, "installed, already latest, ignore latest");
|
App installedAlreadyLatestIgnoreLatest = AppProvider.Helper.findByPackageName(r, "installed, already latest, ignore latest");
|
||||||
App installedAlreadyLatestIgnoreOld = AppProvider.Helper.findByPackageName(r, "installed, already latest, ignore old");
|
App installedAlreadyLatestIgnoreOld = AppProvider.Helper.findByPackageName(r, "installed, already latest, ignore old");
|
||||||
|
|
||||||
assertFalse(installedOnlyOneVersionAvailable.canAndWantToUpdate());
|
assertFalse(installedOnlyOneVersionAvailable.canAndWantToUpdate(context));
|
||||||
assertFalse(installedAlreadyLatestNoIgnore.canAndWantToUpdate());
|
assertFalse(installedAlreadyLatestNoIgnore.canAndWantToUpdate(context));
|
||||||
assertFalse(installedAlreadyLatestIgnoreAll.canAndWantToUpdate());
|
assertFalse(installedAlreadyLatestIgnoreAll.canAndWantToUpdate(context));
|
||||||
assertFalse(installedAlreadyLatestIgnoreLatest.canAndWantToUpdate());
|
assertFalse(installedAlreadyLatestIgnoreLatest.canAndWantToUpdate(context));
|
||||||
assertFalse(installedAlreadyLatestIgnoreOld.canAndWantToUpdate());
|
assertFalse(installedAlreadyLatestIgnoreOld.canAndWantToUpdate(context));
|
||||||
|
|
||||||
App installedOldNoIgnore = AppProvider.Helper.findByPackageName(r, "installed, old version, no ignore");
|
App installedOldNoIgnore = AppProvider.Helper.findByPackageName(r, "installed, old version, no ignore");
|
||||||
App installedOldIgnoreAll = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore all");
|
App installedOldIgnoreAll = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore all");
|
||||||
App installedOldIgnoreLatest = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore latest");
|
App installedOldIgnoreLatest = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore latest");
|
||||||
App installedOldIgnoreNewerNotLatest = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore newer, but not latest");
|
App installedOldIgnoreNewerNotLatest = AppProvider.Helper.findByPackageName(r, "installed, old version, ignore newer, but not latest");
|
||||||
|
|
||||||
assertTrue(installedOldNoIgnore.canAndWantToUpdate());
|
assertTrue(installedOldNoIgnore.canAndWantToUpdate(context));
|
||||||
assertFalse(installedOldIgnoreAll.canAndWantToUpdate());
|
assertFalse(installedOldIgnoreAll.canAndWantToUpdate(context));
|
||||||
assertFalse(installedOldIgnoreLatest.canAndWantToUpdate());
|
assertFalse(installedOldIgnoreLatest.canAndWantToUpdate(context));
|
||||||
assertTrue(installedOldIgnoreNewerNotLatest.canAndWantToUpdate());
|
assertTrue(installedOldIgnoreNewerNotLatest.canAndWantToUpdate(context));
|
||||||
|
|
||||||
Cursor canUpdateCursor = r.query(AppProvider.getCanUpdateUri(), Cols.ALL, null, null, null);
|
Cursor canUpdateCursor = r.query(AppProvider.getCanUpdateUri(), Cols.ALL, null, null, null);
|
||||||
assertNotNull(canUpdateCursor);
|
assertNotNull(canUpdateCursor);
|
||||||
@ -348,7 +347,7 @@ public class AppProviderTest extends FDroidProviderTest {
|
|||||||
insertApp(id, name, values);
|
insertApp(id, name, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void insertApp(String id, String name, ContentValues additionalValues) {
|
public App insertApp(String id, String name, ContentValues additionalValues) {
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(Cols.PACKAGE_NAME, id);
|
values.put(Cols.PACKAGE_NAME, id);
|
||||||
@ -359,13 +358,12 @@ public class AppProviderTest extends FDroidProviderTest {
|
|||||||
values.put(Cols.DESCRIPTION, "test description");
|
values.put(Cols.DESCRIPTION, "test description");
|
||||||
values.put(Cols.LICENSE, "GPL?");
|
values.put(Cols.LICENSE, "GPL?");
|
||||||
values.put(Cols.IS_COMPATIBLE, 1);
|
values.put(Cols.IS_COMPATIBLE, 1);
|
||||||
values.put(Cols.IGNORE_ALLUPDATES, 0);
|
|
||||||
values.put(Cols.IGNORE_THISUPDATE, 0);
|
|
||||||
|
|
||||||
values.putAll(additionalValues);
|
values.putAll(additionalValues);
|
||||||
|
|
||||||
Uri uri = AppProvider.getContentUri();
|
Uri uri = AppProvider.getContentUri();
|
||||||
|
|
||||||
contentResolver.insert(uri, values);
|
contentResolver.insert(uri, values);
|
||||||
|
return AppProvider.Helper.findByPackageName(context.getContentResolver(), id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user