1 /* 2 * Copyright (C) 2009 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 android.gesture; 18 19 import android.annotation.RawRes; 20 import android.util.Log; 21 import static android.gesture.GestureConstants.*; 22 import android.content.Context; 23 24 import java.io.File; 25 import java.io.FileOutputStream; 26 import java.io.FileNotFoundException; 27 import java.io.IOException; 28 import java.io.FileInputStream; 29 import java.io.InputStream; 30 import java.lang.ref.WeakReference; 31 32 public final class GestureLibraries { GestureLibraries()33 private GestureLibraries() { 34 } 35 fromFile(String path)36 public static GestureLibrary fromFile(String path) { 37 return fromFile(new File(path)); 38 } 39 fromFile(File path)40 public static GestureLibrary fromFile(File path) { 41 return new FileGestureLibrary(path); 42 } 43 fromPrivateFile(Context context, String name)44 public static GestureLibrary fromPrivateFile(Context context, String name) { 45 return fromFile(context.getFileStreamPath(name)); 46 } 47 fromRawResource(Context context, @RawRes int resourceId)48 public static GestureLibrary fromRawResource(Context context, @RawRes int resourceId) { 49 return new ResourceGestureLibrary(context, resourceId); 50 } 51 52 private static class FileGestureLibrary extends GestureLibrary { 53 private final File mPath; 54 FileGestureLibrary(File path)55 public FileGestureLibrary(File path) { 56 mPath = path; 57 } 58 59 @Override isReadOnly()60 public boolean isReadOnly() { 61 return !mPath.canWrite(); 62 } 63 save()64 public boolean save() { 65 if (!mStore.hasChanged()) return true; 66 67 final File file = mPath; 68 69 final File parentFile = file.getParentFile(); 70 if (!parentFile.exists()) { 71 if (!parentFile.mkdirs()) { 72 return false; 73 } 74 } 75 76 boolean result = false; 77 try { 78 //noinspection ResultOfMethodCallIgnored 79 file.createNewFile(); 80 mStore.save(new FileOutputStream(file), true); 81 result = true; 82 } catch (FileNotFoundException e) { 83 Log.d(LOG_TAG, "Could not save the gesture library in " + mPath, e); 84 } catch (IOException e) { 85 Log.d(LOG_TAG, "Could not save the gesture library in " + mPath, e); 86 } 87 88 return result; 89 } 90 load()91 public boolean load() { 92 boolean result = false; 93 final File file = mPath; 94 if (file.exists() && file.canRead()) { 95 try { 96 mStore.load(new FileInputStream(file), true); 97 result = true; 98 } catch (FileNotFoundException e) { 99 Log.d(LOG_TAG, "Could not load the gesture library from " + mPath, e); 100 } catch (IOException e) { 101 Log.d(LOG_TAG, "Could not load the gesture library from " + mPath, e); 102 } 103 } 104 105 return result; 106 } 107 } 108 109 private static class ResourceGestureLibrary extends GestureLibrary { 110 private final WeakReference<Context> mContext; 111 private final int mResourceId; 112 ResourceGestureLibrary(Context context, int resourceId)113 public ResourceGestureLibrary(Context context, int resourceId) { 114 mContext = new WeakReference<Context>(context); 115 mResourceId = resourceId; 116 } 117 118 @Override isReadOnly()119 public boolean isReadOnly() { 120 return true; 121 } 122 save()123 public boolean save() { 124 return false; 125 } 126 load()127 public boolean load() { 128 boolean result = false; 129 final Context context = mContext.get(); 130 if (context != null) { 131 final InputStream in = context.getResources().openRawResource(mResourceId); 132 try { 133 mStore.load(in, true); 134 result = true; 135 } catch (IOException e) { 136 Log.d(LOG_TAG, "Could not load the gesture library from raw resource " + 137 context.getResources().getResourceName(mResourceId), e); 138 } 139 } 140 141 return result; 142 } 143 } 144 } 145