Home | History | Annotate | Download | only in picker
      1 /*
      2  * Copyright (C) 2014 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.documentsui.picker;
     18 
     19 import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE;
     20 import static com.android.documentsui.services.FileOperationService.OPERATION_COPY;
     21 import static com.android.documentsui.services.FileOperationService.OPERATION_COMPRESS;
     22 import static com.android.documentsui.services.FileOperationService.OPERATION_EXTRACT;
     23 import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE;
     24 import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN;
     25 
     26 import android.app.Activity;
     27 import android.app.Fragment;
     28 import android.app.FragmentManager;
     29 import android.app.FragmentTransaction;
     30 import android.os.Bundle;
     31 import android.view.LayoutInflater;
     32 import android.view.View;
     33 import android.view.ViewGroup;
     34 import android.widget.Button;
     35 import android.widget.TextView;
     36 
     37 import com.android.documentsui.BaseActivity;
     38 import com.android.documentsui.Injector;
     39 import com.android.documentsui.R;
     40 import com.android.documentsui.base.DocumentInfo;
     41 import com.android.documentsui.base.State;
     42 import com.android.documentsui.services.FileOperationService.OpType;
     43 
     44 /**
     45  * Display pick confirmation bar, usually for selecting a directory.
     46  */
     47 public class PickFragment extends Fragment {
     48     public static final String TAG = "PickFragment";
     49 
     50     private static final String ACTION_KEY = "action";
     51     private static final String COPY_OPERATION_SUBTYPE_KEY = "copyOperationSubType";
     52     private static final String PICK_TARGET_KEY = "pickTarget";
     53 
     54     private final View.OnClickListener mPickListener = new View.OnClickListener() {
     55         @Override
     56         public void onClick(View v) {
     57             mInjector.actions.pickDocument(mPickTarget);
     58         }
     59     };
     60 
     61     private final View.OnClickListener mCancelListener = new View.OnClickListener() {
     62         @Override
     63         public void onClick(View v) {
     64             final BaseActivity activity = BaseActivity.get(PickFragment.this);
     65             activity.setResult(Activity.RESULT_CANCELED);
     66             activity.finish();
     67         }
     68     };
     69 
     70     private Injector<ActionHandler<PickActivity>> mInjector;
     71     private int mAction;
     72     // Only legal values are OPERATION_COPY, OPERATION_COMPRESS, OPERATION_EXTRACT,
     73     // OPERATION_MOVE, and unset (OPERATION_UNKNOWN).
     74     private @OpType int mCopyOperationSubType = OPERATION_UNKNOWN;
     75     private DocumentInfo mPickTarget;
     76     private View mContainer;
     77     private TextView mPick;
     78     private TextView mCancel;
     79 
     80     public static void show(FragmentManager fm) {
     81         // Fragment can be restored by FragmentManager automatically.
     82         if (get(fm) != null) {
     83             return;
     84         }
     85 
     86         final PickFragment fragment = new PickFragment();
     87         final FragmentTransaction ft = fm.beginTransaction();
     88         ft.replace(R.id.container_save, fragment, TAG);
     89         ft.commitAllowingStateLoss();
     90     }
     91 
     92     public static PickFragment get(FragmentManager fm) {
     93         return (PickFragment) fm.findFragmentByTag(TAG);
     94     }
     95 
     96     @Override
     97     public View onCreateView(
     98             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     99         mContainer = inflater.inflate(R.layout.fragment_pick, container, false);
    100 
    101         mPick = (TextView) mContainer.findViewById(android.R.id.button1);
    102         mPick.setOnClickListener(mPickListener);
    103 
    104         mCancel = (TextView) mContainer.findViewById(android.R.id.button2);
    105         mCancel.setOnClickListener(mCancelListener);
    106 
    107         updateView();
    108         return mContainer;
    109     }
    110 
    111     @Override
    112     public void onActivityCreated(Bundle savedInstanceState) {
    113         super.onActivityCreated(savedInstanceState);
    114         if (savedInstanceState != null) {
    115             // Restore status
    116             mAction = savedInstanceState.getInt(ACTION_KEY);
    117             mCopyOperationSubType =
    118                     savedInstanceState.getInt(COPY_OPERATION_SUBTYPE_KEY);
    119             mPickTarget = savedInstanceState.getParcelable(PICK_TARGET_KEY);
    120             updateView();
    121         }
    122 
    123         mInjector = ((PickActivity) getActivity()).getInjector();
    124     }
    125 
    126     @Override
    127     public void onSaveInstanceState(final Bundle outState) {
    128         super.onSaveInstanceState(outState);
    129         outState.putInt(ACTION_KEY, mAction);
    130         outState.putInt(COPY_OPERATION_SUBTYPE_KEY, mCopyOperationSubType);
    131         outState.putParcelable(PICK_TARGET_KEY, mPickTarget);
    132     }
    133 
    134     /**
    135      * @param action Which action defined in State is the picker shown for.
    136      */
    137     public void setPickTarget(
    138             int action, @OpType int copyOperationSubType, DocumentInfo pickTarget) {
    139         assert(copyOperationSubType != OPERATION_DELETE);
    140 
    141         mAction = action;
    142         mCopyOperationSubType = copyOperationSubType;
    143         mPickTarget = pickTarget;
    144         if (mContainer != null) {
    145             updateView();
    146         }
    147     }
    148 
    149     /**
    150      * Applies the state of fragment to the view components.
    151      */
    152     private void updateView() {
    153         switch (mAction) {
    154             case State.ACTION_OPEN_TREE:
    155                 mPick.setText(R.string.button_select);
    156                 mCancel.setVisibility(View.GONE);
    157                 break;
    158             case State.ACTION_PICK_COPY_DESTINATION:
    159                 int titleId;
    160                 switch (mCopyOperationSubType) {
    161                     case OPERATION_COPY:
    162                         titleId = R.string.button_copy;
    163                         break;
    164                     case OPERATION_COMPRESS:
    165                         titleId = R.string.button_compress;
    166                         break;
    167                     case OPERATION_EXTRACT:
    168                         titleId = R.string.button_extract;
    169                         break;
    170                     case OPERATION_MOVE:
    171                         titleId = R.string.button_move;
    172                         break;
    173                     default:
    174                         throw new UnsupportedOperationException();
    175                 }
    176                 mPick.setText(titleId);
    177                 mCancel.setVisibility(View.VISIBLE);
    178                 break;
    179             default:
    180                 mContainer.setVisibility(View.GONE);
    181                 return;
    182         }
    183 
    184         if (mPickTarget != null && (
    185                 mAction == State.ACTION_OPEN_TREE ||
    186                 mPickTarget.isCreateSupported())) {
    187             mContainer.setVisibility(View.VISIBLE);
    188         } else {
    189             mContainer.setVisibility(View.GONE);
    190         }
    191     }
    192 }
    193