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

Commit c8161225 authored by Deepanshu Gupta's avatar Deepanshu Gupta Committed by Android (Google) Code Review
Browse files

Merge "Revert "LayoutLib: Switch SimpleDateFormat to icu.""

parents 88db5108 847b0d3a
Loading
Loading
Loading
Loading
+0 −99
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 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 android.widget;

import com.android.tools.layoutlib.annotations.LayoutlibDelegate;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.icu.text.SimpleDateFormat;
import android.text.format.DateFormat;

import java.util.Calendar;
import java.util.Locale;

/**
 * Delegate that provides implementation for some methods in {@link SimpleMonthView}.
 * <p/>
 * Through the layoutlib_create tool, selected methods of SimpleMonthView have been replaced by
 * calls to methods of the same name in this delegate class.
 * <p/>
 * The main purpose of this class is to use {@link android.icu.text.SimpleDateFormat} instead of
 * {@link java.text.SimpleDateFormat}.
 */
public class SimpleMonthView_Delegate {

    private static final String DEFAULT_TITLE_FORMAT = "MMMMy";
    private static final String DAY_OF_WEEK_FORMAT = "EEEEE";

    // Maintain a cache of the last view used, so that the formatters can be reused.
    @Nullable private static SimpleMonthView sLastView;
    @Nullable private static SimpleMonthView_Delegate sLastDelegate;

    private SimpleDateFormat mTitleFormatter;
    private SimpleDateFormat mDayOfWeekFormatter;

    private Locale locale;

    @LayoutlibDelegate
    /*package*/ static CharSequence getTitle(SimpleMonthView view) {
        if (view.mTitle == null) {
            SimpleMonthView_Delegate delegate = getDelegate(view);
            if (delegate.mTitleFormatter == null) {
                delegate.mTitleFormatter = new SimpleDateFormat(DateFormat.getBestDateTimePattern(
                        getLocale(delegate, view), DEFAULT_TITLE_FORMAT));
            }
            view.mTitle = delegate.mTitleFormatter.format(view.mCalendar.getTime());
        }
        return view.mTitle;
    }

    @LayoutlibDelegate
    /*package*/ static String getDayOfWeekLabel(SimpleMonthView view, int dayOfWeek) {
        view.mDayOfWeekLabelCalendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
        SimpleMonthView_Delegate delegate = getDelegate(view);
        if (delegate.mDayOfWeekFormatter == null) {
            delegate.mDayOfWeekFormatter =
                    new SimpleDateFormat(DAY_OF_WEEK_FORMAT, getLocale(delegate, view));
        }
        return delegate.mDayOfWeekFormatter.format(view.mDayOfWeekLabelCalendar.getTime());
    }

    private static Locale getLocale(SimpleMonthView_Delegate delegate, SimpleMonthView view) {
        if (delegate.locale == null) {
            delegate.locale = view.getContext().getResources().getConfiguration().locale;
        }
        return delegate.locale;
    }

    @NonNull
    private static SimpleMonthView_Delegate getDelegate(SimpleMonthView view) {
        if (view == sLastView) {
            assert sLastDelegate != null;
            return sLastDelegate;
        } else {
            sLastView = view;
            sLastDelegate = new SimpleMonthView_Delegate();
            return sLastDelegate;
        }
    }

    public static void clearCache() {
        sLastView = null;
        sLastDelegate = null;
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import android.util.DisplayMetrics;
import android.view.ViewConfiguration_Accessor;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodManager_Accessor;
import android.widget.SimpleMonthView_Delegate;

import java.util.Locale;
import java.util.concurrent.TimeUnit;
@@ -278,7 +277,6 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
            mContext.getRenderResources().setLogger(null);
        }
        ParserFactory.setParserFactory(null);
        SimpleMonthView_Delegate.clearCache();
    }

    public static BridgeContext getCurrentContext() {
+14 −32
Original line number Diff line number Diff line
@@ -77,8 +77,6 @@ public class AsmGenerator {
    /** Methods to inject. FQCN of class in which method should be injected => runnable that does
     * the injection. */
    private final Map<String, ICreateInfo.InjectMethodRunnable> mInjectedMethodsMap;
    /** A map { FQCN => set { field names } } which should be promoted to public visibility */
    private final Map<String, Set<String>> mPromotedFields;

    /**
     * Creates a new generator that can generate the output JAR with the stubbed classes.
@@ -111,8 +109,20 @@ public class AsmGenerator {

        // Create the map/set of methods to change to delegates
        mDelegateMethods = new HashMap<String, Set<String>>();
        addToMap(createInfo.getDelegateMethods(), mDelegateMethods);

        for (String signature : createInfo.getDelegateMethods()) {
            int pos = signature.indexOf('#');
            if (pos <= 0 || pos >= signature.length() - 1) {
                continue;
            }
            String className = binaryToInternalClassName(signature.substring(0, pos));
            String methodName = signature.substring(pos + 1);
            Set<String> methods = mDelegateMethods.get(className);
            if (methods == null) {
                methods = new HashSet<String>();
                mDelegateMethods.put(className, methods);
            }
            methods.add(methodName);
        }
        for (String className : createInfo.getDelegateClassNatives()) {
            className = binaryToInternalClassName(className);
            Set<String> methods = mDelegateMethods.get(className);
@@ -177,33 +187,9 @@ public class AsmGenerator {
            returnTypes.add(binaryToInternalClassName(className));
        }

        mPromotedFields = new HashMap<String, Set<String>>();
        addToMap(createInfo.getPromotedFields(), mPromotedFields);

        mInjectedMethodsMap = createInfo.getInjectedMethodsMap();
    }

    /**
     * For each value in the array, split the value on '#' and add the parts to the map as key
     * and value.
     */
    private void addToMap(String[] entries, Map<String, Set<String>> map) {
        for (String entry : entries) {
            int pos = entry.indexOf('#');
            if (pos <= 0 || pos >= entry.length() - 1) {
                return;
            }
            String className = binaryToInternalClassName(entry.substring(0, pos));
            String methodOrFieldName = entry.substring(pos + 1);
            Set<String> set = map.get(className);
            if (set == null) {
                set = new HashSet<String>();
                map.put(className, set);
            }
            set.add(methodOrFieldName);
        }
    }

    /**
     * Returns the list of classes that have not been renamed yet.
     * <p/>
@@ -394,10 +380,6 @@ public class AsmGenerator {
            }
        }

        Set<String> promoteFields = mPromotedFields.get(className);
        if (promoteFields != null && !promoteFields.isEmpty()) {
            cv = new PromoteFieldClassAdapter(cv, promoteFields);
        }
        cr.accept(cv, 0);
        return cw.toByteArray();
    }
+0 −13
Original line number Diff line number Diff line
@@ -119,11 +119,6 @@ public final class CreateInfo implements ICreateInfo {
        return excludedClasses;
    }

    @Override
    public String[] getPromotedFields() {
        return PROMOTED_FIELDS;
    }

    @Override
    public Map<String, InjectMethodRunnable> getInjectedMethodsMap() {
        return INJECTED_METHODS;
@@ -190,8 +185,6 @@ public final class CreateInfo implements ICreateInfo {
        "android.view.RenderNode#nSetElevation",
        "android.view.RenderNode#nGetElevation",
        "android.view.ViewGroup#drawChild",
        "android.widget.SimpleMonthView#getTitle",
        "android.widget.SimpleMonthView#getDayOfWeekLabel",
        "android.widget.TimePickerClockDelegate#getAmOrPmKeyCode",
        "com.android.internal.view.menu.MenuBuilder#createNewMenuItem",
        "com.android.internal.util.XmlUtils#convertValueToInt",
@@ -296,12 +289,6 @@ public final class CreateInfo implements ICreateInfo {
            "org.kxml2.io.KXmlParser"
        };

    private final static String[] PROMOTED_FIELDS = new String[] {
        "android.widget.SimpleMonthView#mTitle",
        "android.widget.SimpleMonthView#mCalendar",
        "android.widget.SimpleMonthView#mDayOfWeekLabelCalendar"
    };

    /**
     * List of classes for which the methods returning them should be deleted.
     * The array contains a list of null terminated section starting with the name of the class
+0 −7
Original line number Diff line number Diff line
@@ -77,13 +77,6 @@ public interface ICreateInfo {

    Set<String> getExcludedClasses();

    /**
     * Returns a list of fields which should be promoted to public visibility. The array values
     * are in the form of the binary FQCN of the class containing the field and the field name
     * separated by a '#'.
     */
    String[] getPromotedFields();

    /**
     * Returns a map from binary FQCN className to {@link InjectMethodRunnable} which will be
     * called to inject methods into a class.
Loading