diff options
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/restrictions/Restrictions.java')
-rw-r--r-- | mobile/android/base/java/org/mozilla/gecko/restrictions/Restrictions.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/restrictions/Restrictions.java b/mobile/android/base/java/org/mozilla/gecko/restrictions/Restrictions.java new file mode 100644 index 000000000..0cf680810 --- /dev/null +++ b/mobile/android/base/java/org/mozilla/gecko/restrictions/Restrictions.java @@ -0,0 +1,127 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.restrictions; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.Log; + +import org.mozilla.gecko.AppConstants.Versions; +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.GeckoProfile; +import org.mozilla.gecko.annotation.RobocopTarget; +import org.mozilla.gecko.annotation.WrapForJNI; + +@RobocopTarget +public class Restrictions { + private static final String LOGTAG = "GeckoRestrictedProfiles"; + + private static RestrictionConfiguration configuration; + + private static RestrictionConfiguration getConfiguration(Context context) { + if (configuration == null) { + configuration = createConfiguration(context); + } + + return configuration; + } + + public static synchronized RestrictionConfiguration createConfiguration(Context context) { + if (configuration != null) { + // This method is synchronized and another thread might already have created the configuration. + return configuration; + } + + if (isGuestProfile(context)) { + return new GuestProfileConfiguration(); + } else if (isRestrictedProfile(context)) { + return new RestrictedProfileConfiguration(context); + } else { + return new DefaultConfiguration(); + } + } + + private static boolean isGuestProfile(Context context) { + if (configuration != null) { + return configuration instanceof GuestProfileConfiguration; + } + + GeckoAppShell.GeckoInterface geckoInterface = GeckoAppShell.getGeckoInterface(); + if (geckoInterface != null) { + return geckoInterface.getProfile().inGuestMode(); + } + + return GeckoProfile.get(context).inGuestMode(); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) + public static boolean isRestrictedProfile(Context context) { + if (configuration != null) { + return configuration instanceof RestrictedProfileConfiguration; + } + + if (Versions.preJBMR2) { + // Early versions don't support restrictions at all + return false; + } + + // The user is on a restricted profile if, and only if, we injected application restrictions during account setup. + return RestrictionCache.hasApplicationRestrictions(context); + } + + public static void update(Context context) { + getConfiguration(context).update(); + } + + private static Restrictable geckoActionToRestriction(int action) { + for (Restrictable rest : Restrictable.values()) { + if (rest.id == action) { + return rest; + } + } + + throw new IllegalArgumentException("Unknown action " + action); + } + + private static boolean canLoadUrl(final Context context, final String url) { + return getConfiguration(context).canLoadUrl(url); + } + + @WrapForJNI(calledFrom = "gecko") + public static boolean isUserRestricted() { + return isUserRestricted(GeckoAppShell.getApplicationContext()); + } + + public static boolean isUserRestricted(final Context context) { + return getConfiguration(context).isRestricted(); + } + + public static boolean isAllowed(final Context context, final Restrictable restrictable) { + return getConfiguration(context).isAllowed(restrictable); + } + + @WrapForJNI(calledFrom = "gecko") + public static boolean isAllowed(int action, String url) { + final Restrictable restrictable; + try { + restrictable = geckoActionToRestriction(action); + } catch (IllegalArgumentException ex) { + // Unknown actions represent a coding error, so we + // refuse the action and log. + Log.e(LOGTAG, "Unknown action " + action + "; check calling code."); + return false; + } + + final Context context = GeckoAppShell.getApplicationContext(); + + if (Restrictable.BROWSE == restrictable) { + return canLoadUrl(context, url); + } else { + return isAllowed(context, restrictable); + } + } +} |