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