Add clipboard functionality to platform plugin (flutter/engine#3139)

This will eventually replace the clipboard mojom.
This commit is contained in:
Adam Barth 2016-10-17 15:46:47 -07:00 committed by GitHub
parent ac963ad808
commit b3cf0e32fa
2 changed files with 54 additions and 1 deletions

View File

@ -5,6 +5,10 @@
package io.flutter.plugin.platform;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.net.Uri;
@ -27,6 +31,7 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
private final Activity mActivity;
public static final int DEFAULT_SYSTEM_UI = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
private static final String kTextPlainFormat = "text/plain";
public PlatformPlugin(Activity activity) {
mActivity = activity;
@ -53,6 +58,10 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
setSystemChromeSystemUIOverlayStyle(args.getString(0));
} else if (method.equals("SystemNavigator.pop")) {
popSystemNavigator();
} else if (method.equals("Clipboard.getData")) {
return getClipboardData(args.getString(0));
} else if (method.equals("Clipboard.setData")) {
setClipboardData(args.getJSONObject(0));
} else if (method.equals("PathProvider.getTemporaryDirectory")) {
return getPathProviderTemporaryDirectory();
} else if (method.equals("PathProvider.getApplicationDocumentsDirectory")) {
@ -166,6 +175,28 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
mActivity.finish();
}
private JSONObject getClipboardData(String format) throws JSONException {
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = clipboard.getPrimaryClip();
if (clip == null)
return null;
if ((format == null || format.equals(kTextPlainFormat)) &&
clip.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
JSONObject result = new JSONObject();
result.put("text", clip.getItemAt(0).getText().toString());
return result;
}
return null;
}
private void setClipboardData(JSONObject data) throws JSONException {
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text label?", data.getString("text"));
clipboard.setPrimaryClip(clip);
}
private JSONObject getPathProviderTemporaryDirectory() throws JSONException {
JSONObject result = new JSONObject();
result.put("path", mActivity.getCacheDir().getPath());

View File

@ -9,7 +9,11 @@
#include <UIKit/UIApplication.h>
#include <UIKit/UIKit.h>
static NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
namespace {
constexpr char kTextPlainFormat[] = "text/plain";
NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
NSArray* paths =
NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES);
if (paths.count == 0)
@ -17,6 +21,8 @@ static NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
return @{ @"path": paths.firstObject };
}
} // namespaces
namespace shell {
// TODO(abarth): Move these definitions from system_chrome_impl.cc to here.
@ -58,6 +64,10 @@ using namespace shell;
[self setSystemChromeSystemUIOverlayStyle:args.firstObject];
} else if ([method isEqualToString:@"SystemNavigator.pop"]) {
[self popSystemNavigator];
} else if ([method isEqualToString:@"Clipboard.getData"]) {
return [self getClipboardData:args.firstObject];
} else if ([method isEqualToString:@"Clipboard.setData"]) {
[self setClipboardData:args.firstObject];
} else if ([method isEqualToString:@"PathProvider.getTemporaryDirectory"]) {
return [self getPathProviderTemporaryDirectory];
} else if ([method isEqualToString:@"PathProvider.getApplicationDocumentsDirectory"]) {
@ -166,6 +176,18 @@ using namespace shell;
// Apple's human user guidelines say not to terminate iOS applications.
}
- (NSDictionary*)getClipboardData:(NSString*)format {
UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
if (!format || [format isEqualToString:@(kTextPlainFormat)])
return @{ @"text": pasteboard.string };
return nil;
}
- (void)setClipboardData:(NSDictionary *)data {
UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = data[@"text"];
}
- (NSDictionary*)getPathProviderTemporaryDirectory {
return GetDirectoryOfType(NSCachesDirectory);
}