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

Commit 8ebe1736 authored by Danny Baumann's avatar Danny Baumann Committed by Gerrit Code Review
Browse files

Fix AIOOBE with root access disabled.

Page title and template array lengths got out of sync if root access was
disabled. Make sure this doesn't happen anymore by combining titles and
templates into a single list prior to filtering.

Change-Id: I069db9b9925887d6d80592eabe93b33abeaf0fe8
JIRA: CYAN-8028
parent 31be1080
Loading
Loading
Loading
Loading
+33 −30
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import android.preference.PreferenceFrameLayout;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager;
import android.util.Pair;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.Menu;
@@ -62,37 +63,35 @@ public class AppOpsSummary extends InstrumentedFragment {
    private Activity mActivity;
    private Activity mActivity;
    private SharedPreferences mPreferences;
    private SharedPreferences mPreferences;


    CharSequence[] mPageNames;

    int mCurPos;
    int mPositionOffset;

    @Override
    @Override
    protected int getMetricsCategory() {
    protected int getMetricsCategory() {
        return MetricsLogger.APP_OPS_SUMMARY;
        return MetricsLogger.APP_OPS_SUMMARY;
    }
    }


    class MyPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
    static class MyPagerAdapter extends FragmentPagerAdapter
        private AppOpsState.OpsTemplate[] mPageTemplates;
            implements ViewPager.OnPageChangeListener {
        private List<Pair<CharSequence, AppOpsState.OpsTemplate>> mPageData;
        private int mCurPos;


        public MyPagerAdapter(FragmentManager fm, AppOpsState.OpsTemplate[] templates) {
        public MyPagerAdapter(FragmentManager fm,
                List<Pair<CharSequence, AppOpsState.OpsTemplate>> data) {
            super(fm);
            super(fm);
            mPageTemplates = templates;
            mPageData = data;
        }
        }


        @Override
        @Override
        public Fragment getItem(int position) {
        public Fragment getItem(int position) {
            return new AppOpsCategory(mPageTemplates[mPositionOffset + position]);
            return new AppOpsCategory(mPageData.get(position).second);
        }
        }


        @Override
        @Override
        public int getCount() {
        public int getCount() {
            return mPageNames.length;
            return mPageData.size();
        }
        }


        @Override
        @Override
        public CharSequence getPageTitle(int position) {
        public CharSequence getPageTitle(int position) {
            return mPageNames[position];
            return mPageData.get(position).first;
        }
        }


        @Override
        @Override
@@ -134,23 +133,24 @@ public class AppOpsSummary extends InstrumentedFragment {
        mContentContainer = container;
        mContentContainer = container;
        mRootView = rootView;
        mRootView = rootView;


        mPageNames = getResources().getTextArray(R.array.app_ops_categories_cm);
        CharSequence[] pageNames = getResources().getTextArray(R.array.app_ops_categories_cm);

        AppOpsState.OpsTemplate[] templates = AppOpsState.ALL_TEMPLATES;
        mPositionOffset = 0;
        assert(pageNames.length == templates.length);


        int specificTab = -1;
        int specificTab = -1;
        Bundle bundle = getArguments();
        Bundle bundle = getArguments();
        if (bundle != null) {
        if (bundle != null) {
            specificTab = Arrays.asList(mPageNames).indexOf(bundle.getString("appops_tab", ""));
            specificTab = Arrays.asList(pageNames).indexOf(bundle.getString("appops_tab", ""));
            if (specificTab >= 0) {
                mPageNames = Arrays.copyOfRange(mPageNames, specificTab, specificTab + 1);
                mPositionOffset = specificTab;
        }
        }

        List<Pair<CharSequence, AppOpsState.OpsTemplate>> pageData = new ArrayList<>();
        for (int i = 0; i < pageNames.length; i++) {
            pageData.add(Pair.create(pageNames[i], templates[i]));
        }
        }
        filterPageData(pageData, specificTab);


        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
        mAdapter = new MyPagerAdapter(getChildFragmentManager(),
        mAdapter = new MyPagerAdapter(getChildFragmentManager(), pageData);
                filterTemplates(AppOpsState.ALL_TEMPLATES));
        mViewPager.setAdapter(mAdapter);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOnPageChangeListener(mAdapter);
        mViewPager.setOnPageChangeListener(mAdapter);
        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
@@ -174,16 +174,19 @@ public class AppOpsSummary extends InstrumentedFragment {
        return rootView;
        return rootView;
    }
    }


    private AppOpsState.OpsTemplate[] filterTemplates(AppOpsState.OpsTemplate[] templates) {
    private void filterPageData(List<Pair<CharSequence, AppOpsState.OpsTemplate>> data, int tab) {
        List<AppOpsState.OpsTemplate> validTemplates = new ArrayList(templates.length);
        if (tab >= 0 && tab < data.size()) {
        for (AppOpsState.OpsTemplate template : templates) {
            Pair<CharSequence, AppOpsState.OpsTemplate> item = data.get(tab);
            if (template == AppOpsState.SU_TEMPLATE
            data.clear();
                    && !DevelopmentSettings.isRootForAppsEnabled()) {
            data.add(item);
                continue;
        } else if (!DevelopmentSettings.isRootForAppsEnabled()) {
            for (Pair<CharSequence, AppOpsState.OpsTemplate> item : data) {
                if (item.second == AppOpsState.SU_TEMPLATE) {
                    data.remove(item);
                    return;
                }
            }
            }
            validTemplates.add(template);
        }
        }
        return validTemplates.toArray(new AppOpsState.OpsTemplate[0]);
    }
    }


    private boolean shouldShowUserApps() {
    private boolean shouldShowUserApps() {