Search in sources :

Example 11 with App

use of org.fdroid.fdroid.data.App in project fdroidclient by f-droid.

the class ProperMultiIndexUpdaterTest method assertRepoTakesPriority.

private void assertRepoTakesPriority(@RepoIdentifier String higherPriority) {
    Map<String, App> allApps = allApps();
    // Provided by both the "Main" and "Conflicting" repo, so need to fetch metdata from the
    // repo with the higher "Conflicting" repo has a higher priority.
    App adAway = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), "org.adaway");
    assertAdAwayMetadata(adAway, higherPriority);
    assertAdAwayMetadata(allApps.get("org.adaway"), higherPriority);
    // This is only provided by the "Main" or "Archive" repo. Both the main and archive repo both
    // pull their metadata from the same build recipe in fdroidserver. The only difference is that
    // the archive repository contains .apks from further back, but their metadata is the same.
    App a2048 = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), "com.uberspot.a2048");
    assert2048Metadata(a2048, "Normal");
    assert2048Metadata(allApps.get("com.uberspot.a2048"), "Normal");
    // This is only provided by the "Conflicting" repo.
    App calendar = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), "org.dgtale.icsimport");
    assertCalendarMetadata(calendar, "Conflicting");
    assertCalendarMetadata(allApps.get("org.dgtale.icsimport"), "Conflicting");
    // This is only provided by the "Main" repo.
    App adb = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), "siir.es.adbWireless");
    assertAdbMetadata(adb, "Normal");
    assertAdbMetadata(allApps.get("siir.es.adbWireless"), "Normal");
}
Also used : App(org.fdroid.fdroid.data.App)

Example 12 with App

use of org.fdroid.fdroid.data.App in project fdroidclient by f-droid.

the class InstallManagerService method onStartCommand.

/**
 * This goes through a series of checks to make sure that the incoming
 * {@link Intent} is still valid.  The default {@link Intent#getAction() action}
 * in the logic is {@link #ACTION_INSTALL} since it is the most complicate
 * case.  Since the {@code Intent} will be redelivered by Android if the
 * app was killed, this needs to check that it still makes sense to handle.
 * <p>
 * For example, if F-Droid is killed while installing, it might not receive
 * the message that the install completed successfully. The checks need to be
 * as specific as possible so as not to block things like installing updates
 * with the same {@link PackageInfo#versionCode}, which happens sometimes,
 * and is allowed by Android.
 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Utils.debugLog(TAG, "onStartCommand " + intent);
    String canonicalUrl = intent.getDataString();
    if (TextUtils.isEmpty(canonicalUrl)) {
        Utils.debugLog(TAG, "empty canonicalUrl, nothing to do");
        return START_NOT_STICKY;
    }
    String action = intent.getAction();
    if (ACTION_CANCEL.equals(action)) {
        DownloaderService.cancel(this, canonicalUrl);
        Apk apk = appUpdateStatusManager.getApk(canonicalUrl);
        if (apk != null) {
            Utils.debugLog(TAG, "also canceling OBB downloads");
            DownloaderService.cancel(this, apk.getPatchObbUrl());
            DownloaderService.cancel(this, apk.getMainObbUrl());
        }
        return START_NOT_STICKY;
    } else if (ACTION_INSTALL.equals(action)) {
        if (!isPendingInstall(canonicalUrl)) {
            Log.i(TAG, "Ignoring INSTALL that is not Pending Install: " + intent);
            return START_NOT_STICKY;
        }
    } else {
        Log.i(TAG, "Ignoring unknown intent action: " + intent);
        return START_NOT_STICKY;
    }
    if (!intent.hasExtra(EXTRA_APP) || !intent.hasExtra(EXTRA_APK)) {
        Utils.debugLog(TAG, canonicalUrl + " did not include both an App and Apk instance, ignoring");
        return START_NOT_STICKY;
    }
    if ((flags & START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY && !DownloaderService.isQueuedOrActive(canonicalUrl)) {
        Utils.debugLog(TAG, canonicalUrl + " finished downloading while InstallManagerService was killed.");
        appUpdateStatusManager.removeApk(canonicalUrl);
        return START_NOT_STICKY;
    }
    App app = intent.getParcelableExtra(EXTRA_APP);
    Apk apk = intent.getParcelableExtra(EXTRA_APK);
    if (app == null || apk == null) {
        Utils.debugLog(TAG, "Intent had null EXTRA_APP and/or EXTRA_APK: " + intent);
        return START_NOT_STICKY;
    }
    PackageInfo packageInfo = Utils.getPackageInfo(this, apk.packageName);
    if ((flags & START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY && packageInfo != null && packageInfo.versionCode == apk.versionCode && TextUtils.equals(packageInfo.versionName, apk.versionName)) {
        Log.i(TAG, "INSTALL Intent no longer valid since its installed, ignoring: " + intent);
        return START_NOT_STICKY;
    }
    FDroidApp.resetMirrorVars();
    DownloaderService.setTimeout(FDroidApp.getTimeout());
    appUpdateStatusManager.addApk(apk, AppUpdateStatusManager.Status.Downloading, null);
    registerPackageDownloaderReceivers(canonicalUrl);
    getMainObb(canonicalUrl, apk);
    getPatchObb(canonicalUrl, apk);
    File apkFilePath = ApkCache.getApkDownloadPath(this, apk.getCanonicalUrl());
    long apkFileSize = apkFilePath.length();
    if (!apkFilePath.exists() || apkFileSize < apk.size) {
        Utils.debugLog(TAG, "download " + canonicalUrl + " " + apkFilePath);
        DownloaderService.queueUsingRandomMirror(this, apk.repoId, canonicalUrl);
    } else if (ApkCache.apkIsCached(apkFilePath, apk)) {
        Utils.debugLog(TAG, "skip download, we have it, straight to install " + canonicalUrl + " " + apkFilePath);
        sendBroadcast(intent.getData(), Downloader.ACTION_STARTED, apkFilePath);
        sendBroadcast(intent.getData(), Downloader.ACTION_COMPLETE, apkFilePath);
    } else {
        Utils.debugLog(TAG, "delete and download again " + canonicalUrl + " " + apkFilePath);
        apkFilePath.delete();
        DownloaderService.queueUsingRandomMirror(this, apk.repoId, canonicalUrl);
    }
    // if killed before completion, retry Intent
    return START_REDELIVER_INTENT;
}
Also used : FDroidApp(org.fdroid.fdroid.FDroidApp) App(org.fdroid.fdroid.data.App) PackageInfo(android.content.pm.PackageInfo) Apk(org.fdroid.fdroid.data.Apk) File(java.io.File)

Example 13 with App

use of org.fdroid.fdroid.data.App in project fdroidclient by f-droid.

the class ScreenShotsActivity method onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    FDroidApp fdroidApp = (FDroidApp) getApplication();
    fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screenshots);
    String packageName = getIntent().getStringExtra(EXTRA_PACKAGE_NAME);
    int startPosition = getIntent().getIntExtra(EXTRA_START_POSITION, 0);
    App app = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
    String[] screenshots = app.getAllScreenshots(this);
    ViewPager viewPager = (ViewPager) findViewById(R.id.screenshot_view_pager);
    ScreenShotPagerAdapter adapter = new ScreenShotPagerAdapter(getSupportFragmentManager(), screenshots);
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(startPosition);
    // display some nice animation while swiping
    viewPager.setPageTransformer(true, new DepthPageTransformer());
}
Also used : FDroidApp(org.fdroid.fdroid.FDroidApp) App(org.fdroid.fdroid.data.App) FDroidApp(org.fdroid.fdroid.FDroidApp) ViewPager(androidx.viewpager.widget.ViewPager)

Example 14 with App

use of org.fdroid.fdroid.data.App in project fdroidclient by f-droid.

the class AppListAdapter method onBindViewHolder.

@Override
public void onBindViewHolder(@NonNull StandardAppListItemController holder, int position) {
    cursor.moveToPosition(position);
    final App app = new App(cursor);
    holder.bindModel(app);
    if (app.isDisabledByAntiFeatures(activity)) {
        holder.itemView.setVisibility(View.GONE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
        if (this.hasHiddenAppsCallback != null) {
            this.hasHiddenAppsCallback.run();
        }
    } else {
        holder.itemView.setVisibility(View.VISIBLE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    }
}
Also used : App(org.fdroid.fdroid.data.App) RecyclerView(androidx.recyclerview.widget.RecyclerView)

Example 15 with App

use of org.fdroid.fdroid.data.App in project fdroidclient by f-droid.

the class Assert method ensureApp.

public static App ensureApp(Context context, String packageName) {
    App app = AppProvider.Helper.findSpecificApp(context.getContentResolver(), packageName, 1, AppMetadataTable.Cols.ALL);
    if (app == null) {
        insertApp(context, packageName, packageName);
        app = AppProvider.Helper.findSpecificApp(context.getContentResolver(), packageName, 1, AppMetadataTable.Cols.ALL);
    }
    assertNotNull(app);
    return app;
}
Also used : App(org.fdroid.fdroid.data.App)

Aggregations

App (org.fdroid.fdroid.data.App)53 FDroidApp (org.fdroid.fdroid.FDroidApp)10 Apk (org.fdroid.fdroid.data.Apk)10 Test (org.junit.Test)6 Intent (android.content.Intent)5 PackageInfo (android.content.pm.PackageInfo)5 PackageManager (android.content.pm.PackageManager)5 ArrayList (java.util.ArrayList)5 FDroidProviderTest (org.fdroid.fdroid.data.FDroidProviderTest)5 PendingIntent (android.app.PendingIntent)4 SpannableStringBuilder (android.text.SpannableStringBuilder)4 NotificationCompat (androidx.core.app.NotificationCompat)4 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)4 IOException (java.io.IOException)4 Repo (org.fdroid.fdroid.data.Repo)4 RepoXMLHandlerTest (org.fdroid.fdroid.data.RepoXMLHandlerTest)4 CoreMatchers.containsString (org.hamcrest.CoreMatchers.containsString)4 ContentResolver (android.content.ContentResolver)3 ContentValues (android.content.ContentValues)3 JsonFactory (com.fasterxml.jackson.core.JsonFactory)3