154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey/* 254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project 354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * 454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * you may not use this file except in compliance with the License. 654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * You may obtain a copy of the License at 754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * 854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * 1054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 1154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 1254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * See the License for the specific language governing permissions and 1454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * limitations under the License. 1554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey */ 1654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 1754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeypackage com.android.documentsui; 1854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 1954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.Fragment; 2054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentManager; 2154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentTransaction; 2254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.content.Context; 2354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.os.Bundle; 249fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.text.Editable; 259fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.text.TextWatcher; 269fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.util.Log; 2754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.LayoutInflater; 2854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.View; 2954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.ViewGroup; 3054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.Button; 3154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.EditText; 3254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.ImageView; 3354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 34ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo; 359fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 3654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey/** 3754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Display document title editor and save button. 3854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey */ 3954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeypublic class SaveFragment extends Fragment { 4054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public static final String TAG = "SaveFragment"; 4154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 42ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey private DocumentInfo mReplaceTarget; 4354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey private EditText mDisplayName; 4454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey private Button mSave; 459fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey private boolean mIgnoreNextEdit; 4654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 4754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey private static final String EXTRA_MIME_TYPE = "mime_type"; 4854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey private static final String EXTRA_DISPLAY_NAME = "display_name"; 4954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 5054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public static void show(FragmentManager fm, String mimeType, String displayName) { 5154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final Bundle args = new Bundle(); 5254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey args.putString(EXTRA_MIME_TYPE, mimeType); 5354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey args.putString(EXTRA_DISPLAY_NAME, displayName); 5454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 5554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final SaveFragment fragment = new SaveFragment(); 5654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey fragment.setArguments(args); 5754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 5854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final FragmentTransaction ft = fm.beginTransaction(); 5966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey ft.replace(R.id.container_save, fragment, TAG); 6054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey ft.commitAllowingStateLoss(); 6154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 6254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 6354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public static SaveFragment get(FragmentManager fm) { 6454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return (SaveFragment) fm.findFragmentByTag(TAG); 6554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 6654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 6754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 6854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public View onCreateView( 6954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 7054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final Context context = inflater.getContext(); 7154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 7254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final View view = inflater.inflate(R.layout.fragment_save, container, false); 7354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 7454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); 75aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey icon.setImageDrawable( 760b14db3cf5eac43736462999337c9a3efdc1ac81Jeff Sharkey IconUtils.loadMimeIcon(context, getArguments().getString(EXTRA_MIME_TYPE))); 7754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 7854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mDisplayName = (EditText) view.findViewById(android.R.id.title); 799fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mDisplayName.addTextChangedListener(mDisplayNameWatcher); 8054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mDisplayName.setText(getArguments().getString(EXTRA_DISPLAY_NAME)); 8154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 8254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mSave = (Button) view.findViewById(android.R.id.button1); 8354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mSave.setOnClickListener(mSaveListener); 8454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mSave.setEnabled(false); 8554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 8654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return view; 8754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 8854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 899fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey private TextWatcher mDisplayNameWatcher = new TextWatcher() { 909fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey @Override 919fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey public void onTextChanged(CharSequence s, int start, int before, int count) { 929fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey if (mIgnoreNextEdit) { 939fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mIgnoreNextEdit = false; 949fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } else { 959fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey Log.d(TAG, "onTextChanged!"); 969fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mReplaceTarget = null; 979fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 999fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 1009fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey @Override 1019fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey public void beforeTextChanged(CharSequence s, int start, int count, int after) { 1029fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // ignored 1039fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 1049fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 1059fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey @Override 1069fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey public void afterTextChanged(Editable s) { 1079fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // ignored 1089fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 1099fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey }; 1109fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 11154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey private View.OnClickListener mSaveListener = new View.OnClickListener() { 11254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 11354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public void onClick(View v) { 1149fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final DocumentsActivity activity = DocumentsActivity.get(SaveFragment.this); 1159fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey if (mReplaceTarget != null) { 1169fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey activity.onSaveRequested(mReplaceTarget); 1179fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } else { 1189fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final String mimeType = getArguments().getString(EXTRA_MIME_TYPE); 1199fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final String displayName = mDisplayName.getText().toString(); 1209fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey activity.onSaveRequested(mimeType, displayName); 1219fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 12254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 12354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey }; 12454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 1259fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey /** 1269fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey * Set given document as target for in-place writing if user hits save 1279fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey * without changing the filename. Can be set to {@code null} if user 1289fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey * navigates outside the target directory. 1299fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey */ 130ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public void setReplaceTarget(DocumentInfo replaceTarget) { 1319fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mReplaceTarget = replaceTarget; 1329fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 1339fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey if (mReplaceTarget != null) { 1349fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey getArguments().putString(EXTRA_DISPLAY_NAME, replaceTarget.displayName); 1359fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mIgnoreNextEdit = true; 1369fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey mDisplayName.setText(replaceTarget.displayName); 1379fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 13854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 13954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 14054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public void setSaveEnabled(boolean enabled) { 14154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey mSave.setEnabled(enabled); 14254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 14354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey} 144