Search in sources :

Example 1 with WebViewProviderInfo

use of android.webkit.WebViewProviderInfo in project android_frameworks_base by ResurrectionRemix.

the class WebViewUpdateService method onStart.

@Override
public void onStart() {
    mWebViewUpdatedReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
            switch(intent.getAction()) {
                case Intent.ACTION_PACKAGE_REMOVED:
                    // run the update-logic twice.
                    if (intent.getExtras().getBoolean(Intent.EXTRA_REPLACING))
                        return;
                    mImpl.packageStateChanged(packageNameFromIntent(intent), PACKAGE_REMOVED, userId);
                    break;
                case Intent.ACTION_PACKAGE_CHANGED:
                    // entire package, not just a component
                    if (entirePackageChanged(intent)) {
                        mImpl.packageStateChanged(packageNameFromIntent(intent), PACKAGE_CHANGED, userId);
                    }
                    break;
                case Intent.ACTION_PACKAGE_ADDED:
                    mImpl.packageStateChanged(packageNameFromIntent(intent), (intent.getExtras().getBoolean(Intent.EXTRA_REPLACING) ? PACKAGE_ADDED_REPLACED : PACKAGE_ADDED), userId);
                    break;
                case Intent.ACTION_USER_ADDED:
                    mImpl.handleNewUser(userId);
                    break;
            }
        }
    };
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_PACKAGE_ADDED);
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
    filter.addDataScheme("package");
    // Make sure we only receive intents for WebView packages from our config file.
    for (WebViewProviderInfo provider : mImpl.getWebViewPackages()) {
        filter.addDataSchemeSpecificPart(provider.packageName, PatternMatcher.PATTERN_LITERAL);
    }
    getContext().registerReceiverAsUser(mWebViewUpdatedReceiver, UserHandle.ALL, filter, null, /* broadcast permission */
    null);
    IntentFilter userAddedFilter = new IntentFilter();
    userAddedFilter.addAction(Intent.ACTION_USER_ADDED);
    getContext().registerReceiverAsUser(mWebViewUpdatedReceiver, UserHandle.ALL, userAddedFilter, null, /* broadcast permission */
    null);
    publishBinderService("webviewupdate", new BinderService(), true);
}
Also used : Context(android.content.Context) IntentFilter(android.content.IntentFilter) WebViewProviderInfo(android.webkit.WebViewProviderInfo) Intent(android.content.Intent) BroadcastReceiver(android.content.BroadcastReceiver)

Example 2 with WebViewProviderInfo

use of android.webkit.WebViewProviderInfo in project android_frameworks_base by ResurrectionRemix.

the class WebViewUpdateServiceImpl method updateFallbackStateOnPackageChange.

/**
     * Handle the enabled-state of our fallback package, i.e. if there exists some non-fallback
     * package that is valid (and available by default) then disable the fallback package,
     * otherwise, enable the fallback package.
     */
private void updateFallbackStateOnPackageChange(String changedPackage, int changedState) {
    if (!mSystemInterface.isFallbackLogicEnabled())
        return;
    WebViewProviderInfo[] webviewProviders = mSystemInterface.getWebViewPackages();
    // A package was changed / updated / downgraded, early out if it is not one of the
    // webview packages that are available by default.
    boolean changedPackageAvailableByDefault = false;
    for (WebViewProviderInfo provider : webviewProviders) {
        if (provider.packageName.equals(changedPackage)) {
            if (provider.availableByDefault) {
                changedPackageAvailableByDefault = true;
            }
            break;
        }
    }
    if (!changedPackageAvailableByDefault)
        return;
    updateFallbackState(webviewProviders, false);
}
Also used : WebViewProviderInfo(android.webkit.WebViewProviderInfo)

Example 3 with WebViewProviderInfo

use of android.webkit.WebViewProviderInfo in project android_frameworks_base by ResurrectionRemix.

the class WebViewUpdateServiceTest method checkRecoverAfterFailListingWebviewPackages.

/**
     * Test that we can recover correctly from failing to list WebView packages.
     * settingsChange: whether to fail during changeProviderAndSetting or packageStateChanged
     */
public void checkRecoverAfterFailListingWebviewPackages(boolean settingsChange) {
    String firstPackage = "first";
    String secondPackage = "second";
    WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo(firstPackage, "", true, /* default available */
    false, /* fallback */
    null), new WebViewProviderInfo(secondPackage, "", true, /* default available */
    false, /* fallback */
    null) };
    checkCertainPackageUsedAfterWebViewBootPreparation(firstPackage, packages);
    // Make both packages invalid so that we fail listing WebView packages
    mTestSystemImpl.setPackageInfo(createPackageInfo(firstPackage, true, /* enabled */
    false, /* valid */
    true));
    mTestSystemImpl.setPackageInfo(createPackageInfo(secondPackage, true, /* enabled */
    false, /* valid */
    true));
    // Change package to hit the webview packages listing problem.
    if (settingsChange) {
        mWebViewUpdateServiceImpl.changeProviderAndSetting(secondPackage);
    } else {
        mWebViewUpdateServiceImpl.packageStateChanged(secondPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0);
    }
    WebViewProviderResponse response = mWebViewUpdateServiceImpl.waitForAndGetProvider();
    assertEquals(WebViewFactory.LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES, response.status);
    // Make second package valid and verify that we can load it again
    mTestSystemImpl.setPackageInfo(createPackageInfo(secondPackage, true, /* enabled */
    true, /* valid */
    true));
    mWebViewUpdateServiceImpl.packageStateChanged(secondPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0);
    checkPreparationPhasesForPackage(secondPackage, 1);
}
Also used : WebViewProviderInfo(android.webkit.WebViewProviderInfo) WebViewProviderResponse(android.webkit.WebViewProviderResponse)

Example 4 with WebViewProviderInfo

use of android.webkit.WebViewProviderInfo in project android_frameworks_base by ResurrectionRemix.

the class WebViewUpdateServiceTest method testSeveralRelros.

public void testSeveralRelros() {
    String singlePackage = "singlePackage";
    checkCertainPackageUsedAfterWebViewBootPreparation(singlePackage, new WebViewProviderInfo[] { new WebViewProviderInfo(singlePackage, "", true, /*def av*/
    false, null) }, 2);
}
Also used : WebViewProviderInfo(android.webkit.WebViewProviderInfo)

Example 5 with WebViewProviderInfo

use of android.webkit.WebViewProviderInfo in project android_frameworks_base by ResurrectionRemix.

the class WebViewUpdateServiceTest method checkChangingProviderDuringRelroCreation.

private void checkChangingProviderDuringRelroCreation(boolean settingsChange) {
    String firstPackage = "first";
    String secondPackage = "second";
    WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo(firstPackage, "", true, false, null), new WebViewProviderInfo(secondPackage, "", true, false, null) };
    setupWithPackages(packages);
    if (settingsChange) {
        // Have all packages be enabled, so that we can change provider however we want to
        setEnabledAndValidPackageInfos(packages);
    } else {
        // Have all packages be disabled so that we can change one to enabled later
        for (WebViewProviderInfo wpi : packages) {
            mTestSystemImpl.setPackageInfo(createPackageInfo(wpi.packageName, false, /* enabled */
            true, /* valid */
            true));
        }
    }
    CountDownLatch countdown = new CountDownLatch(1);
    mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
    Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(Mockito.argThat(new IsPackageInfoWithName(firstPackage)));
    assertEquals(firstPackage, mWebViewUpdateServiceImpl.getCurrentWebViewPackageName());
    new Thread(new Runnable() {

        @Override
        public void run() {
            WebViewProviderResponse threadResponse = mWebViewUpdateServiceImpl.waitForAndGetProvider();
            assertEquals(WebViewFactory.LIBLOAD_SUCCESS, threadResponse.status);
            assertEquals(secondPackage, threadResponse.packageInfo.packageName);
            // Verify that we killed the first package
            Mockito.verify(mTestSystemImpl).killPackageDependents(Mockito.eq(firstPackage));
            countdown.countDown();
        }
    }).start();
    try {
        // Let the new thread run / be blocked
        Thread.sleep(500);
    } catch (InterruptedException e) {
    }
    if (settingsChange) {
        mWebViewUpdateServiceImpl.changeProviderAndSetting(secondPackage);
    } else {
        // Switch provider by enabling the second one
        mTestSystemImpl.setPackageInfo(createPackageInfo(secondPackage, true, /* enabled */
        true, /* valid */
        true));
        mWebViewUpdateServiceImpl.packageStateChanged(secondPackage, WebViewUpdateService.PACKAGE_CHANGED, 0);
    }
    mWebViewUpdateServiceImpl.notifyRelroCreationCompleted();
    // first package done, should start on second
    Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(Mockito.argThat(new IsPackageInfoWithName(secondPackage)));
    mWebViewUpdateServiceImpl.notifyRelroCreationCompleted();
    // second package done, the other thread should now be unblocked
    try {
        countdown.await();
    } catch (InterruptedException e) {
    }
}
Also used : WebViewProviderInfo(android.webkit.WebViewProviderInfo) WebViewProviderResponse(android.webkit.WebViewProviderResponse) CountDownLatch(java.util.concurrent.CountDownLatch)

Aggregations

WebViewProviderInfo (android.webkit.WebViewProviderInfo)68 WebViewProviderResponse (android.webkit.WebViewProviderResponse)28 RemoteException (android.os.RemoteException)8 MediumTest (android.test.suitebuilder.annotation.MediumTest)8 ArrayList (java.util.ArrayList)8 Test (org.junit.Test)8 ApplicationInfo (android.content.pm.ApplicationInfo)7 PackageManager (android.content.pm.PackageManager)7 BroadcastReceiver (android.content.BroadcastReceiver)4 Context (android.content.Context)4 Intent (android.content.Intent)4 IntentFilter (android.content.IntentFilter)4 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)4 Signature (android.content.pm.Signature)4 CountDownLatch (java.util.concurrent.CountDownLatch)4 DialogInterface (android.content.DialogInterface)1 OnClickListener (android.content.DialogInterface.OnClickListener)1