import java.util.ArrayList;
import android.app.Activity;
+
import android.content.Context;
import android.content.Intent;
+
import android.os.Build;
import android.os.Bundle;
+
import android.util.Log;
+
import android.view.Menu;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
-import android.widget.FrameLayout.LayoutParams;
+
import android.widget.FrameLayout;
public class EmacsActivity extends Activity
Intent intent;
View decorView;
ViewTreeObserver observer;
+ int matchParent;
/* See if Emacs should be started with -Q. */
intent = getIntent ();
= intent.getBooleanExtra ("org.gnu.emacs.START_DASH_Q",
false);
- params = new FrameLayout.LayoutParams (LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
+ matchParent = FrameLayout.LayoutParams.MATCH_PARENT;
+ params
+ = new FrameLayout.LayoutParams (matchParent,
+ matchParent);
/* Make the frame layout. */
layout = new FrameLayout (this);
import android.content.Context;
import android.content.Intent;
-import android.os.Bundle;
import android.os.Build;
import android.view.Menu;
import android.util.Log;
-import android.widget.PopupMenu;
-
/* Context menu implementation. This object is built from JNI and
describes a menu hiearchy. Then, `inflate' can turn it into an
Android menu, which can be turned into a popup (or other kind of)
{
String name, extension, mime;
int extensionSeparator;
+ MimeTypeMap singleton;
if (file.isDirectory ())
return Document.MIME_TYPE_DIR;
if (extensionSeparator > 0)
{
+ singleton = MimeTypeMap.getSingleton ();
extension = name.substring (extensionSeparator + 1);
- mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension (extension);
+ mime = singleton.getMimeTypeFromExtension (extension);
if (mime != null)
return mime;
import java.lang.Math;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
-import android.graphics.Xfermode;
public final class EmacsDrawLine
{
Rect rect;
Canvas canvas;
Paint paint;
- int i;
/* TODO implement stippling. */
if (gc.fill_style == EmacsGC.GC_FILL_OPAQUE_STIPPLED)
perform (EmacsDrawable drawable, EmacsGC gc,
int x, int y, int width, int height)
{
- int i;
Paint maskPaint, paint;
Canvas maskCanvas;
Bitmap maskBitmap;
import java.lang.Math;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
package org.gnu.emacs;
-import java.util.List;
-
import android.os.Build;
/* This code is mostly unused. See sfntfont-android.c for the code
package org.gnu.emacs;
-import java.util.List;
-import java.util.ArrayList;
-import java.lang.Object;
import java.lang.IllegalStateException;
/* This defines something that is a so-called ``handle''. Handles
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
-import android.view.inputmethod.InputMethodManager;
-import android.view.inputmethod.SurroundingText;
import android.view.inputmethod.TextSnapshot;
import android.view.KeyEvent;
-import android.text.Editable;
-
import android.util.Log;
-/* Android input methods, take number six.
-
- See EmacsEditable for more details. */
+/* Android input methods, take number six. See textconv.c for more
+ details; this is more-or-less a thin wrapper around that file. */
public final class EmacsInputConnection extends BaseInputConnection
{
package org.gnu.emacs;
-public class EmacsMultitaskActivity extends EmacsActivity
+/* This class only exists because EmacsActivity is already defined as
+ an activity, and the system wants a new class in order to define a
+ new activity. */
+
+public final class EmacsMultitaskActivity extends EmacsActivity
{
}
package org.gnu.emacs;
-import java.lang.System;
-
import android.content.res.AssetManager;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
@SuppressWarnings ("unchecked")
public final class EmacsNoninteractive
{
- private static String
- getLibraryDirectory (Context context)
- {
- int apiLevel;
-
- apiLevel = Build.VERSION.SDK_INT;
-
- if (apiLevel >= Build.VERSION_CODES.GINGERBREAD)
- return context.getApplicationInfo().nativeLibraryDir;
- else if (apiLevel >= Build.VERSION_CODES.DONUT)
- return context.getApplicationInfo().dataDir + "/lib";
-
- return "/data/data/" + context.getPackageName() + "/lib";
- }
-
public static void
main (String[] args)
{
/* Now configure Emacs. The class path should already be set. */
filesDir = context.getFilesDir ().getCanonicalPath ();
- libDir = getLibraryDirectory (context);
+ libDir = EmacsService.getLibraryDirectory (context);
cacheDir = context.getCacheDir ().getCanonicalPath ();
}
catch (Exception e)
System.err.println ("and that Emacs needs adjustments in order to");
System.err.println ("obtain required system internal resources.");
System.err.println ("Please report this bug to bug-gnu-emacs@gnu.org.");
+ e.printStackTrace ();
System.exit (1);
}
import android.app.AlertDialog;
import android.app.Activity;
-import android.content.Context;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
});
}
- public String
- getLibraryDirectory ()
- {
- int apiLevel;
- Context context;
-
- context = getApplicationContext ();
- apiLevel = Build.VERSION.SDK_INT;
-
- if (apiLevel >= Build.VERSION_CODES.GINGERBREAD)
- return context.getApplicationInfo().nativeLibraryDir;
- else if (apiLevel >= Build.VERSION_CODES.DONUT)
- return context.getApplicationInfo().dataDir + "/lib";
-
- return "/data/data/" + context.getPackageName() + "/lib";
- }
-
public void
startEmacsClient (String fileName)
{
EmacsClientThread thread;
File file;
- libDir = getLibraryDirectory ();
+ libDir = EmacsService.getLibraryDirectory (this);
builder = new ProcessBuilder (libDir + "/libemacsclient.so",
fileName, "--reuse-frame",
"--timeout=10", "--no-wait");
package org.gnu.emacs;
import java.io.File;
-import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import android.util.Log;
-import android.os.Build;
-
public class EmacsSdk7FontDriver extends EmacsFontDriver
{
private static final String TOFU_STRING = "\uDB3F\uDFFD";
package org.gnu.emacs;
-/* Importing the entire package avoids the deprecation warning. */
+/* Importing the entire package instead of just the legacy
+ ClipboardManager class avoids the deprecation warning. */
+
import android.text.*;
import android.content.Context;
import java.io.UnsupportedEncodingException;
import java.util.List;
-import java.util.ArrayList;
-import android.graphics.Canvas;
-import android.graphics.Bitmap;
import android.graphics.Point;
-import android.view.View;
import android.view.InputDevice;
import android.view.KeyEvent;
-import android.annotation.TargetApi;
-
import android.app.Notification;
import android.app.NotificationManager;
import android.app.NotificationChannel;
-import android.app.PendingIntent;
import android.app.Service;
import android.content.ClipboardManager;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-
import android.hardware.input.InputManager;
import android.net.Uri;
import android.os.VibratorManager;
import android.os.VibrationEffect;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Document;
-
import android.util.Log;
import android.util.DisplayMetrics;
public final class EmacsService extends Service
{
public static final String TAG = "EmacsService";
- public static final int MAX_PENDING_REQUESTS = 256;
public static volatile EmacsService SERVICE;
public static boolean needDashQ;
information. */
public static final boolean DEBUG_IC = false;
+ /* Return the directory leading to the directory in which native
+ library files are stored on behalf of CONTEXT. */
+
+ public static String
+ getLibraryDirectory (Context context)
+ {
+ int apiLevel;
+
+ apiLevel = Build.VERSION.SDK_INT;
+
+ if (apiLevel >= Build.VERSION_CODES.GINGERBREAD)
+ return context.getApplicationInfo ().nativeLibraryDir;
+
+ return context.getApplicationInfo ().dataDir + "/lib";
+ }
+
@Override
public int
onStartCommand (Intent intent, int flags, int startId)
}
}
- private String
- getLibraryDirectory ()
- {
- int apiLevel;
- Context context;
-
- context = getApplicationContext ();
- apiLevel = Build.VERSION.SDK_INT;
-
- if (apiLevel >= Build.VERSION_CODES.GINGERBREAD)
- return context.getApplicationInfo().nativeLibraryDir;
- else if (apiLevel >= Build.VERSION_CODES.DONUT)
- return context.getApplicationInfo().dataDir + "/lib";
-
- return "/data/data/" + context.getPackageName() + "/lib";
- }
-
@Override
public void
onCreate ()
/* Configure Emacs with the asset manager and other necessary
parameters. */
filesDir = app_context.getFilesDir ().getCanonicalPath ();
- libDir = getLibraryDirectory ();
+ libDir = getLibraryDirectory (this);
cacheDir = app_context.getCacheDir ().getCanonicalPath ();
/* Now provide this application's apk file, so a recursive
package org.gnu.emacs;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.text.InputType;
super (EmacsService.SERVICE);
Object tem;
+ Context context;
this.window = window;
this.damageRegion = new Region ();
setDefaultFocusHighlightEnabled (false);
/* Obtain the input method manager. */
- tem = getContext ().getSystemService (Context.INPUT_METHOD_SERVICE);
+ context = getContext ();
+ tem = context.getSystemService (Context.INPUT_METHOD_SERVICE);
imManager = (InputMethodManager) tem;
}
int count, i;
View child;
Rect windowRect;
- int wantedWidth, wantedHeight;
count = getChildCount ();
}
}
-
/* The following two functions must not be called if the view has no
parent, or is parented to an activity. */
import android.graphics.Rect;
import android.graphics.Canvas;
import android.graphics.Bitmap;
-import android.graphics.Point;
import android.graphics.PixelFormat;
import android.view.View;
import android.view.ViewManager;
-import android.view.ViewGroup;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.InputDevice;
import android.view.WindowManager;
-import android.content.Intent;
import android.util.Log;
import android.os.Build;
public EmacsWindow parent;
/* List of all children in stacking order. This must be kept
- consistent! */
+ consistent with their Z order! */
public ArrayList<EmacsWindow> children;
/* Map between pointer identifiers and last known position. Used to
last button press or release event. */
public int lastButtonState, lastModifiers;
- /* Whether or not the window is mapped, and whether or not it is
- deiconified. */
- private boolean isMapped, isIconified;
+ /* Whether or not the window is mapped. */
+ private boolean isMapped;
/* Whether or not to ask for focus upon being mapped, and whether or
not the window should be focusable. */
private WindowManager windowManager;
/* The time of the last KEYCODE_VOLUME_DOWN release. This is used
- to quit Emacs. */
+ to quit Emacs upon two rapid clicks of the volume down
+ button. */
private long lastVolumeButtonRelease;
/* Linked list of character strings which were recently sent as
public void
noticeIconified ()
{
- isIconified = true;
EmacsNative.sendIconified (this.handle);
}
public void
noticeDeiconified ()
{
- isIconified = false;
EmacsNative.sendDeiconified (this.handle);
}
package org.gnu.emacs;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
import android.content.Intent;
public
EmacsWindowAttachmentManager ()
{
- consumers = new LinkedList<WindowConsumer> ();
- windows = new LinkedList<EmacsWindow> ();
+ consumers = new ArrayList<WindowConsumer> ();
+ windows = new ArrayList<EmacsWindow> ();
}
public void