13e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root/* 23e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Copyright 2014 The Android Open Source Project 33e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 43e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 53e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * you may not use this file except in compliance with the License. 63e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * You may obtain a copy of the License at 73e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 83e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * http://www.apache.org/licenses/LICENSE-2.0 93e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 103e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Unless required by applicable law or agreed to in writing, software 113e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 123e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * See the License for the specific language governing permissions and 143e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * limitations under the License. 153e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root */ 163e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 173e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootpackage dalvik.system; 183e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 193e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootimport java.lang.reflect.Method; 203e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 213e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootpublic class BlockGuard { 223e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root private static Method m_getThreadPolicy; 233e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root private static Method m_onNetwork; 243e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root static { 253e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root try { 263e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root ClassLoader cl = ClassLoader.getSystemClassLoader(); 273e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root Class<?> c_closeGuard = cl.loadClass("dalvik.system.BlockGuard"); 283e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 293e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root m_getThreadPolicy = c_closeGuard.getDeclaredMethod("getThreadPolicy"); 303e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root m_getThreadPolicy.setAccessible(true); 313e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 323e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root Class<?> c_policy = cl.loadClass("dalvik.system.BlockGuard.Policy"); 333e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 343e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root m_onNetwork = c_policy.getDeclaredMethod("onNetwork"); 353e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root m_onNetwork.setAccessible(true); 363e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } catch (Exception ignored) { 373e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 383e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 393e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 403e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root private BlockGuard() { 413e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 423e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 433e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root public static Policy getThreadPolicy() { 443e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root if (m_getThreadPolicy != null) { 453e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root try { 463e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root Object wrappedPolicy = m_getThreadPolicy.invoke(null); 473e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root return new PolicyWrapper(wrappedPolicy); 483e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } catch (Exception ignored) { 493e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 503e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 513e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root return new PolicyWrapper(null); 523e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 533e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 543e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root public interface Policy { 553e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root void onNetwork(); 563e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 573e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 583e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root public static class PolicyWrapper implements Policy { 593e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root private final Object wrappedPolicy; 603e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 613e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root private PolicyWrapper(Object wrappedPolicy) { 623e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root this.wrappedPolicy = wrappedPolicy; 633e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 643e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 653e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root public void onNetwork() { 663e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root if (m_onNetwork != null && wrappedPolicy != null) { 673e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root try { 683e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root m_onNetwork.invoke(wrappedPolicy); 693e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } catch (Exception ignored) { 703e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 713e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 723e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 733e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 743e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root} 75