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

Commit d0d3ca95 authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Replace arrays with ArrayList"

parents 8306f871 652fdfaf
Loading
Loading
Loading
Loading
+83 −144
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.view.inputmethod.InputMethodManager;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
 * Provides low-level communication with the system window manager for
@@ -106,9 +107,10 @@ public final class WindowManagerGlobal {

    private final Object mLock = new Object();

    private View[] mViews;
    private ViewRootImpl[] mRoots;
    private WindowManager.LayoutParams[] mParams;
    private final ArrayList<View> mViews = new ArrayList<View>();
    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
    private final ArrayList<WindowManager.LayoutParams> mParams =
            new ArrayList<WindowManager.LayoutParams>();
    private boolean mNeedsEglTerminate;

    private Runnable mSystemPropertyUpdater;
@@ -161,11 +163,10 @@ public final class WindowManagerGlobal {

    public String[] getViewRootNames() {
        synchronized (mLock) {
            if (mRoots == null) return new String[0];
            String[] mViewRoots = new String[mRoots.length];
            int i = 0;
            for (ViewRootImpl root : mRoots) {
                mViewRoots[i++] = getWindowName(root);
            final int numRoots = mRoots.size();
            String[] mViewRoots = new String[numRoots];
            for (int i = 0; i < numRoots; ++i) {
                mViewRoots[i] = getWindowName(mRoots.get(i));
            }
            return mViewRoots;
        }
@@ -173,8 +174,8 @@ public final class WindowManagerGlobal {

    public View getRootView(String name) {
        synchronized (mLock) {
            if (mRoots == null) return null;
            for (ViewRootImpl root : mRoots) {
            for (int i = mRoots.size() - 1; i >= 0; --i) {
                final ViewRootImpl root = mRoots.get(i);
                if (name.equals(getWindowName(root))) return root.getView();
            }
        }
@@ -208,8 +209,8 @@ public final class WindowManagerGlobal {
                mSystemPropertyUpdater = new Runnable() {
                    @Override public void run() {
                        synchronized (mLock) {
                            for (ViewRootImpl viewRoot : mRoots) {
                                viewRoot.loadSystemProperties();
                            for (int i = mRoots.size() - 1; i >= 0; --i) {
                                mRoots.get(i).loadSystemProperties();
                            }
                        }
                    }
@@ -227,10 +228,10 @@ public final class WindowManagerGlobal {
            // attached to for future reference.
            if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
                    wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
                final int count = mViews != null ? mViews.length : 0;
                final int count = mViews.size();
                for (int i = 0; i < count; i++) {
                    if (mRoots[i].mWindow.asBinder() == wparams.token) {
                        panelParentView = mViews[i];
                    if (mRoots.get(i).mWindow.asBinder() == wparams.token) {
                        panelParentView = mViews.get(i);
                    }
                }
            }
@@ -239,28 +240,9 @@ public final class WindowManagerGlobal {

            view.setLayoutParams(wparams);

            if (mViews == null) {
                index = 1;
                mViews = new View[1];
                mRoots = new ViewRootImpl[1];
                mParams = new WindowManager.LayoutParams[1];
            } else {
                index = mViews.length + 1;
                Object[] old = mViews;
                mViews = new View[index];
                System.arraycopy(old, 0, mViews, 0, index-1);
                old = mRoots;
                mRoots = new ViewRootImpl[index];
                System.arraycopy(old, 0, mRoots, 0, index-1);
                old = mParams;
                mParams = new WindowManager.LayoutParams[index];
                System.arraycopy(old, 0, mParams, 0, index-1);
            }
            index--;

            mViews[index] = view;
            mRoots[index] = root;
            mParams[index] = wparams;
            mViews.add(view);
            mRoots.add(root);
            mParams.add(wparams);
        }

        // do this last because it fires off messages to start doing things
@@ -292,8 +274,9 @@ public final class WindowManagerGlobal {

        synchronized (mLock) {
            int index = findViewLocked(view, true);
            ViewRootImpl root = mRoots[index];
            mParams[index] = wparams;
            ViewRootImpl root = mRoots.get(index);
            mParams.remove(index);
            mParams.add(index, wparams);
            root.setLayoutParams(wparams, false);
        }
    }
@@ -305,7 +288,7 @@ public final class WindowManagerGlobal {

        synchronized (mLock) {
            int index = findViewLocked(view, true);
            View curView = mRoots[index].getView();
            View curView = mRoots.get(index).getView();
            removeViewLocked(index, immediate);
            if (curView == view) {
                return;
@@ -318,16 +301,13 @@ public final class WindowManagerGlobal {

    public void closeAll(IBinder token, String who, String what) {
        synchronized (mLock) {
            if (mViews == null)
                return;

            int count = mViews.length;
            int count = mViews.size();
            //Log.i("foo", "Closing all windows of " + token);
            for (int i = 0; i < count; i++) {
                //Log.i("foo", "@ " + i + " token " + mParams[i].token
                //        + " view " + mRoots[i].getView());
                if (token == null || mParams[i].token == token) {
                    ViewRootImpl root = mRoots[i];
                if (token == null || mParams.get(i).token == token) {
                    ViewRootImpl root = mRoots.get(i);

                    //Log.i("foo", "Force closing " + root);
                    if (who != null) {
@@ -345,13 +325,13 @@ public final class WindowManagerGlobal {
    }

    private void removeViewLocked(int index, boolean immediate) {
        ViewRootImpl root = mRoots[index];
        ViewRootImpl root = mRoots.get(index);
        View view = root.getView();

        if (view != null) {
            InputMethodManager imm = InputMethodManager.getInstance();
            if (imm != null) {
                imm.windowDismissed(mViews[index].getWindowToken());
                imm.windowDismissed(mViews.get(index).getWindowToken());
            }
        }
        root.die(immediate);
@@ -364,52 +344,21 @@ public final class WindowManagerGlobal {
                view.assignParent(null);
            }

            final int newCount = mViews.length - 1;
            for (int index = newCount; index >= 0; --index) {
                if (mRoots[index] == root) {
                    // remove it from the list
                    View[] tmpViews = new View[newCount];
                    removeItem(tmpViews, mViews, index);
                    mViews = tmpViews;

                    ViewRootImpl[] tmpRoots = new ViewRootImpl[newCount];
                    removeItem(tmpRoots, mRoots, index);
                    mRoots = tmpRoots;

                    WindowManager.LayoutParams[] tmpParams = new WindowManager.LayoutParams[newCount];
                    removeItem(tmpParams, mParams, index);
                    mParams = tmpParams;

                    return;
                }
            }
        }
    }

    private static void removeItem(Object[] dst, Object[] src, int index) {
        if (dst.length > 0) {
            if (index > 0) {
                System.arraycopy(src, 0, dst, 0, index);
            }
            if (index < dst.length) {
                System.arraycopy(src, index+1, dst, index, src.length-index-1);
            final int index = mRoots.indexOf(root);
            if (index >= 0) {
                mRoots.remove(index);
                mViews.remove(index);
                mParams.remove(index);
            }
        }
    }

    private int findViewLocked(View view, boolean required) {
        if (mViews != null) {
            final int count = mViews.length;
            for (int i = 0; i < count; i++) {
                if (mViews[i] == view) {
                    return i;
                }
            }
        }
        if (required) {
        final int index = mViews.indexOf(view);
        if (required && index < 0) {
            throw new IllegalArgumentException("View=" + view + " not attached to window manager");
        }
        return -1;
        return index;
    }

    public void startTrimMemory(int level) {
@@ -422,10 +371,8 @@ public final class WindowManagerGlobal {
                // Destroy all hardware surfaces and resources associated to
                // known windows
                synchronized (mLock) {
                    if (mViews == null) return;
                    int count = mViews.length;
                    for (int i = 0; i < count; i++) {
                        mRoots[i].terminateHardwareResources();
                    for (int i = mRoots.size() - 1; i >= 0; --i) {
                        mRoots.get(i).terminateHardwareResources();
                    }
                }
                // Force a full memory flush
@@ -449,10 +396,8 @@ public final class WindowManagerGlobal {

    public void trimLocalMemory() {
        synchronized (mLock) {
            if (mViews == null) return;
            int count = mViews.length;
            for (int i = 0; i < count; i++) {
                mRoots[i].destroyHardwareLayers();
            for (int i = mRoots.size() - 1; i >= 0; --i) {
                mRoots.get(i).destroyHardwareLayers();
            }
        }
    }
@@ -462,13 +407,12 @@ public final class WindowManagerGlobal {
        PrintWriter pw = new PrintWriter(fout);
        try {
            synchronized (mLock) {
                if (mViews != null) {
                    final int count = mViews.length;
                final int count = mViews.size();

                pw.println("Profile data in ms:");

                for (int i = 0; i < count; i++) {
                        ViewRootImpl root = mRoots[i];
                    ViewRootImpl root = mRoots.get(i);
                    String name = getWindowName(root);
                    pw.printf("\n\t%s", name);

@@ -486,7 +430,7 @@ public final class WindowManagerGlobal {
                int[] info = new int[2];

                for (int i = 0; i < count; i++) {
                        ViewRootImpl root = mRoots[i];
                    ViewRootImpl root = mRoots.get(i);
                    root.dumpGfxInfo(info);

                    String name = getWindowName(root);
@@ -507,7 +451,6 @@ public final class WindowManagerGlobal {
                pw.printf("Total Views:        %d\n", viewsCount);
                pw.printf("Total DisplayList:  %.2f kB\n\n", displayListsSize / 1024.0f);
            }
            }
        } finally {
            pw.flush();
        }
@@ -520,31 +463,27 @@ public final class WindowManagerGlobal {

    public void setStoppedState(IBinder token, boolean stopped) {
        synchronized (mLock) {
            if (mViews != null) {
                int count = mViews.length;
            int count = mViews.size();
            for (int i = 0; i < count; i++) {
                    if (token == null || mParams[i].token == token) {
                        ViewRootImpl root = mRoots[i];
                if (token == null || mParams.get(i).token == token) {
                    ViewRootImpl root = mRoots.get(i);
                    root.setStopped(stopped);
                }
            }
        }
    }
    }

    public void reportNewConfiguration(Configuration config) {
        synchronized (mLock) {
            if (mViews != null) {
                int count = mViews.length;
            int count = mViews.size();
            config = new Configuration(config);
            for (int i=0; i < count; i++) {
                    ViewRootImpl root = mRoots[i];
                ViewRootImpl root = mRoots.get(i);
                root.requestUpdateConfiguration(config);
            }
        }
    }
}
}

final class WindowLeaked extends AndroidRuntimeException {
    public WindowLeaked(String msg) {