SystemUpdatePolicy.java revision 5faad8e4cdf04211239f076b5d073e26d0ae3207
18027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu/*
28027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * Copyright (C) 2015 The Android Open Source Project
38027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu *
48027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * Licensed under the Apache License, Version 2.0 (the "License");
58027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * you may not use this file except in compliance with the License.
68027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * You may obtain a copy of the License at
78027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu *
88027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu *      http://www.apache.org/licenses/LICENSE-2.0
98027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu *
108027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * Unless required by applicable law or agreed to in writing, software
118027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * distributed under the License is distributed on an "AS IS" BASIS,
128027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * See the License for the specific language governing permissions and
148027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu * limitations under the License.
158027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu */
168027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
178027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xupackage android.app.admin;
188027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
198027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xuimport android.annotation.IntDef;
208027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xuimport android.os.PersistableBundle;
218027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
228027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xuimport java.lang.annotation.Retention;
238027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xuimport java.lang.annotation.RetentionPolicy;
248027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
258027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu/**
265faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu * A class that represents a local system update policy set by the device owner.
278027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu *
285faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu * @see DevicePolicyManager#setSystemUpdatePolicy
295faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu * @see DevicePolicyManager#getSystemUpdatePolicy
308027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu */
315faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xupublic class SystemUpdatePolicy {
328027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
338027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /** @hide */
348027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    @IntDef({
358027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        TYPE_INSTALL_AUTOMATIC,
368027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        TYPE_INSTALL_WINDOWED,
378027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        TYPE_POSTPONE})
388027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    @Retention(RetentionPolicy.SOURCE)
395faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu    @interface SystemUpdatePolicyType {}
408027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
418027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
425faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Install system update automatically as soon as one is available.
438027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
448027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public static final int TYPE_INSTALL_AUTOMATIC = 1;
458027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
468027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
475faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Install system update automatically within a daily maintenance window, for a maximum of 30
485faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * days. After the expiration the policy will no longer be effective and the system should
495faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * revert back to its normal behavior as if no policy were set. The only exception is
505faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * {@link #TYPE_INSTALL_AUTOMATIC} which should still take effect to install system update
515faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * immediately.
528027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
538027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public static final int TYPE_INSTALL_WINDOWED = 2;
548027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
558027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
565faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Incoming system update will be blocked for a maximum of 30 days, after which the system
575faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * should revert back to its normal behavior as if no policy were set. The only exception is
585faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * {@link #TYPE_INSTALL_AUTOMATIC} which should still take effect to install system update
595faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * immediately.
608027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
618027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public static final int TYPE_POSTPONE = 3;
628027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
638027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    private static final String KEY_POLICY_TYPE = "policy_type";
648027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    private static final String KEY_INSTALL_WINDOW_START = "install_window_start";
658027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    private static final String KEY_INSTALL_WINDOW_END = "install_window_end";
668027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
678027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    private PersistableBundle mPolicy;
688027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
695faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu    public  SystemUpdatePolicy() {
708027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy = new PersistableBundle();
718027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
728027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
738027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
745faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Construct an SystemUpdatePolicy object from a bundle.
758027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @hide
768027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
775faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu    public SystemUpdatePolicy(PersistableBundle in) {
788027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy = new PersistableBundle(in);
798027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
808027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
818027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
828027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * Retrieve the underlying bundle where the policy is stored.
838027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @hide
848027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
858027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public PersistableBundle getPolicyBundle() {
868027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        return new PersistableBundle(mPolicy);
878027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
888027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
898027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
905faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Set the policy to: install update automatically as soon as one is available.
915faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     *
925faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * @see #TYPE_INSTALL_AUTOMATIC
938027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
948027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public void setAutomaticInstallPolicy() {
958027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.clear();
968027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.putInt(KEY_POLICY_TYPE, TYPE_INSTALL_AUTOMATIC);
978027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
988027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
998027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1005faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Set the policy to: new system update will only be installed automatically when the system
1018027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * clock is inside a daily maintenance window. If the start and end times are the same, the
1025faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * window is considered to include the WHOLE 24 hours, that is, updates can install at any time.
1035faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * If the given window in invalid, a {@link SystemUpdatePolicy.InvalidWindowException} will be
1045faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * thrown. If start time is later than end time, the window is considered spanning midnight,
1055faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * i.e. end time donates a time on the next day. The maintenance window will last for 30 days,
1065faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * after which the system should revert back to its normal behavior as if no policy were set.
1078027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     *
1088027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @param startTime the start of the maintenance window, measured as the number of minutes from
1095faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     *            midnight in the device's local time. Must be in the range of [0, 1440).
1108027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @param endTime the end of the maintenance window, measured as the number of minutes from
1115faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     *            midnight in the device's local time. Must be in the range of [0, 1440).
1125faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * @see #TYPE_INSTALL_WINDOWED
1138027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1148027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public void setWindowedInstallPolicy(int startTime, int endTime) throws InvalidWindowException{
1158027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        if (startTime < 0 || startTime >= 1440 || endTime < 0 || endTime >= 1440) {
1168027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            throw new InvalidWindowException("startTime and endTime must be inside [0, 1440)");
1178027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        }
1188027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.clear();
1198027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.putInt(KEY_POLICY_TYPE, TYPE_INSTALL_WINDOWED);
1208027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.putInt(KEY_INSTALL_WINDOW_START, startTime);
1218027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.putInt(KEY_INSTALL_WINDOW_END, endTime);
1228027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1238027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1248027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1255faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Set the policy to: block installation for a maximum period of 30 days. After expiration the
1265faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * system should revert back to its normal behavior as if no policy were set.
1275faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     *
1285faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * @see #TYPE_POSTPONE
1298027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1308027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public void setPostponeInstallPolicy() {
1318027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.clear();
1328027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        mPolicy.putInt(KEY_POLICY_TYPE, TYPE_POSTPONE);
1338027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1348027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1358027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1365faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Returns the type of system update policy.
1378027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     *
1388027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @return an integer, either one of {@link #TYPE_INSTALL_AUTOMATIC},
1398027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * {@link #TYPE_INSTALL_WINDOWED} and {@link #TYPE_POSTPONE}, or -1 if no policy has been set.
1408027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1415faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu    @SystemUpdatePolicyType
1428027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public int getPolicyType() {
1438027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        return mPolicy.getInt(KEY_POLICY_TYPE, -1);
1448027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1458027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1468027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1478027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * Get the start of the maintenance window.
1488027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     *
1498027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @return the start of the maintenance window measured as the number of minutes from midnight,
1508027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * or -1 if the policy does not have a maintenance window.
1518027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1528027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public int getInstallWindowStart() {
1538027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        if (getPolicyType() == TYPE_INSTALL_WINDOWED) {
1548027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            return mPolicy.getInt(KEY_INSTALL_WINDOW_START, -1);
1558027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        } else {
1568027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            return -1;
1578027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        }
1588027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1598027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1608027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1618027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * Get the end of the maintenance window.
1628027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     *
1638027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * @return the end of the maintenance window measured as the number of minutes from midnight,
1648027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * or -1 if the policy does not have a maintenance window.
1658027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1668027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public int getInstallWindowEnd() {
1678027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        if (getPolicyType() == TYPE_INSTALL_WINDOWED) {
1688027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            return mPolicy.getInt(KEY_INSTALL_WINDOW_END, -1);
1698027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        } else {
1708027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            return -1;
1718027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        }
1728027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1738027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1748027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    @Override
1758027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public String toString() {
1768027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        return mPolicy.toString();
1778027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1788027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
1798027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    /**
1805faad8e4cdf04211239f076b5d073e26d0ae3207Rubin Xu     * Exception thrown by {@link SystemUpdatePolicy#setWindowedInstallPolicy(int, int)} in case the
1818027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     * specified window is invalid.
1828027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu     */
1838027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    public static class InvalidWindowException extends Exception {
1848027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        public InvalidWindowException(String reason) {
1858027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu            super(reason);
1868027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu        }
1878027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu    }
1888027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu}
1898027a4ffc285ba39df3a262abfff1cfdd6dd31dbRubin Xu
190