Merge branch 'blank-versionName' into 'master'
handle Blank versionName Closes #1418 See merge request fdroid/fdroidclient!673
This commit is contained in:
commit
59ec2a7751
@ -641,7 +641,13 @@ public class AppDetails2 extends AppCompatActivity
|
|||||||
Log.e(TAG, "uninstall aborted with errorMessage: " + errorMessage);
|
Log.e(TAG, "uninstall aborted with errorMessage: " + errorMessage);
|
||||||
|
|
||||||
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AppDetails2.this);
|
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AppDetails2.this);
|
||||||
alertBuilder.setTitle(R.string.uninstall_error_notify_title);
|
Uri uri = intent.getData();
|
||||||
|
if (uri == null) {
|
||||||
|
alertBuilder.setTitle(getString(R.string.uninstall_error_notify_title, ""));
|
||||||
|
} else {
|
||||||
|
alertBuilder.setTitle(getString(R.string.uninstall_error_notify_title,
|
||||||
|
uri.getSchemeSpecificPart()));
|
||||||
|
}
|
||||||
alertBuilder.setMessage(errorMessage);
|
alertBuilder.setMessage(errorMessage);
|
||||||
alertBuilder.setNeutralButton(android.R.string.ok, null);
|
alertBuilder.setNeutralButton(android.R.string.ok, null);
|
||||||
alertBuilder.create().show();
|
alertBuilder.create().show();
|
||||||
|
@ -10,6 +10,7 @@ import android.os.Environment;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
import com.fasterxml.jackson.annotation.JacksonInject;
|
import com.fasterxml.jackson.annotation.JacksonInject;
|
||||||
@ -65,6 +66,7 @@ public class Apk extends ValueObject implements Comparable<Apk>, Parcelable {
|
|||||||
|
|
||||||
// these come directly from the index metadata
|
// these come directly from the index metadata
|
||||||
public String packageName;
|
public String packageName;
|
||||||
|
@Nullable
|
||||||
public String versionName;
|
public String versionName;
|
||||||
public int versionCode;
|
public int versionCode;
|
||||||
public int size; // Size in bytes - 0 means we don't know!
|
public int size; // Size in bytes - 0 means we don't know!
|
||||||
|
@ -95,7 +95,7 @@ public class DBHelper extends SQLiteOpenHelper {
|
|||||||
static final String CREATE_TABLE_APK =
|
static final String CREATE_TABLE_APK =
|
||||||
"CREATE TABLE " + ApkTable.NAME + " ( "
|
"CREATE TABLE " + ApkTable.NAME + " ( "
|
||||||
+ ApkTable.Cols.APP_ID + " integer not null, "
|
+ ApkTable.Cols.APP_ID + " integer not null, "
|
||||||
+ ApkTable.Cols.VERSION_NAME + " text not null, "
|
+ ApkTable.Cols.VERSION_NAME + " text, "
|
||||||
+ ApkTable.Cols.REPO_ID + " integer not null, "
|
+ ApkTable.Cols.REPO_ID + " integer not null, "
|
||||||
+ ApkTable.Cols.HASH + " text not null, "
|
+ ApkTable.Cols.HASH + " text not null, "
|
||||||
+ ApkTable.Cols.VERSION_CODE + " int not null,"
|
+ ApkTable.Cols.VERSION_CODE + " int not null,"
|
||||||
@ -215,7 +215,7 @@ public class DBHelper extends SQLiteOpenHelper {
|
|||||||
+ "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") "
|
+ "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") "
|
||||||
+ " );";
|
+ " );";
|
||||||
|
|
||||||
protected static final int DB_VERSION = 78;
|
protected static final int DB_VERSION = 79;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
@ -323,6 +323,16 @@ public class DBHelper extends SQLiteOpenHelper {
|
|||||||
addIgnoreVulnPref(db, oldVersion);
|
addIgnoreVulnPref(db, oldVersion);
|
||||||
addLiberapayID(db, oldVersion);
|
addLiberapayID(db, oldVersion);
|
||||||
addUserMirrorsFields(db, oldVersion);
|
addUserMirrorsFields(db, oldVersion);
|
||||||
|
removeNotNullFromVersionName(db, oldVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeNotNullFromVersionName(SQLiteDatabase db, int oldVersion) {
|
||||||
|
if (oldVersion >= 79) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i(TAG, "Forcing repo refresh to remove NOT NULL from " + ApkTable.Cols.VERSION_NAME);
|
||||||
|
resetTransient(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addUserMirrorsFields(SQLiteDatabase db, int oldVersion) {
|
private void addUserMirrorsFields(SQLiteDatabase db, int oldVersion) {
|
||||||
|
@ -10,6 +10,7 @@ import android.content.pm.Signature;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Log;
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.fdroid.fdroid.AppUpdateStatusManager;
|
import org.fdroid.fdroid.AppUpdateStatusManager;
|
||||||
import org.fdroid.fdroid.Hasher;
|
import org.fdroid.fdroid.Hasher;
|
||||||
@ -290,6 +291,7 @@ public class InstalledAppProviderService extends IntentService {
|
|||||||
* into the database when under test.
|
* into the database when under test.
|
||||||
*/
|
*/
|
||||||
static void insertAppIntoDb(Context context, PackageInfo packageInfo, String hashType, String hash) {
|
static void insertAppIntoDb(Context context, PackageInfo packageInfo, String hashType, String hash) {
|
||||||
|
Log.d(TAG, "insertAppIntoDb " + packageInfo.packageName);
|
||||||
Uri uri = InstalledAppProvider.getContentUri();
|
Uri uri = InstalledAppProvider.getContentUri();
|
||||||
ContentValues contentValues = new ContentValues();
|
ContentValues contentValues = new ContentValues();
|
||||||
contentValues.put(InstalledAppTable.Cols.Package.NAME, packageInfo.packageName);
|
contentValues.put(InstalledAppTable.Cols.Package.NAME, packageInfo.packageName);
|
||||||
@ -307,6 +309,7 @@ public class InstalledAppProviderService extends IntentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deleteAppFromDb(Context context, String packageName) {
|
static void deleteAppFromDb(Context context, String packageName) {
|
||||||
|
Log.d(TAG, "deleteAppFromDb " + packageName);
|
||||||
Uri uri = InstalledAppProvider.getAppUri(packageName);
|
Uri uri = InstalledAppProvider.getAppUri(packageName);
|
||||||
context.getContentResolver().delete(uri, null, null);
|
context.getContentResolver().delete(uri, null, null);
|
||||||
}
|
}
|
||||||
|
@ -357,9 +357,12 @@ public final class LocalRepoManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to start a tag called "name", fill it with text "text", and then
|
* Helper function to start a tag called "name", fill it with text "text", and then
|
||||||
* end the tag in a more concise manner.
|
* end the tag in a more concise manner. If "text" is blank, skip the tag entirely.
|
||||||
*/
|
*/
|
||||||
private void tag(String name, String text) throws IOException {
|
private void tag(String name, String text) throws IOException {
|
||||||
|
if (TextUtils.isEmpty(text)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
serializer.startTag("", name).text(text).endTag("", name);
|
serializer.startTag("", name).text(text).endTag("", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,7 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
import org.fdroid.fdroid.Utils;
|
|
||||||
import org.fdroid.fdroid.data.InstalledAppProviderService;
|
import org.fdroid.fdroid.data.InstalledAppProviderService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,12 +27,12 @@ public class PackageManagerReceiver extends BroadcastReceiver {
|
|||||||
InstalledAppProviderService.insert(context, intent.getData());
|
InstalledAppProviderService.insert(context, intent.getData());
|
||||||
} else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
|
} else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
|
||||||
if (TextUtils.equals(context.getPackageName(), intent.getData().getSchemeSpecificPart())) {
|
if (TextUtils.equals(context.getPackageName(), intent.getData().getSchemeSpecificPart())) {
|
||||||
Utils.debugLog(TAG, "Ignoring request to remove ourselves from cache.");
|
Log.i(TAG, "Ignoring request to remove ourselves from cache.");
|
||||||
} else {
|
} else {
|
||||||
InstalledAppProviderService.delete(context, intent.getData());
|
InstalledAppProviderService.delete(context, intent.getData());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Utils.debugLog(TAG, "unsupported action: " + action + " " + intent);
|
Log.i(TAG, "unsupported action: " + action + " " + intent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,7 @@ import static org.hamcrest.core.IsNot.not;
|
|||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotEquals;
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
@ -419,6 +420,8 @@ public class IndexV1UpdaterTest extends FDroidProviderTest {
|
|||||||
|
|
||||||
assertEquals(1, apps.length);
|
assertEquals(1, apps.length);
|
||||||
assertEquals(1, packages.size());
|
assertEquals(1, packages.size());
|
||||||
|
List<Apk> cacerts = packages.get("info.guardianproject.cacert");
|
||||||
|
assertEquals(2, cacerts.size());
|
||||||
assertEquals(1488828510109L, repo.timestamp);
|
assertEquals(1488828510109L, repo.timestamp);
|
||||||
assertEquals("GPLv3", apps[0].license);
|
assertEquals("GPLv3", apps[0].license);
|
||||||
|
|
||||||
@ -427,12 +430,16 @@ public class IndexV1UpdaterTest extends FDroidProviderTest {
|
|||||||
assertNotEquals("secret", field);
|
assertNotEquals("secret", field);
|
||||||
}
|
}
|
||||||
|
|
||||||
Apk apk = packages.get("info.guardianproject.cacert").get(0);
|
Apk apk = cacerts.get(0);
|
||||||
assertEquals("e013db095e8da843fae5ac44be6152e51377ee717e5c8a7b6d913d7720566b5a", apk.hash);
|
assertEquals("e013db095e8da843fae5ac44be6152e51377ee717e5c8a7b6d913d7720566b5a", apk.hash);
|
||||||
Set<String> packageFields = getFields(apk);
|
Set<String> packageFields = getFields(apk);
|
||||||
for (String field : packageFields) {
|
for (String field : packageFields) {
|
||||||
assertNotEquals("secret", field);
|
assertNotEquals("secret", field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apk = cacerts.get(1);
|
||||||
|
assertEquals("2353d1235e8da843fae5ac44be6152e513123e717e5c8a7b6d913d7720566b5a", apk.hash);
|
||||||
|
assertNull(apk.versionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<String> getFields(Object instance) {
|
private Set<String> getFields(Object instance) {
|
||||||
|
@ -87,6 +87,56 @@
|
|||||||
],
|
],
|
||||||
"versionCode": 14,
|
"versionCode": 14,
|
||||||
"versionName": "0.1.8"
|
"versionName": "0.1.8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"added": 1400014500000,
|
||||||
|
"apkName": "Courier-0.0.apk",
|
||||||
|
"hash": "2353d1235e8da843fae5ac44be6152e513123e717e5c8a7b6d913d7720566b5a",
|
||||||
|
"hashType": "sha256",
|
||||||
|
"minSdkVersion": "9",
|
||||||
|
"nativecode": [
|
||||||
|
"armeabi",
|
||||||
|
"x86"
|
||||||
|
],
|
||||||
|
"packageName": "info.guardianproject.courier",
|
||||||
|
"sig": "d70ac6a02b53ebdd1354ea7af7b9ceee",
|
||||||
|
"size": 16536125,
|
||||||
|
"targetSdkVersion": "15",
|
||||||
|
"uses-permission": [
|
||||||
|
[
|
||||||
|
"android.permission.READ_EXTERNAL_STORAGE",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.INTERNET",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.BLUETOOTH",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.BLUETOOTH_ADMIN",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.VIBRATE",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.ACCESS_NETWORK_STATE",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.WRITE_EXTERNAL_STORAGE",
|
||||||
|
null
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"android.permission.ACCESS_WIFI_STATE",
|
||||||
|
null
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"versionCode": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user