Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec8daec2 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic '3p_app_account_sync_detail_crash'

* changes:
  Add test for LocalClassLoaderContextThemeWrapper.
  Fix crash when opening account sync detail for external app
parents 06ca3ecc c71f6eec
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -33,10 +33,10 @@ import android.os.UserManager;
import android.support.v7.preference.PreferenceScreen;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.ContextThemeWrapper;

import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.utils.LocalClassLoaderContextThemeWrapper;
import com.android.settingslib.accounts.AuthenticatorHelper;

import java.util.ArrayList;
@@ -156,7 +156,8 @@ abstract class AccountPreferenceBase extends SettingsPreferenceFragment
                            desc.packageName, 0, mUserHandle);
                    final Theme baseTheme = getResources().newTheme();
                    baseTheme.applyStyle(com.android.settings.R.style.Theme_SettingsBase, true);
                    final Context themedCtx = new ContextThemeWrapper(targetCtx, 0);
                    final Context themedCtx =
                            new LocalClassLoaderContextThemeWrapper(getClass(), targetCtx, 0);
                    themedCtx.getTheme().setTo(baseTheme);
                    prefs = getPreferenceManager().inflateFromResource(themedCtx,
                            desc.accountPreferencesId, parent);
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.utils;

import android.annotation.StyleRes;
import android.content.Context;
import android.view.ContextThemeWrapper;

/**
 * {@link ContextThemeWrapper} that provides a local classloader. This guarantees we have a
 * valid {@link ClassLoader} when base context is from an external app.
 */
public class LocalClassLoaderContextThemeWrapper extends ContextThemeWrapper {

    private Class mLocalClass;

    public LocalClassLoaderContextThemeWrapper(Class clazz, Context base,
            @StyleRes int themeResId) {
        super(base, themeResId);
        mLocalClass = clazz;
    }

    @Override
    public ClassLoader getClassLoader() {
        return mLocalClass.getClassLoader();
    }
}
+5 −6
Original line number Diff line number Diff line
@@ -16,13 +16,10 @@
package com.android.settings.dashboard;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.SettingsActivity;

import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.core.PreferenceController;
@@ -31,8 +28,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,6 +38,9 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
+55 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.utils;

import android.content.Context;

import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;

import static com.google.common.truth.Truth.assertThat;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocalClassLoaderContextThemeWrapperTest {

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Context mBaseContext;
    private LocalClassLoaderContextThemeWrapper mContextThemeWrapper;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getClassLoader_shouldUseLocalClassLoader() {
        mContextThemeWrapper = new LocalClassLoaderContextThemeWrapper(
                LocalClassLoaderContextThemeWrapperTest.class, mBaseContext, 0);

        assertThat(mContextThemeWrapper.getClassLoader()).isSameAs(
                LocalClassLoaderContextThemeWrapperTest.class.getClassLoader());
    }
}