Home | History | Annotate | Download | only in accessibility
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.accessibility;
     18 
     19 import android.content.ContentResolver;
     20 import android.content.Context;
     21 import android.content.res.Resources;
     22 import android.graphics.Point;
     23 import android.media.AudioManager;
     24 import android.media.MediaPlayer;
     25 import android.media.MediaPlayer.OnPreparedListener;
     26 import android.net.Uri;
     27 import android.os.Bundle;
     28 import android.provider.Settings;
     29 import android.support.v7.preference.Preference;
     30 import android.support.v7.preference.PreferenceScreen;
     31 import android.support.v7.preference.PreferenceViewHolder;
     32 import android.view.Display;
     33 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
     34 import android.view.WindowManager;
     35 import android.widget.ImageView;
     36 import android.widget.RelativeLayout.LayoutParams;
     37 import android.widget.Switch;
     38 import android.widget.VideoView;
     39 
     40 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
     41 import com.android.settings.R;
     42 import com.android.settings.widget.SwitchBar;
     43 
     44 public class ToggleScreenMagnificationPreferenceFragment extends
     45         ToggleFeaturePreferenceFragment implements SwitchBar.OnSwitchChangeListener {
     46 
     47     protected class VideoPreference extends Preference {
     48         private ImageView mVideoBackgroundView;
     49         private OnGlobalLayoutListener mLayoutListener;
     50 
     51         public VideoPreference(Context context) {
     52             super(context);
     53         }
     54 
     55         @Override
     56         public void onBindViewHolder(PreferenceViewHolder view) {
     57             super.onBindViewHolder(view);
     58             Resources res = getPrefContext().getResources();
     59             final int backgroundAssetWidth = res.getDimensionPixelSize(
     60                     R.dimen.screen_magnification_video_background_width);
     61             final int videoAssetWidth = res
     62                     .getDimensionPixelSize(R.dimen.screen_magnification_video_width);
     63             final int videoAssetHeight = res
     64                     .getDimensionPixelSize(R.dimen.screen_magnification_video_height);
     65             final int videoAssetMarginTop = res.getDimensionPixelSize(
     66                     R.dimen.screen_magnification_video_margin_top);
     67             view.setDividerAllowedAbove(false);
     68             view.setDividerAllowedBelow(false);
     69             mVideoBackgroundView = (ImageView) view.findViewById(R.id.video_background);
     70             final VideoView videoView = (VideoView) view.findViewById(R.id.video);
     71 
     72             // Loop the video.
     73             videoView.setOnPreparedListener(new OnPreparedListener() {
     74                 @Override
     75                 public void onPrepared(MediaPlayer mediaPlayer) {
     76                     mediaPlayer.setLooping(true);
     77                 }
     78             });
     79 
     80             // Make sure the VideoView does not request audio focus.
     81             videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
     82 
     83             // Resolve and set the video content
     84             Bundle args = getArguments();
     85             if ((args != null) && args.containsKey(
     86                     AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) {
     87                 videoView.setVideoURI(Uri.parse(String.format("%s://%s/%s",
     88                         ContentResolver.SCHEME_ANDROID_RESOURCE,
     89                         getPrefContext().getPackageName(),
     90                         args.getInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID))));
     91             }
     92 
     93             // Make sure video controls (e.g. for pausing) are not displayed.
     94             videoView.setMediaController(null);
     95 
     96             // LayoutListener for adjusting the position of the VideoView on the background image.
     97             mLayoutListener = new OnGlobalLayoutListener() {
     98                 @Override
     99                 public void onGlobalLayout() {
    100                     final int backgroundViewWidth = mVideoBackgroundView.getWidth();
    101 
    102                     LayoutParams videoLp = (LayoutParams) videoView.getLayoutParams();
    103                     videoLp.width = videoAssetWidth * backgroundViewWidth / backgroundAssetWidth;
    104                     videoLp.height = videoAssetHeight * backgroundViewWidth / backgroundAssetWidth;
    105                     videoLp.setMargins(0,
    106                             videoAssetMarginTop * backgroundViewWidth / backgroundAssetWidth, 0, 0);
    107                     videoView.setLayoutParams(videoLp);
    108                     videoView.invalidate();
    109                     videoView.start();
    110                 }
    111             };
    112 
    113             mVideoBackgroundView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
    114         }
    115 
    116         @Override
    117         protected void onPrepareForRemoval() {
    118             mVideoBackgroundView.getViewTreeObserver()
    119                     .removeOnGlobalLayoutListener(mLayoutListener);
    120         }
    121     }
    122 
    123     protected VideoPreference mVideoPreference;
    124     protected Preference mConfigWarningPreference;
    125 
    126     private boolean mLaunchFromSuw = false;
    127     private boolean mInitialSetting = false;
    128 
    129     @Override
    130     public void onCreate(Bundle savedInstanceState) {
    131         super.onCreate(savedInstanceState);
    132 
    133         mVideoPreference = new VideoPreference(getPrefContext());
    134         mVideoPreference.setSelectable(false);
    135         mVideoPreference.setPersistent(false);
    136         mVideoPreference.setLayoutResource(R.layout.magnification_video_preference);
    137 
    138         mConfigWarningPreference = new Preference(getPrefContext());
    139         mConfigWarningPreference.setSelectable(false);
    140         mConfigWarningPreference.setPersistent(false);
    141         mConfigWarningPreference.setVisible(false);
    142         mConfigWarningPreference.setIcon(R.drawable.ic_warning_24dp);
    143 
    144         final PreferenceScreen preferenceScreen = getPreferenceManager().getPreferenceScreen();
    145         preferenceScreen.setOrderingAsAdded(false);
    146         mVideoPreference.setOrder(0);
    147         mSummaryPreference.setOrder(1);
    148         mConfigWarningPreference.setOrder(2);
    149         preferenceScreen.addPreference(mVideoPreference);
    150         preferenceScreen.addPreference(mConfigWarningPreference);
    151     }
    152 
    153     @Override
    154     public void onResume() {
    155         super.onResume();
    156 
    157         VideoView videoView = (VideoView) getView().findViewById(R.id.video);
    158         if (videoView != null) {
    159             videoView.start();
    160         }
    161 
    162         updateConfigurationWarningIfNeeded();
    163     }
    164 
    165     @Override
    166     public int getMetricsCategory() {
    167         // TODO: Distinguish between magnification modes
    168         return MetricsEvent.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
    169     }
    170 
    171     @Override
    172     public void onSwitchChanged(Switch switchView, boolean isChecked) {
    173         onPreferenceToggled(mPreferenceKey, isChecked);
    174     }
    175 
    176     @Override
    177     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
    178         Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? 1 : 0);
    179         updateConfigurationWarningIfNeeded();
    180     }
    181 
    182     @Override
    183     protected void onInstallSwitchBarToggleSwitch() {
    184         super.onInstallSwitchBarToggleSwitch();
    185 
    186         mSwitchBar.setCheckedInternal(
    187                 Settings.Secure.getInt(getContentResolver(), mPreferenceKey, 0) == 1);
    188         mSwitchBar.addOnSwitchChangeListener(this);
    189     }
    190 
    191     @Override
    192     protected void onRemoveSwitchBarToggleSwitch() {
    193         super.onRemoveSwitchBarToggleSwitch();
    194         mSwitchBar.removeOnSwitchChangeListener(this);
    195     }
    196 
    197     @Override
    198     protected void onProcessArguments(Bundle arguments) {
    199         super.onProcessArguments(arguments);
    200         if (arguments == null) {
    201             return;
    202         }
    203 
    204         if (arguments.containsKey(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) {
    205             mVideoPreference.setVisible(true);
    206             final int resId = arguments.getInt(
    207                     AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID);
    208         } else {
    209             mVideoPreference.setVisible(false);
    210         }
    211 
    212         if (arguments.containsKey(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW)) {
    213             mLaunchFromSuw = arguments.getBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW);
    214         }
    215 
    216         if (arguments.containsKey(AccessibilitySettings.EXTRA_CHECKED)) {
    217             mInitialSetting = arguments.getBoolean(AccessibilitySettings.EXTRA_CHECKED);
    218         }
    219     }
    220 
    221     private void updateConfigurationWarningIfNeeded() {
    222         final CharSequence warningMessage =
    223                 MagnificationPreferenceFragment.getConfigurationWarningStringForSecureSettingsKey(
    224                         mPreferenceKey, getPrefContext());
    225         if (warningMessage != null) {
    226             mConfigWarningPreference.setSummary(warningMessage);
    227         }
    228         mConfigWarningPreference.setVisible(warningMessage != null);
    229     }
    230 
    231     private static int getScreenWidth(Context context) {
    232         WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    233         Display display = wm.getDefaultDisplay();
    234         Point size = new Point();
    235         display.getSize(size);
    236         return size.x;
    237     }
    238 }
    239