Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8ce24fb authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Split system and adtl. perm managment fragments

This allows for easier lifecycle management. As both fragments are very
similar common code is moved to a superclass.

Test: Opened system perm fragment, resized, opened addtl. perm fragment,
resized, back, back. Permissions show up correctly.

Change-Id: I9313c7d97df8f74c33ac899d2b037f3df75506b6
Fixes: 32008494
parent e6163b3d
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -21,8 +21,9 @@ import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear;
import com.android.packageinstaller.DeviceUtils;
import com.android.packageinstaller.permission.ui.handheld.ManageStandardPermissionsFragment;
import com.android.packageinstaller.permission.ui.wear.AppPermissionsFragmentWear;

public final class ManagePermissionsActivity extends OverlayTouchActivity {
    private static final String LOG_TAG = "ManagePermissionsActivity";
@@ -47,8 +48,7 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity {
                    fragment = com.android.packageinstaller.permission.ui.television
                            .ManagePermissionsFragment.newInstance();
                } else {
                    fragment = com.android.packageinstaller.permission.ui.handheld
                            .ManagePermissionsFragment.newInstance();
                    fragment = ManageStandardPermissionsFragment.newInstance();
                }
            } break;

+46 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.packageinstaller.permission.ui.handheld;

import android.view.MenuItem;

/**
 * Fragment that allows the user to manage custom permissions.
 */
public class ManageCustomPermissionsFragment extends ManagePermissionsFragment {
    @Override
    public void onStart() {
        super.onStart();

        getActivity().setTitle(com.android.packageinstaller.R.string.additional_permissions);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                getFragmentManager().popBackStack();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void updatePermissionsUi() {
        updatePermissionsUi(false);
    }
}
+50 −130
Original line number Diff line number Diff line
@@ -16,21 +16,15 @@
package com.android.packageinstaller.permission.ui.handheld;

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen;
import android.util.ArraySet;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.PermissionApps;
import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
@@ -40,25 +34,20 @@ import com.android.packageinstaller.permission.utils.Utils;

import java.util.List;

public final class ManagePermissionsFragment extends PermissionsFrameFragment
/**
 * Superclass for fragments allowing the user to manage permissions.
 */
abstract class ManagePermissionsFragment extends PermissionsFrameFragment
        implements PermissionGroups.PermissionsGroupsChangeCallback,
        Preference.OnPreferenceClickListener {
    private static final String LOG_TAG = "ManagePermissionsFragment";

    private static final String OS_PKG = "android";

    private static final String EXTRA_PREFS_KEY = "extra_prefs_key";
    static final String OS_PKG = "android";

    private ArraySet<String> mLauncherPkgs;

    private PermissionGroups mPermissions;

    private PreferenceScreen mExtraScreen;

    public static ManagePermissionsFragment newInstance() {
        return new ManagePermissionsFragment();
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
@@ -73,19 +62,9 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
    }

    @Override
    public void onResume() {
        super.onResume();
    public void onStart() {
        super.onStart();
        mPermissions.refresh();
        updatePermissionsUi();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            getActivity().finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
@@ -108,27 +87,34 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
        return true;
    }

    @Override
    public void onPermissionGroupsChanged() {
        updatePermissionsUi();
    /**
     * @return the permissions
     */
    protected PermissionGroups getPermissions() {
        return mPermissions;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        bindPermissionUi(getActivity(), getView());
    public void onPermissionGroupsChanged() {
        updatePermissionsUi();
    }

    private static void bindPermissionUi(Context context, View rootView) {
        if (context == null || rootView == null) {
            return;
        }
    }
    /**
     * Update the preferences to show the new {@link #getPermissions() permissions}.
     */
    protected abstract void updatePermissionsUi();

    private void updatePermissionsUi() {
    /**
     * Add preferences for all permissions of a type to the preference screen.
     *
     * @param addSystemPermissions If the permissions added should be system permissions or not
     *
     * @return The preference screen the permissions were added to
     */
    protected PreferenceScreen updatePermissionsUi(boolean addSystemPermissions) {
        Context context = getActivity();
        if (context == null) {
            return;
            return null;
        }

        List<PermissionGroup> groups = mPermissions.getGroups();
@@ -136,6 +122,8 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
        if (screen == null) {
            screen = getPreferenceManager().createPreferenceScreen(getActivity());
            setPreferenceScreen(screen);
        } else {
            screen.removeAll();
        }

        // Use this to speed up getting the info for all of the PermissionApps below.
@@ -144,10 +132,9 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
        for (PermissionGroup group : groups) {
            boolean isSystemPermission = group.getDeclaringPackage().equals(OS_PKG);

            if (addSystemPermissions == isSystemPermission) {
                Preference preference = findPreference(group.getName());
            if (preference == null && mExtraScreen != null) {
                preference = mExtraScreen.findPreference(group.getName());
            }

                if (preference == null) {
                    preference = new Preference(context);
                    preference.setOnPreferenceClickListener(this);
@@ -155,23 +142,15 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
                    preference.setIcon(Utils.applyTint(context, group.getIcon(),
                            android.R.attr.colorControlNormal));
                    preference.setTitle(group.getLabel());
                // Set blank summary so that no resizing/jumping happens when the summary is loaded.
                    // Set blank summary so that no resizing/jumping happens when the summary is
                    // loaded.
                    preference.setSummary(" ");
                    preference.setPersistent(false);
                if (isSystemPermission) {
                    screen.addPreference(preference);
                } else {
                    if (mExtraScreen == null) {
                        mExtraScreen = getPreferenceManager().createPreferenceScreen(context);
                    }
                    mExtraScreen.addPreference(preference);
                }
                }
                final Preference finalPref = preference;

            new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() {
                @Override
                public void onPermissionsLoaded(PermissionApps permissionApps) {
                new PermissionApps(getContext(), group.getName(), permissionApps -> {
                    if (getActivity() == null) {
                        return;
                    }
@@ -179,72 +158,13 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment
                    int total = permissionApps.getTotalCount(mLauncherPkgs);
                    finalPref.setSummary(getString(R.string.app_permissions_group_summary,
                            granted, total));
                }
                }, cache).refresh(false);
            }

        if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0
                && screen.findPreference(EXTRA_PREFS_KEY) == null) {
            Preference extraScreenPreference = new Preference(context);
            extraScreenPreference.setKey(EXTRA_PREFS_KEY);
            extraScreenPreference.setIcon(Utils.applyTint(context,
                    R.drawable.ic_more_items,
                    android.R.attr.colorControlNormal));
            extraScreenPreference.setTitle(R.string.additional_permissions);
            extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment();
                    frag.setTargetFragment(ManagePermissionsFragment.this, 0);
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.replace(android.R.id.content, frag);
                    ft.addToBackStack(null);
                    ft.commit();
                    return true;
                }
            });
            int count = mExtraScreen.getPreferenceCount();
            extraScreenPreference.setSummary(getResources().getQuantityString(
                    R.plurals.additional_permissions_more, count, count));
            screen.addPreference(extraScreenPreference);
        }
        if (screen.getPreferenceCount() != 0) {
            setLoading(false /* loading */, true /* animate */);
        }
    }

    public static class AdditionalPermissionsFragment extends PermissionsFrameFragment {
        @Override
        public void onCreate(Bundle icicle) {
            setLoading(true /* loading */, false /* animate */);
            super.onCreate(icicle);
            getActivity().setTitle(R.string.additional_permissions);
            setHasOptionsMenu(true);

            setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen);
            setLoading(false /* loading */, true /* animate */);
        }

        @Override
        public void onDestroy() {
            getActivity().setTitle(R.string.app_permissions);
            super.onDestroy();
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    getFragmentManager().popBackStack();
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }

        @Override
        public void onViewCreated(View view,  Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            bindPermissionUi(getActivity(), getView());
        }
        return screen;
    }
}
+107 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.packageinstaller.permission.ui.handheld;

import android.app.FragmentTransaction;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.view.MenuItem;

import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.PermissionGroup;
import com.android.packageinstaller.permission.utils.Utils;

import java.util.List;

/**
 * Fragment that allows the user to manage standard permissions.
 */
public final class ManageStandardPermissionsFragment extends ManagePermissionsFragment {
    private static final String EXTRA_PREFS_KEY = "extra_prefs_key";

    /**
     * @return A new fragment
     */
    public static ManageStandardPermissionsFragment newInstance() {
        return new ManageStandardPermissionsFragment();
    }

    @Override
    public void onStart() {
        super.onStart();

        getActivity().setTitle(com.android.packageinstaller.R.string.app_permissions);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            getActivity().finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void updatePermissionsUi() {
        PreferenceScreen screen = updatePermissionsUi(true);
        if (screen == null) {
            return;
        }

        // Check if we need an additional permissions preference
        List<PermissionGroup> groups = getPermissions().getGroups();
        int numExtraPermissions = 0;
        for (PermissionGroup group : groups) {
            if (!group.getDeclaringPackage().equals(ManagePermissionsFragment.OS_PKG)) {
                numExtraPermissions++;
            }
        }

        Preference additionalPermissionsPreference = screen.findPreference(EXTRA_PREFS_KEY);
        if (numExtraPermissions == 0) {
            if (additionalPermissionsPreference != null) {
                screen.removePreference(additionalPermissionsPreference);
            }
        } else {
            if (additionalPermissionsPreference == null) {
                additionalPermissionsPreference = new Preference(getActivity());
                additionalPermissionsPreference.setKey(EXTRA_PREFS_KEY);
                additionalPermissionsPreference.setIcon(Utils.applyTint(getActivity(),
                        R.drawable.ic_more_items,
                        android.R.attr.colorControlNormal));
                additionalPermissionsPreference.setTitle(R.string.additional_permissions);
                additionalPermissionsPreference.setOnPreferenceClickListener(preference -> {
                    ManageCustomPermissionsFragment frag =
                            new ManageCustomPermissionsFragment();
                    frag.setTargetFragment(ManageStandardPermissionsFragment.this, 0);
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.replace(android.R.id.content, frag);
                    ft.addToBackStack(null);
                    ft.commit();
                    return true;
                });

                screen.addPreference(additionalPermissionsPreference);
            }

            additionalPermissionsPreference.setSummary(getResources().getQuantityString(
                    R.plurals.additional_permissions_more, numExtraPermissions,
                    numExtraPermissions));
        }
    }
}