Please note that the contents of this offline web site may be out of date. To access the most recent documentation visit the online version .
Note that links that point to online resources are green in color and will open in a new window.
We would love it if you could give us feedback about this material by filling this form (You have to be online to fill it)
AppRestrictions / src / com.example.android.apprestrictions /

CustomRestrictionsFragment.java

       
        1
       
       
        /*
       
       
        2
       
       
        * Copyright (C) 2013 The Android Open Source Project
       
       
        3
       
       
        *
       
       
        4
       
       
        * Licensed under the Apache License, Version 2.0 (the "License");
       
       
        5
       
       
        * you may not use this file except in compliance with the License.
       
       
        6
       
       
        * You may obtain a copy of the License at
       
       
        7
       
       
        *
       
       
        8
       
       
        *      http://www.apache.org/licenses/LICENSE-2.0
       
       
        9
       
       
        *
       
       
        10
       
       
        * Unless required by applicable law or agreed to in writing, software
       
       
        11
       
       
        * distributed under the License is distributed on an "AS IS" BASIS,
       
       
        12
       
       
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
       
        13
       
       
        * See the License for the specific language governing permissions and
       
       
        14
       
       
        * limitations under the License.
       
       
        15
       
       
        */
       
       
        16
       
       
       
       
        17
       
       
        package com.example.android.apprestrictions;
       
       
        18
       
       
       
       
        19
       
       
        import android.app.Activity;
       
       
        20
       
       
        import android.content.Context;
       
       
        21
       
       
        import android.content.Intent;
       
       
        22
       
       
        import android.content.RestrictionEntry;
       
       
        23
       
       
        import android.os.Bundle;
       
       
        24
       
       
        import android.os.UserManager;
       
       
        25
       
       
        import android.preference.CheckBoxPreference;
       
       
        26
       
       
        import android.preference.ListPreference;
       
       
        27
       
       
        import android.preference.MultiSelectListPreference;
       
       
        28
       
       
        import android.preference.Preference;
       
       
        29
       
       
        import android.preference.PreferenceFragment;
       
       
        30
       
       
       
       
        31
       
       
        import java.util.ArrayList;
       
       
        32
       
       
        import java.util.HashSet;
       
       
        33
       
       
        import java.util.List;
       
       
        34
       
       
        import java.util.Set;
       
       
        35
       
       
       
       
        36
       
       
        /**
       
       
        37
       
       
        * This fragment is included in {@code CustomRestrictionsActivity}.  It demonstrates how an app
       
       
        38
       
       
        * can integrate its own custom app restriction settings with the restricted profile feature.
       
       
        39
       
       
        *
       
       
        40
       
       
        * This sample app maintains custom app restriction settings in shared preferences.  Your app
       
       
        41
       
       
        * can use other methods to maintain the settings.  When this activity is invoked
       
       
        42
       
       
        * (from Settings > Users > Restricted Profile), the shared preferences are used to initialize
       
       
        43
       
       
        * the custom configuration on the user interface.
       
       
        44
       
       
        *
       
       
        45
       
       
        * Three sample input types are shown: checkbox, single-choice, and multi-choice.  When the
       
       
        46
       
       
        * settings are modified by the user, the corresponding restriction entries are saved in the
       
       
        47
       
       
        * platform.  The saved restriction entries are retrievable when the app is launched under a
       
       
        48
       
       
        * restricted profile.
       
       
        49
       
       
        */
       
       
        50
       
       
        public class CustomRestrictionsFragment extends PreferenceFragment
       
       
        51
       
       
        implements Preference.OnPreferenceChangeListener {
       
       
        52
       
       
       
       
        53
       
       
        // Shared preference key for the boolean restriction.
       
       
        54
       
       
        private static final String KEY_BOOLEAN_PREF = "pref_boolean";
       
       
        55
       
       
        // Shared preference key for the single-select restriction.
       
       
        56
       
       
        private static final String KEY_CHOICE_PREF = "pref_choice";
       
       
        57
       
       
        // Shared preference key for the multi-select restriction.
       
       
        58
       
       
        private static final String KEY_MULTI_PREF = "pref_multi";
       
       
        59
       
       
       
       
        60
       
       
       
       
        61
       
       
        private List<RestrictionEntry> mRestrictions;
       
       
        62
       
       
        private Bundle mRestrictionsBundle;
       
       
        63
       
       
       
       
        64
       
       
        // Shared preferences for each of the sample input types.
       
       
        65
       
       
        private CheckBoxPreference mBooleanPref;
       
       
        66
       
       
        private ListPreference mChoicePref;
       
       
        67
       
       
        private MultiSelectListPreference mMultiPref;
       
       
        68
       
       
       
       
        69
       
       
        // Restriction entries for each of the sample input types.
       
       
        70
       
       
        private RestrictionEntry mBooleanEntry;
       
       
        71
       
       
        private RestrictionEntry mChoiceEntry;
       
       
        72
       
       
        private RestrictionEntry mMultiEntry;
       
       
        73
       
       
       
       
        74
       
       
        @Override
       
       
        75
       
       
        public void onCreate(Bundle savedInstanceState) {
       
       
        76
       
       
        super.onCreate(savedInstanceState);
       
       
        77
       
       
        addPreferencesFromResource(R.xml.custom_prefs);
       
       
        78
       
       
       
       
        79
       
       
        // This sample app uses shared preferences to maintain app restriction settings.  Your app
       
       
        80
       
       
        // can use other methods to maintain the settings.
       
       
        81
       
       
        mBooleanPref = (CheckBoxPreference) findPreference(KEY_BOOLEAN_PREF);
       
       
        82
       
       
        mChoicePref = (ListPreference) findPreference(KEY_CHOICE_PREF);
       
       
        83
       
       
        mMultiPref = (MultiSelectListPreference) findPreference(KEY_MULTI_PREF);
       
       
        84
       
       
       
       
        85
       
       
        mBooleanPref.setOnPreferenceChangeListener(this);
       
       
        86
       
       
        mChoicePref.setOnPreferenceChangeListener(this);
       
       
        87
       
       
        mMultiPref.setOnPreferenceChangeListener(this);
       
       
        88
       
       
       
       
        89
       
       
        setRetainInstance(true);
       
       
        90
       
       
        }
       
       
        91
       
       
       
       
        92
       
       
        @Override
       
       
        93
       
       
        public void onActivityCreated(Bundle savedInstanceState) {
       
       
        94
       
       
        super.onActivityCreated(savedInstanceState);
       
       
        95
       
       
        final Activity activity = getActivity();
       
       
        96
       
       
       
       
        98
       
       
        // Existing app restriction settings, if exist, can be retrieved from the Bundle.
       
       
        99
       
       
        mRestrictionsBundle =
       
       
        100
       
       
        activity.getIntent().getBundleExtra(Intent.EXTRA_RESTRICTIONS_BUNDLE);
       
       
        101
       
       
       
       
        102
       
       
        if (mRestrictionsBundle == null) {
       
       
        103
       
       
        mRestrictionsBundle =
       
       
        104
       
       
        ((UserManager) activity.getSystemService(Context.USER_SERVICE))
       
       
        105
       
       
        .getApplicationRestrictions(activity.getPackageName());
       
       
        106
       
       
        }
       
       
        107
       
       
       
       
        108
       
       
        if (mRestrictionsBundle == null) {
       
       
        109
       
       
        mRestrictionsBundle = new Bundle();
       
       
        110
       
       
        }
       
       
        111
       
       
       
       
        112
       
       
        mRestrictions = activity.getIntent().getParcelableArrayListExtra(
       
       
        113
       
       
        Intent.EXTRA_RESTRICTIONS_LIST);
       
       
        115
       
       
       
       
        116
       
       
        // Transfers the saved values into the preference hierarchy.
       
       
        117
       
       
        if (mRestrictions != null) {
       
       
        118
       
       
        for (RestrictionEntry entry : mRestrictions) {
       
       
        119
       
       
        if (entry.getKey().equals(GetRestrictionsReceiver.KEY_BOOLEAN)) {
       
       
        120
       
       
        mBooleanPref.setChecked(entry.getSelectedState());
       
       
        121
       
       
        mBooleanEntry = entry;
       
       
        122
       
       
        } else if (entry.getKey().equals(GetRestrictionsReceiver.KEY_CHOICE)) {
       
       
        123
       
       
        mChoicePref.setValue(entry.getSelectedString());
       
       
        124
       
       
        mChoiceEntry = entry;
       
       
        125
       
       
        } else if (entry.getKey().equals(GetRestrictionsReceiver.KEY_MULTI_SELECT)) {
       
       
        126
       
       
        HashSet<String> set = new HashSet<String>();
       
       
        127
       
       
        for (String value : entry.getAllSelectedStrings()) {
       
       
        128
       
       
        set.add(value);
       
       
        129
       
       
        }
       
       
        130
       
       
        mMultiPref.setValues(set);
       
       
        131
       
       
        mMultiEntry = entry;
       
       
        132
       
       
        }
       
       
        133
       
       
        }
       
       
        134
       
       
        } else {
       
       
        135
       
       
        mRestrictions = new ArrayList<RestrictionEntry>();
       
       
        136
       
       
       
       
        137
       
       
        // Initializes the boolean restriction entry and updates its corresponding shared
       
       
        138
       
       
        // preference value.
       
       
        139
       
       
        mBooleanEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_BOOLEAN,
       
       
        140
       
       
        mRestrictionsBundle.getBoolean(GetRestrictionsReceiver.KEY_BOOLEAN, false));
       
       
        141
       
       
        mBooleanEntry.setType(RestrictionEntry.TYPE_BOOLEAN);
       
       
        142
       
       
        mBooleanPref.setChecked(mBooleanEntry.getSelectedState());
       
       
        143
       
       
       
       
        144
       
       
        // Initializes the single choice restriction entry and updates its corresponding
       
       
        145
       
       
        // shared preference value.
       
       
        146
       
       
        mChoiceEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_CHOICE,
       
       
        147
       
       
        mRestrictionsBundle.getString(GetRestrictionsReceiver.KEY_CHOICE));
       
       
        148
       
       
        mChoiceEntry.setType(RestrictionEntry.TYPE_CHOICE);
       
       
        149
       
       
        mChoicePref.setValue(mChoiceEntry.getSelectedString());
       
       
        150
       
       
       
       
        151
       
       
        // Initializes the multi-select restriction entry and updates its corresponding
       
       
        152
       
       
        // shared preference value.
       
       
        153
       
       
        mMultiEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_MULTI_SELECT,
       
       
        154
       
       
        mRestrictionsBundle.getStringArray(
       
       
        155
       
       
        GetRestrictionsReceiver.KEY_MULTI_SELECT));
       
       
        156
       
       
        mMultiEntry.setType(RestrictionEntry.TYPE_MULTI_SELECT);
       
       
        157
       
       
        if (mMultiEntry.getAllSelectedStrings() != null) {
       
       
        158
       
       
        HashSet<String> set = new HashSet<String>();
       
       
        159
       
       
        final String[] values = mRestrictionsBundle.getStringArray(
       
       
        160
       
       
        GetRestrictionsReceiver.KEY_MULTI_SELECT);
       
       
        161
       
       
        if (values != null) {
       
       
        162
       
       
        for (String value : values) {
       
       
        163
       
       
        set.add(value);
       
       
        164
       
       
        }
       
       
        165
       
       
        }
       
       
        166
       
       
        mMultiPref.setValues(set);
       
       
        167
       
       
        }
       
       
        168
       
       
        mRestrictions.add(mBooleanEntry);
       
       
        169
       
       
        mRestrictions.add(mChoiceEntry);
       
       
        170
       
       
        mRestrictions.add(mMultiEntry);
       
       
        171
       
       
        }
       
       
        172
       
       
        // Prepares result to be passed back to the Settings app when the custom restrictions
       
       
        173
       
       
        // activity finishes.
       
       
        174
       
       
        Intent intent = new Intent(getActivity().getIntent());
       
       
        175
       
       
        intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS_LIST,
       
       
        176
       
       
        new ArrayList<RestrictionEntry>(mRestrictions));
       
       
        177
       
       
        getActivity().setResult(Activity.RESULT_OK, intent);
       
       
        178
       
       
        }
       
       
        179
       
       
       
       
        180
       
       
        @Override
       
       
        181
       
       
        public boolean onPreferenceChange(Preference preference, Object newValue) {
       
       
        182
       
       
        if (preference == mBooleanPref) {
       
       
        183
       
       
        mBooleanEntry.setSelectedState((Boolean) newValue);
       
       
        184
       
       
        } else if (preference == mChoicePref) {
       
       
        185
       
       
        mChoiceEntry.setSelectedString((String) newValue);
       
       
        186
       
       
        } else if (preference == mMultiPref) {
       
       
        187
       
       
        String[] selectedStrings = new String[((Set<String>)newValue).size()];
       
       
        188
       
       
        int i = 0;
       
       
        189
       
       
        for (String value : (Set<String>) newValue) {
       
       
        190
       
       
        selectedStrings[i++] = value;
       
       
        191
       
       
        }
       
       
        192
       
       
        mMultiEntry.setAllSelectedStrings(selectedStrings);
       
       
        193
       
       
        }
       
       
        194
       
       
       
       
        195
       
       
        // Saves all the app restriction configuration changes from the custom activity.
       
       
        196
       
       
        Intent intent = new Intent(getActivity().getIntent());
       
       
        197
       
       
        intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS_LIST,
       
       
        198
       
       
        new ArrayList<RestrictionEntry>(mRestrictions));
       
       
        199
       
       
        getActivity().setResult(Activity.RESULT_OK, intent);
       
       
        200
       
       
        return true;
       
       
        201
       
       
        }
       
       
        202
       
       
        }