/* * Copyright (C) 2006 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.tws.plugin.core; import java.io.File; import java.util.ArrayList; import tws.component.log.TwsLog; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; import android.util.ArrayMap; import com.tws.plugin.core.android.HackContextImpl; import com.tws.plugin.manager.PluginManagerHelper; public class PluginBaseContextWrapper extends ContextWrapper { private static final String TAG = "rick_Print_TT:PluginBaseContextWrapper"; public PluginBaseContextWrapper(Context base) { super(base); } @Override public void sendBroadcast(Intent intent) { TwsLog.d(TAG, " call sendBroadcast :" + intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendBroadcast(item); } } @Override public void sendBroadcast(Intent intent, String receiverPermission) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendBroadcast(item, receiverPermission); } } @Override public void sendOrderedBroadcast(Intent intent, String receiverPermission) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendOrderedBroadcast(item, receiverPermission); } } @Override public void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendOrderedBroadcast(item, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void sendBroadcastAsUser(Intent intent, UserHandle user) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendBroadcastAsUser(item, user); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendBroadcastAsUser(item, user, receiverPermission); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendOrderedBroadcastAsUser(item, user, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras); } } @Override public void sendStickyBroadcast(Intent intent) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendStickyBroadcast(item); } } @Override public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendStickyOrderedBroadcast(item, resultReceiver, scheduler, initialCode, initialData, initialExtras); } } @Override public void removeStickyBroadcast(Intent intent) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.removeStickyBroadcast(item); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendStickyBroadcastAsUser(item, user); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { TwsLog.d(TAG, intent.toString()); ArrayList<Intent> list = PluginIntentResolver.resolveReceiver(intent); for (Intent item : list) { super.sendStickyOrderedBroadcastAsUser(item, user, resultReceiver, scheduler, initialCode, initialData, initialExtras); } } @Override public ComponentName startService(Intent service) { TwsLog.d(TAG, "call startService " + service.toString()); PluginIntentResolver.resolveService(service); return super.startService(service); } @Override public boolean stopService(Intent name) { TwsLog.d(TAG, "call stopService " + name.toString()); PluginIntentResolver.resolveService(name); return super.stopService(name); } @Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { TwsLog.d(TAG, "call bindService " + service.toString()); PluginIntentResolver.resolveService(service); return super.bindService(service, conn, flags); } @Override public Context createPackageContext(String packageName, int flags) throws PackageManager.NameNotFoundException { TwsLog.d(TAG, "call createPackageContext packageName is " + packageName + " flags is " + flags); // 这个方法有2个作用 // 1、context返回插件宿主packageName时,安装插件中的contentprovider时会用到它, // 被android.app.ActiviThread这个类调用。 // 2、可以方便的创建一个插件ApplicationContext副本。用于满足一些特定的业务需要 if (PluginManagerHelper.getPluginDescriptorByPluginId(packageName) != null) { return PluginLoader.getNewPluginApplicationContext(packageName); } return super.createPackageContext(packageName, flags); } private File mHostPreferencesFile = null; @Override public SharedPreferences getSharedPreferences(String name, int mode) { if (Build.VERSION.SDK_INT > 23) { synchronized (PluginContextTheme.class) { HackContextImpl impl = new HackContextImpl(getContextImpl()); ArrayMap<String, File> mSharedPrefsPaths = impl.getSharedPrefsPaths(); String privateDir = PluginLoader.getApplication().getFilesDir().getParentFile().getPath(); if (mHostPreferencesFile == null) { mHostPreferencesFile = new File(privateDir, "shared_prefs"); } String preferencesDir = mHostPreferencesFile.getAbsolutePath(); TwsLog.d(TAG, "preferencesDir is " + preferencesDir); if (mSharedPrefsPaths != null) { File file = mSharedPrefsPaths.get(name); if (file != null) { TwsLog.d(TAG, "file path is " + file.getAbsolutePath() + " parent is " + file.getParent()); } if (file != null && !file.getParent().equals(preferencesDir)) { mSharedPrefsPaths.remove(name);// 置空之后再get会触发重建,则getDataDir有机会生效 } } File preferencesDirFile = impl.getPreferencesDir(); if (preferencesDirFile == null || !preferencesDirFile.getAbsolutePath().equals(preferencesDir)) { impl.setPreferencesDir(mHostPreferencesFile); } } } return super.getSharedPreferences(name, mode); } protected Object getContextImpl() { int dep = 0;// 这个dep限制是以防万一陷入死循环 Context base = getBaseContext(); while (base instanceof ContextWrapper && dep < 10) { base = ((ContextWrapper) base).getBaseContext(); dep++; } if (HackContextImpl.instanceOf(base)) { return base; } return null; } protected SharedPreferences getSharedPreferencesEx(String name, int mode) { return super.getSharedPreferences(name, mode); } }