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

Commit ab87a639 authored by Chong Zhang's avatar Chong Zhang
Browse files

MediaRouter: grey out wifi displays that's in use

bug 9229799

Change-Id: I9f5fd2107f60c492d42c74e575e6483838a51267
parent 512d8fbe
Loading
Loading
Loading
Loading
+34 −12
Original line number Original line Diff line number Diff line
@@ -33,7 +33,9 @@ public final class WifiDisplay implements Parcelable {
    private final String mDeviceAddress;
    private final String mDeviceAddress;
    private final String mDeviceName;
    private final String mDeviceName;
    private final String mDeviceAlias;
    private final String mDeviceAlias;
    private final boolean mIsAvailable;
    private final boolean mCanConnect;
    private final boolean mCanConnect;
    private final boolean mIsRemembered;


    public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];
    public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];


@@ -42,9 +44,11 @@ public final class WifiDisplay implements Parcelable {
            String deviceAddress = in.readString();
            String deviceAddress = in.readString();
            String deviceName = in.readString();
            String deviceName = in.readString();
            String deviceAlias = in.readString();
            String deviceAlias = in.readString();
            boolean isAvailable = (in.readInt() != 0);
            boolean canConnect = (in.readInt() != 0);
            boolean canConnect = (in.readInt() != 0);
            return new WifiDisplay(deviceAddress, deviceName,
            boolean isRemembered = (in.readInt() != 0);
                    deviceAlias, canConnect);
            return new WifiDisplay(deviceAddress, deviceName, deviceAlias,
                    isAvailable, canConnect, isRemembered);
        }
        }


        public WifiDisplay[] newArray(int size) {
        public WifiDisplay[] newArray(int size) {
@@ -52,12 +56,8 @@ public final class WifiDisplay implements Parcelable {
        }
        }
    };
    };


    public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias) {
    public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias,
        this(deviceAddress, deviceName, deviceAlias, false);
            boolean available, boolean canConnect, boolean remembered) {
    }

    public WifiDisplay(String deviceAddress, String deviceName,
                       String deviceAlias, boolean canConnect) {
        if (deviceAddress == null) {
        if (deviceAddress == null) {
            throw new IllegalArgumentException("deviceAddress must not be null");
            throw new IllegalArgumentException("deviceAddress must not be null");
        }
        }
@@ -68,7 +68,9 @@ public final class WifiDisplay implements Parcelable {
        mDeviceAddress = deviceAddress;
        mDeviceAddress = deviceAddress;
        mDeviceName = deviceName;
        mDeviceName = deviceName;
        mDeviceAlias = deviceAlias;
        mDeviceAlias = deviceAlias;
        mIsAvailable = available;
        mCanConnect = canConnect;
        mCanConnect = canConnect;
        mIsRemembered = remembered;
    }
    }


    /**
    /**
@@ -97,12 +99,26 @@ public final class WifiDisplay implements Parcelable {
    }
    }


    /**
    /**
     * Gets the availability of the Wifi display device.
     * Returns true if device is available, false otherwise.
     */
    public boolean isAvailable() {
        return mIsAvailable;
    }

    /**
     * Returns true if device can be connected to (not in use), false otherwise.
     */
     */
    public boolean canConnect() {
    public boolean canConnect() {
        return mCanConnect;
        return mCanConnect;
    }
    }


    /**
     * Returns true if device has been remembered, false otherwise.
     */
    public boolean isRemembered() {
        return mIsRemembered;
    }

    /**
    /**
     * Gets the name to show in the UI.
     * Gets the name to show in the UI.
     * Uses the device alias if available, otherwise uses the device name.
     * Uses the device alias if available, otherwise uses the device name.
@@ -116,12 +132,15 @@ public final class WifiDisplay implements Parcelable {
        return o instanceof WifiDisplay && equals((WifiDisplay)o);
        return o instanceof WifiDisplay && equals((WifiDisplay)o);
    }
    }


    /**
     * Returns true if the two displays have the same identity (address, name and alias).
     * This method does not compare the current status of the displays.
     */
    public boolean equals(WifiDisplay other) {
    public boolean equals(WifiDisplay other) {
        return other != null
        return other != null
                && mDeviceAddress.equals(other.mDeviceAddress)
                && mDeviceAddress.equals(other.mDeviceAddress)
                && mDeviceName.equals(other.mDeviceName)
                && mDeviceName.equals(other.mDeviceName)
                && Objects.equal(mDeviceAlias, other.mDeviceAlias)
                && Objects.equal(mDeviceAlias, other.mDeviceAlias);
                && (mCanConnect == other.mCanConnect);
    }
    }


    /**
    /**
@@ -144,7 +163,9 @@ public final class WifiDisplay implements Parcelable {
        dest.writeString(mDeviceAddress);
        dest.writeString(mDeviceAddress);
        dest.writeString(mDeviceName);
        dest.writeString(mDeviceName);
        dest.writeString(mDeviceAlias);
        dest.writeString(mDeviceAlias);
        dest.writeInt(mIsAvailable ? 1 : 0);
        dest.writeInt(mCanConnect ? 1 : 0);
        dest.writeInt(mCanConnect ? 1 : 0);
        dest.writeInt(mIsRemembered ? 1 : 0);
    }
    }


    @Override
    @Override
@@ -159,7 +180,8 @@ public final class WifiDisplay implements Parcelable {
        if (mDeviceAlias != null) {
        if (mDeviceAlias != null) {
            result += ", alias " + mDeviceAlias;
            result += ", alias " + mDeviceAlias;
        }
        }
        result += ", canConnect " + mCanConnect;
        result += ", isAvailable " + mIsAvailable + ", canConnect " + mCanConnect
                + ", isRemembered " + mIsRemembered;
        return result;
        return result;
    }
    }
}
}
+20 −47
Original line number Original line Diff line number Diff line
@@ -20,6 +20,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;


import java.util.Arrays;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;


/**
/**
 * Describes the current global state of Wifi display connectivity, including the
 * Describes the current global state of Wifi display connectivity, including the
@@ -35,8 +37,7 @@ public final class WifiDisplayStatus implements Parcelable {
    private final int mScanState;
    private final int mScanState;
    private final int mActiveDisplayState;
    private final int mActiveDisplayState;
    private final WifiDisplay mActiveDisplay;
    private final WifiDisplay mActiveDisplay;
    private final WifiDisplay[] mAvailableDisplays;
    private final WifiDisplay[] mDisplays;
    private final WifiDisplay[] mRememberedDisplays;


    /** Feature state: Wifi display is not available on this device. */
    /** Feature state: Wifi display is not available on this device. */
    public static final int FEATURE_STATE_UNAVAILABLE = 0;
    public static final int FEATURE_STATE_UNAVAILABLE = 0;
@@ -70,18 +71,13 @@ public final class WifiDisplayStatus implements Parcelable {
                activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
                activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
            }
            }


            WifiDisplay[] availableDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
            WifiDisplay[] displays = WifiDisplay.CREATOR.newArray(in.readInt());
            for (int i = 0; i < availableDisplays.length; i++) {
            for (int i = 0; i < displays.length; i++) {
                availableDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
                displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
            }

            WifiDisplay[] rememberedDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
            for (int i = 0; i < rememberedDisplays.length; i++) {
                rememberedDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
            }
            }


            return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
            return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
                    activeDisplay, availableDisplays, rememberedDisplays);
                    activeDisplay, displays);
        }
        }


        public WifiDisplayStatus[] newArray(int size) {
        public WifiDisplayStatus[] newArray(int size) {
@@ -91,25 +87,20 @@ public final class WifiDisplayStatus implements Parcelable {


    public WifiDisplayStatus() {
    public WifiDisplayStatus() {
        this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
        this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
                null, WifiDisplay.EMPTY_ARRAY, WifiDisplay.EMPTY_ARRAY);
                null, WifiDisplay.EMPTY_ARRAY);
    }
    }


    public WifiDisplayStatus(int featureState, int scanState,
    public WifiDisplayStatus(int featureState, int scanState,
            int activeDisplayState, WifiDisplay activeDisplay,
            int activeDisplayState, WifiDisplay activeDisplay, WifiDisplay[] displays) {
            WifiDisplay[] availableDisplays, WifiDisplay[] rememberedDisplays) {
        if (displays == null) {
        if (availableDisplays == null) {
            throw new IllegalArgumentException("displays must not be null");
            throw new IllegalArgumentException("availableDisplays must not be null");
        }
        if (rememberedDisplays == null) {
            throw new IllegalArgumentException("rememberedDisplays must not be null");
        }
        }


        mFeatureState = featureState;
        mFeatureState = featureState;
        mScanState = scanState;
        mScanState = scanState;
        mActiveDisplayState = activeDisplayState;
        mActiveDisplayState = activeDisplayState;
        mActiveDisplay = activeDisplay;
        mActiveDisplay = activeDisplay;
        mAvailableDisplays = availableDisplays;
        mDisplays = displays;
        mRememberedDisplays = rememberedDisplays;
    }
    }


    /**
    /**
@@ -152,24 +143,12 @@ public final class WifiDisplayStatus implements Parcelable {
    }
    }


    /**
    /**
     * Gets the list of all available Wifi displays as reported by the most recent
     * Gets the list of Wifi displays, returns a combined list of all available
     * scan, never null.
     * Wifi displays as reported by the most recent scan, and all remembered 
     * <p>
     * Wifi displays (not necessarily available at the time).
     * Some of these displays may already be remembered, others may be unknown.
     * </p>
     */
    public WifiDisplay[] getAvailableDisplays() {
        return mAvailableDisplays;
    }

    /**
     * Gets the list of all remembered Wifi displays, never null.
     * <p>
     * Not all remembered displays will necessarily be available.
     * </p>
     */
     */
    public WifiDisplay[] getRememberedDisplays() {
    public WifiDisplay[] getDisplays() {
        return mRememberedDisplays;
        return mDisplays;
    }
    }


    @Override
    @Override
@@ -185,13 +164,8 @@ public final class WifiDisplayStatus implements Parcelable {
            dest.writeInt(0);
            dest.writeInt(0);
        }
        }


        dest.writeInt(mAvailableDisplays.length);
        dest.writeInt(mDisplays.length);
        for (WifiDisplay display : mAvailableDisplays) {
        for (WifiDisplay display : mDisplays) {
            display.writeToParcel(dest, flags);
        }

        dest.writeInt(mRememberedDisplays.length);
        for (WifiDisplay display : mRememberedDisplays) {
            display.writeToParcel(dest, flags);
            display.writeToParcel(dest, flags);
        }
        }
    }
    }
@@ -208,8 +182,7 @@ public final class WifiDisplayStatus implements Parcelable {
                + ", scanState=" + mScanState
                + ", scanState=" + mScanState
                + ", activeDisplayState=" + mActiveDisplayState
                + ", activeDisplayState=" + mActiveDisplayState
                + ", activeDisplay=" + mActiveDisplay
                + ", activeDisplay=" + mActiveDisplay
                + ", availableDisplays=" + Arrays.toString(mAvailableDisplays)
                + ", displays=" + Arrays.toString(mDisplays)
                + ", rememberedDisplays=" + Arrays.toString(mRememberedDisplays)
                + "}";
                + "}";
    }
    }
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -3970,6 +3970,9 @@
    <!-- Status message for remote routes that are not available for connection right now -->
    <!-- Status message for remote routes that are not available for connection right now -->
    <string name="media_route_status_not_available">Not available</string>
    <string name="media_route_status_not_available">Not available</string>


    <!-- Status message for a remote route that is in use (and thus unavailabe) right now -->
    <string name="media_route_status_in_use">In use</string>

    <!-- Display manager service -->
    <!-- Display manager service -->


    <!-- Name of the built-in display.  [CHAR LIMIT=50] -->
    <!-- Name of the built-in display.  [CHAR LIMIT=50] -->
+1 −0
Original line number Original line Diff line number Diff line
@@ -850,6 +850,7 @@
  <java-symbol type="string" name="media_route_status_connecting" />
  <java-symbol type="string" name="media_route_status_connecting" />
  <java-symbol type="string" name="media_route_status_available" />
  <java-symbol type="string" name="media_route_status_available" />
  <java-symbol type="string" name="media_route_status_not_available" />
  <java-symbol type="string" name="media_route_status_not_available" />
  <java-symbol type="string" name="media_route_status_in_use" />
  <java-symbol type="string" name="owner_name" />
  <java-symbol type="string" name="owner_name" />
  <java-symbol type="string" name="config_chooseAccountActivity" />
  <java-symbol type="string" name="config_chooseAccountActivity" />
  <java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
  <java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
+68 −56
Original line number Original line Diff line number Diff line
@@ -876,30 +876,28 @@ public class MediaRouter {
        boolean wantScan = false;
        boolean wantScan = false;
        boolean blockScan = false;
        boolean blockScan = false;
        WifiDisplay[] oldDisplays = oldStatus != null ?
        WifiDisplay[] oldDisplays = oldStatus != null ?
                oldStatus.getRememberedDisplays() : WifiDisplay.EMPTY_ARRAY;
                oldStatus.getDisplays() : WifiDisplay.EMPTY_ARRAY;
        WifiDisplay[] newDisplays;
        WifiDisplay[] newDisplays;
        WifiDisplay[] availableDisplays;
        WifiDisplay activeDisplay;
        WifiDisplay activeDisplay;


        if (newStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
        if (newStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
            newDisplays = newStatus.getRememberedDisplays();
            newDisplays = newStatus.getDisplays();
            availableDisplays = newStatus.getAvailableDisplays();
            activeDisplay = newStatus.getActiveDisplay();
            activeDisplay = newStatus.getActiveDisplay();
        } else {
        } else {
            newDisplays = availableDisplays = WifiDisplay.EMPTY_ARRAY;
            newDisplays = WifiDisplay.EMPTY_ARRAY;
            activeDisplay = null;
            activeDisplay = null;
        }
        }


        for (int i = 0; i < newDisplays.length; i++) {
        for (int i = 0; i < newDisplays.length; i++) {
            final WifiDisplay d = newDisplays[i];
            final WifiDisplay d = newDisplays[i];
            final boolean available = findMatchingDisplay(d, availableDisplays) != null;
            if (d.isRemembered()) {
                RouteInfo route = findWifiDisplayRoute(d);
                RouteInfo route = findWifiDisplayRoute(d);
                if (route == null) {
                if (route == null) {
                route = makeWifiDisplayRoute(d, available);
                    route = makeWifiDisplayRoute(d, newStatus);
                    addRouteStatic(route);
                    addRouteStatic(route);
                    wantScan = true;
                    wantScan = true;
                } else {
                } else {
                updateWifiDisplayRoute(route, d, available, newStatus);
                    updateWifiDisplayRoute(route, d, newStatus);
                }
                }
                if (d.equals(activeDisplay)) {
                if (d.equals(activeDisplay)) {
                    selectRouteStatic(route.getSupportedTypes(), route);
                    selectRouteStatic(route.getSupportedTypes(), route);
@@ -909,13 +907,16 @@ public class MediaRouter {
                    blockScan = true;
                    blockScan = true;
                }
                }
            }
            }
        }
        for (int i = 0; i < oldDisplays.length; i++) {
        for (int i = 0; i < oldDisplays.length; i++) {
            final WifiDisplay d = oldDisplays[i];
            final WifiDisplay d = oldDisplays[i];
            if (d.isRemembered()) {
                final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
                final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
            if (newDisplay == null) {
                if (newDisplay == null || !newDisplay.isRemembered()) {
                    removeRoute(findWifiDisplayRoute(d));
                    removeRoute(findWifiDisplayRoute(d));
                }
                }
            }
            }
        }


        if (wantScan && !blockScan) {
        if (wantScan && !blockScan) {
            sStatic.mDisplayService.scanWifiDisplays();
            sStatic.mDisplayService.scanWifiDisplays();
@@ -924,42 +925,20 @@ public class MediaRouter {
        sStatic.mLastKnownWifiDisplayStatus = newStatus;
        sStatic.mLastKnownWifiDisplayStatus = newStatus;
    }
    }


    static RouteInfo makeWifiDisplayRoute(WifiDisplay display, boolean available) {
    static int getWifiDisplayStatusCode(WifiDisplay d, WifiDisplayStatus wfdStatus) {
        final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
        newRoute.mDeviceAddress = display.getDeviceAddress();
        newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
        newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
        newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;

        newRoute.setStatusCode(available ?
                RouteInfo.STATUS_AVAILABLE : RouteInfo.STATUS_CONNECTING);
        newRoute.mEnabled = available;

        newRoute.mName = display.getFriendlyDisplayName();
        newRoute.mDescription = sStatic.mResources.getText(
                com.android.internal.R.string.wireless_display_route_description);

        newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
                sStatic.getAllPresentationDisplays());
        return newRoute;
    }

    private static void updateWifiDisplayRoute(RouteInfo route, WifiDisplay display,
            boolean available, WifiDisplayStatus wifiDisplayStatus) {
        final boolean isScanning =
                wifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING;

        boolean changed = false;
        int newStatus = RouteInfo.STATUS_NONE;
        int newStatus = RouteInfo.STATUS_NONE;


        if (available) {
        if (wfdStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
            newStatus = isScanning ? RouteInfo.STATUS_SCANNING : RouteInfo.STATUS_AVAILABLE;
            newStatus = RouteInfo.STATUS_SCANNING;
        } else if (d.isAvailable()) {
            newStatus = d.canConnect() ?
                    RouteInfo.STATUS_AVAILABLE: RouteInfo.STATUS_IN_USE;
        } else {
        } else {
            newStatus = RouteInfo.STATUS_NOT_AVAILABLE;
            newStatus = RouteInfo.STATUS_NOT_AVAILABLE;
        }
        }


        if (display.equals(wifiDisplayStatus.getActiveDisplay())) {
        if (d.equals(wfdStatus.getActiveDisplay())) {
            final int activeState = wifiDisplayStatus.getActiveDisplayState();
            final int activeState = wfdStatus.getActiveDisplayState();
            switch (activeState) {
            switch (activeState) {
                case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
                case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
                    newStatus = RouteInfo.STATUS_NONE;
                    newStatus = RouteInfo.STATUS_NONE;
@@ -973,22 +952,51 @@ public class MediaRouter {
            }
            }
        }
        }


        return newStatus;
    }

    static boolean isWifiDisplayEnabled(WifiDisplay d, WifiDisplayStatus wfdStatus) {
        return d.isAvailable() && (d.canConnect() || d.equals(wfdStatus.getActiveDisplay()));
    }

    static RouteInfo makeWifiDisplayRoute(WifiDisplay display, WifiDisplayStatus wfdStatus) {
        final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
        newRoute.mDeviceAddress = display.getDeviceAddress();
        newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
        newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
        newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;

        newRoute.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));
        newRoute.mEnabled = isWifiDisplayEnabled(display, wfdStatus);
        newRoute.mName = display.getFriendlyDisplayName();
        newRoute.mDescription = sStatic.mResources.getText(
                com.android.internal.R.string.wireless_display_route_description);

        newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
                sStatic.getAllPresentationDisplays());
        return newRoute;
    }

    private static void updateWifiDisplayRoute(
            RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus) {
        boolean changed = false;
        final String newName = display.getFriendlyDisplayName();
        final String newName = display.getFriendlyDisplayName();
        if (!route.getName().equals(newName)) {
        if (!route.getName().equals(newName)) {
            route.mName = newName;
            route.mName = newName;
            changed = true;
            changed = true;
        }
        }


        changed |= route.mEnabled != available;
        boolean enabled = isWifiDisplayEnabled(display, wfdStatus);
        route.mEnabled = available;
        changed |= route.mEnabled != enabled;
        route.mEnabled = enabled;


        changed |= route.setStatusCode(newStatus);
        changed |= route.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));


        if (changed) {
        if (changed) {
            dispatchRouteChanged(route);
            dispatchRouteChanged(route);
        }
        }


        if (!available && route == sStatic.mSelectedRoute) {
        if (!enabled && route == sStatic.mSelectedRoute) {
            // Oops, no longer available. Reselect the default.
            // Oops, no longer available. Reselect the default.
            final RouteInfo defaultRoute = sStatic.mDefaultAudioVideo;
            final RouteInfo defaultRoute = sStatic.mDefaultAudioVideo;
            selectRouteStatic(defaultRoute.getSupportedTypes(), defaultRoute);
            selectRouteStatic(defaultRoute.getSupportedTypes(), defaultRoute);
@@ -1069,6 +1077,7 @@ public class MediaRouter {
        /** @hide */ public static final int STATUS_CONNECTING = 2;
        /** @hide */ public static final int STATUS_CONNECTING = 2;
        /** @hide */ public static final int STATUS_AVAILABLE = 3;
        /** @hide */ public static final int STATUS_AVAILABLE = 3;
        /** @hide */ public static final int STATUS_NOT_AVAILABLE = 4;
        /** @hide */ public static final int STATUS_NOT_AVAILABLE = 4;
        /** @hide */ public static final int STATUS_IN_USE = 5;


        private Object mTag;
        private Object mTag;


@@ -1180,6 +1189,9 @@ public class MediaRouter {
                    case STATUS_NOT_AVAILABLE:
                    case STATUS_NOT_AVAILABLE:
                        resId = com.android.internal.R.string.media_route_status_not_available;
                        resId = com.android.internal.R.string.media_route_status_not_available;
                        break;
                        break;
                    case STATUS_IN_USE:
                        resId = com.android.internal.R.string.media_route_status_in_use;
                        break;
                }
                }
                mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null;
                mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null;
                return true;
                return true;
Loading