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