Merge "Allow activities/services to have app loaders" into rvc-dev am: b390818c60 am: 1aa1d90211
Change-Id: I330d35ee64ea95ea20e36f1e03782976158a0f6f
This commit is contained in:
@@ -75,6 +75,7 @@ import android.content.res.CompatibilityInfo;
|
|||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.Resources.Theme;
|
import android.content.res.Resources.Theme;
|
||||||
|
import android.content.res.loader.ResourcesLoader;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteDebug;
|
import android.database.sqlite.SQLiteDebug;
|
||||||
import android.database.sqlite.SQLiteDebug.DbStats;
|
import android.database.sqlite.SQLiteDebug.DbStats;
|
||||||
@@ -3283,6 +3284,12 @@ public final class ActivityThread extends ClientTransactionHandler {
|
|||||||
r.mPendingRemoveWindow = null;
|
r.mPendingRemoveWindow = null;
|
||||||
r.mPendingRemoveWindowManager = null;
|
r.mPendingRemoveWindowManager = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Activity resources must be initialized with the same loaders as the
|
||||||
|
// application context.
|
||||||
|
appContext.getResources().addLoaders(
|
||||||
|
app.getResources().getLoaders().toArray(new ResourcesLoader[0]));
|
||||||
|
|
||||||
appContext.setOuterContext(activity);
|
appContext.setOuterContext(activity);
|
||||||
activity.attach(appContext, this, getInstrumentation(), r.token,
|
activity.attach(appContext, this, getInstrumentation(), r.token,
|
||||||
r.ident, app, r.intent, r.activityInfo, title, r.parent,
|
r.ident, app, r.intent, r.activityInfo, title, r.parent,
|
||||||
@@ -4083,6 +4090,11 @@ public final class ActivityThread extends ClientTransactionHandler {
|
|||||||
java.lang.ClassLoader cl = packageInfo.getClassLoader();
|
java.lang.ClassLoader cl = packageInfo.getClassLoader();
|
||||||
service = packageInfo.getAppFactory()
|
service = packageInfo.getAppFactory()
|
||||||
.instantiateService(cl, data.info.name, data.intent);
|
.instantiateService(cl, data.info.name, data.intent);
|
||||||
|
// Service resources must be initialized with the same loaders as the application
|
||||||
|
// context.
|
||||||
|
context.getResources().addLoaders(
|
||||||
|
app.getResources().getLoaders().toArray(new ResourcesLoader[0]));
|
||||||
|
|
||||||
context.setOuterContext(service);
|
context.setOuterContext(service);
|
||||||
service.attach(context, this, data.info.name, data.token, app,
|
service.attach(context, this, data.info.name, data.token, app,
|
||||||
ActivityManager.getService());
|
ActivityManager.getService());
|
||||||
|
|||||||
22
tests/AppResourcesLoaders/Android.bp
Normal file
22
tests/AppResourcesLoaders/Android.bp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// Copyright (C) 2020 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
android_test {
|
||||||
|
name: "AppResourcesLoaders",
|
||||||
|
srcs: ["**/*.java"],
|
||||||
|
sdk_version: "current",
|
||||||
|
java_resources: [":AppResourcesLoaders_Overlay"]
|
||||||
|
}
|
||||||
31
tests/AppResourcesLoaders/AndroidManifest.xml
Normal file
31
tests/AppResourcesLoaders/AndroidManifest.xml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.android.example.loaders">
|
||||||
|
<application android:label="AppResourcesLoaders"
|
||||||
|
android:name=".LoadersApplication">
|
||||||
|
<activity android:name=".LoaderActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity android:name=".LoaderActivityIsolated"
|
||||||
|
android:process="com.android.phone" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
19
tests/AppResourcesLoaders/Overlay/Android.bp
Normal file
19
tests/AppResourcesLoaders/Overlay/Android.bp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Copyright (C) 2020 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
android_test_helper_app {
|
||||||
|
name: "AppResourcesLoaders_Overlay",
|
||||||
|
}
|
||||||
21
tests/AppResourcesLoaders/Overlay/AndroidManifest.xml
Normal file
21
tests/AppResourcesLoaders/Overlay/AndroidManifest.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.android.example.loaders">
|
||||||
|
<application android:hasCode="false" />
|
||||||
|
</manifest>
|
||||||
20
tests/AppResourcesLoaders/Overlay/res/values/values.xml
Normal file
20
tests/AppResourcesLoaders/Overlay/res/values/values.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string name="loader_present">Loaders present: true</string>
|
||||||
|
<public type="string" name="loader_present" id="0x7f010000" />
|
||||||
|
</resources>
|
||||||
25
tests/AppResourcesLoaders/res/layout/activity_isolated.xml
Normal file
25
tests/AppResourcesLoaders/res/layout/activity_isolated.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView android:text="@string/loader_present"
|
||||||
|
style="@style/ButtonStyle"/>
|
||||||
|
</LinearLayout>
|
||||||
29
tests/AppResourcesLoaders/res/layout/activity_main.xml
Normal file
29
tests/AppResourcesLoaders/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView android:text="@string/loader_present"
|
||||||
|
style="@style/ButtonStyle"/>
|
||||||
|
|
||||||
|
<Button android:id="@+id/btn_isolated_activity"
|
||||||
|
android:text="Launch Isolated Activity"
|
||||||
|
style="@style/ButtonStyle"/>
|
||||||
|
</LinearLayout>
|
||||||
23
tests/AppResourcesLoaders/res/values/styles.xml
Normal file
23
tests/AppResourcesLoaders/res/values/styles.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<style name="ButtonStyle" >
|
||||||
|
<item name="android:layout_width">wrap_content</item>
|
||||||
|
<item name="android:layout_height">40dp</item>
|
||||||
|
<item name="android:layout_centerInParent">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
20
tests/AppResourcesLoaders/res/values/values.xml
Normal file
20
tests/AppResourcesLoaders/res/values/values.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2020 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string name="loader_present">Loaders present: false</string>
|
||||||
|
<public type="string" name="loader_present" id="0x7f010000" />
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.example.loaders;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
public class LoaderActivity extends Activity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void attachBaseContext(Context newBase) {
|
||||||
|
super.attachBaseContext(newBase);
|
||||||
|
final String loaderPresentOnAttach =
|
||||||
|
newBase.getResources().getString(R.string.loader_present);
|
||||||
|
if (loaderPresentOnAttach == null || !loaderPresentOnAttach.endsWith("true")) {
|
||||||
|
throw new AssertionError("Loader not present in attachBaseContext");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
findViewById(R.id.btn_isolated_activity).setOnClickListener((v) -> {
|
||||||
|
startActivity(new Intent(this, LoaderActivityIsolated.class));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.example.loaders;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
public class LoaderActivityIsolated extends Activity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void attachBaseContext(Context newBase) {
|
||||||
|
super.attachBaseContext(newBase);
|
||||||
|
final String loaderPresentOnAttach =
|
||||||
|
newBase.getResources().getString(R.string.loader_present);
|
||||||
|
if (loaderPresentOnAttach == null || !loaderPresentOnAttach.endsWith("true")) {
|
||||||
|
throw new AssertionError("Loader not present in attachBaseContext");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_isolated);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.example.loaders;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.content.res.loader.ResourcesLoader;
|
||||||
|
import android.content.res.loader.ResourcesProvider;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class LoadersApplication extends Application {
|
||||||
|
private static final String TAG = "LoadersApplication";
|
||||||
|
private static final String LOADER_RESOURCES_APK = "AppResourcesLoaders_Overlay.apk";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
try {
|
||||||
|
final Resources resources = getResources();
|
||||||
|
final ResourcesLoader loader = new ResourcesLoader();
|
||||||
|
loader.addProvider(ResourcesProvider.loadFromApk(copyResource(LOADER_RESOURCES_APK)));
|
||||||
|
resources.addLoaders(loader);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalStateException("Failed to load loader resources ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParcelFileDescriptor copyResource(String fileName) throws IOException {
|
||||||
|
final File apkFile = new File(getFilesDir(), fileName);
|
||||||
|
final InputStream is = getClassLoader().getResourceAsStream(LOADER_RESOURCES_APK);
|
||||||
|
final FileOutputStream os = new FileOutputStream(apkFile);
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
int count;
|
||||||
|
while ((count = is.read(buffer)) != -1) {
|
||||||
|
os.write(buffer, 0, count);
|
||||||
|
}
|
||||||
|
return ParcelFileDescriptor.open(apkFile, ParcelFileDescriptor.MODE_READ_ONLY);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user