final
comparator class overrides the default
47 | * semantics of GComparator
class for the case when
48 | * both of the objects being compared are instances of
49 | * DNSRecord
class. This class also implements
50 | * Metricable
interface to offer records metrics (which
51 | * is the level of a resource record name plus one). Instead of
52 | * canonical ordering for records (which is defined in RFC2535 and
53 | * may be performed through GComparator
instance), this
54 | * comparator offers an alternative records ordering (more
55 | * convenient for the end users). The alternative ordering differs
56 | * from the canonical one in just one thing: records rData is
57 | * compared not as a sequence of bytes but as a sequence of its
58 | * decoded fields (each field is compared according to its type).
59 | **
60 | * @see DNSRecord
61 | **
62 | * @version 3.0
63 | * @author Ivan Maidanski
64 | **
65 | * @since 2.8
66 | */
67 | public final class DNSRecAltCmp extends GComparator
68 | implements Metricable
69 | {
70 |
71 | /**
72 | * The class version unique identifier for serialization
73 | * interoperability.
74 | **
75 | * @since 2.8
76 | */
77 | private static final long serialVersionUID = 4428663077680643378L;
78 |
79 | /**
80 | * An instance of this comparator.
81 | **
82 | * This constant field is initialized with the instantiation of this
83 | * comparator (hides INSTANCE
of the superclass).
84 | **
85 | * @see #greater(java.lang.Object, java.lang.Object)
86 | */
87 | public static final GComparator INSTANCE = new DNSRecAltCmp();
88 |
89 | /**
90 | * Constructs a new comparator.
91 | **
92 | * This constructor is made public
only to allow custom
93 | * dynamic instantiation of this class. In other cases,
94 | * INSTANCE
should be used.
95 | **
96 | * @see #INSTANCE
97 | */
98 | public DNSRecAltCmp() {}
99 |
100 | /**
101 | * The body of 'Greater-Than' comparator.
102 | **
103 | * Tests whether or not the first specified object is greater than
104 | * the second one. If both arguments are of DNSRecord
105 | * class then (objA compareTo(objB, true) > 0)
is
106 | * returned, else greater(objA, objB)
of the superclass
107 | * is returned.
108 | **
109 | * @param objA
110 | * the first compared argument (may be null
).
111 | * @param objB
112 | * the second compared argument (may be null
).
113 | * @return
114 | * true
if and only if objA is greater than
115 | * objB.
116 | **
117 | * @see #INSTANCE
118 | * @see #evaluate(java.lang.Object)
119 | */
120 | public boolean greater(Object objA, Object objB)
121 | {
122 | boolean isGreater;
123 | if (objA instanceof DNSRecord && objB instanceof DNSRecord)
124 | {
125 | isGreater = false;
126 | if (((DNSRecord)objA).compareTo((DNSRecord)objB, true) > 0)
127 | isGreater = true;
128 | }
129 | else isGreater = super.greater(objA, objB);
130 | return isGreater;
131 | }
132 |
133 | /**
134 | * The body of the metrics.
135 | **
136 | * Evaluates the supplied object. If obj is of
137 | * DNSRecord
class then
138 | * (obj getLevel() + 1)
is returned, else this method
139 | * always returns 0
.
140 | **
141 | * @param obj
142 | * the object (may be null
) to evaluate.
143 | * @return
144 | * the integer result of the performed evaluation.
145 | **
146 | * @see #INSTANCE
147 | * @see #greater(java.lang.Object, java.lang.Object)
148 | **
149 | * @since 3.0
150 | */
151 | public int evaluate(Object obj)
152 | {
153 | int value = 0;
154 | if (obj instanceof DNSRecord)
155 | value = ((DNSRecord)obj).getLevel() + 1;
156 | return value;
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Immutable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Immutable.java --
3 | * Tagging interface for immutable objects.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski final
and should not extend
49 | * any other classes; they must not have any methods for changing
50 | * state of this
object; all their variable fields must
51 | * never be changed even indirectly (all the fields should be
52 | * final
); methods synchronization is not needed.
53 | **
54 | * @see ReallyCloneable
55 | * @see ConstVector
56 | * @see UnsignedInt
57 | * @see GComparator
58 | **
59 | * @version 2.0
60 | * @author Ivan Maidanski
61 | **
62 | * @since 2.0
63 | */
64 | public interface Immutable
65 | {
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Indexable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Indexable.java --
3 | * Read-only interface for indexed containers.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski 0
to
46 | * length() - 1
, inclusive).
47 | **
48 | * @version 2.0
49 | * @author Ivan Maidanski
50 | **
51 | * @since 2.0
52 | */
53 | public interface Indexable
54 | {
55 |
56 | /**
57 | * Returns the number of elements in this
container.
58 | **
59 | * This method should not be final
.
60 | **
61 | * @return
62 | * amount (non-negative value) of elements.
63 | **
64 | * @see #getAt(int)
65 | */
66 | public abstract int length();
67 |
68 | /**
69 | * Returns value of the element at the specified index.
70 | **
71 | * If the value to return is primitive then it is being wrapped.
72 | * This method should not be final
.
73 | **
74 | * @param index
75 | * the index (must be in the range) at which to return an element.
76 | * @return
77 | * an element (may be null
) at index.
78 | * @exception ArrayIndexOutOfBoundsException
79 | * if index is negative or is not less than
80 | * length()
.
81 | * @exception OutOfMemoryError
82 | * if there is not enough memory.
83 | **
84 | * @see #length()
85 | */
86 | public abstract Object getAt(int index)
87 | throws ArrayIndexOutOfBoundsException;
88 | }
89 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Lockable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Lockable.java --
3 | * Interface for objects synchronized on lock.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski protected transient
and
65 | * non-null
, by default lock is set to
66 | * this
(during initialization, deserialization or
67 | * cloning); all needed synchronization (inside/outside the class)
68 | * must be done on lock (as shown below). This method
69 | * should be implemented as follows:
70 | **
71 | *
72 | * protected transient Object lock = this;
73 | * public final void setLock(Object newLock)
74 | * throws NullPointerException
75 | * { // note: take care on deserializing
76 | * Object curLock;
77 | * newLock.equals(newLock); // this is a check for null
78 | * do
79 | * {
80 | * synchronized (curLock = lock)
81 | * {
82 | * if (curLock == lock)
83 | * { // check that synchronized on this lock
84 | * lock = newLock; // this is a synchronized operation
85 | * break;
86 | * }
87 | * }
88 | * } while (true);
89 | * }
90 | *
91 | **
92 | * @param newLock
93 | * a lock object (must be non-null
) to be used by
94 | * this
object for doing all its synchronization.
95 | * @exception NullPointerException
96 | * if newLock is null
.
97 | **
98 | * @see #getLock()
99 | */
100 | public abstract void setLock(Object newLock)
101 | throws NullPointerException;
102 |
103 | /**
104 | * Just returns the current lock object.
105 | **
106 | * This method should be implemented as follows:
107 | **
108 | *
109 | * public final Object getLock()
110 | * {
111 | * return lock;
112 | * }
113 | *
114 | **
115 | * @return
116 | * the current lock object, on which this
117 | * object performs all its synchronization.
118 | **
119 | * @see #setLock(java.lang.Object)
120 | */
121 | public abstract Object getLock();
122 | }
123 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Metricable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Metricable.java --
3 | * Interface for integer metrics adapters.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski true
. Metrics may be used in
49 | * serializable data structures since Serializable
50 | * interface is extended.
51 | **
52 | * @see ToString
53 | * @see GComparator
54 | **
55 | * @version 2.0
56 | * @author Ivan Maidanski
57 | **
58 | * @since 2.0
59 | */
60 | public interface Metricable extends Serializable
61 | {
62 |
63 | /**
64 | * The body of the metrics.
65 | **
66 | * Evaluates the supplied object. If the object is not instance of
67 | * the expected type then 0
is always returned.
68 | **
69 | * @param obj
70 | * the object (may be null
) to evaluate.
71 | * @return
72 | * the integer result of the performed evaluation.
73 | */
74 | public abstract int evaluate(Object obj);
75 | }
76 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/MultiObservable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/MultiObservable.java --
3 | * Interface for observable objects.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski update(this, argument)
for every registered observer
46 | * agent (in an unspecified order), where argument
47 | * describes the occurred changes (as it must be specified for a
48 | * particular object).
49 | **
50 | * @see Notifiable
51 | * @see ObservedCore
52 | **
53 | * @version 2.0
54 | * @author Ivan Maidanski
55 | */
56 | public interface MultiObservable
57 | {
58 |
59 | /**
60 | * Registers one more observer.
61 | **
62 | * An observer registration means that agent will be
63 | * updated (notified) each time this
observable object
64 | * is changed somehow. Duplicate agents are not added (registered).
65 | * If an exception is thrown then state of this
object
66 | * is not changed. Important notes: registered observers should not
67 | * be accessible for other objects.
68 | **
69 | * @param agent
70 | * the observer agent (must be non-null
) to be
71 | * registered.
72 | * @exception NullPointerException
73 | * if agent is null
.
74 | * @exception OutOfMemoryError
75 | * if there is not enough memory.
76 | **
77 | * @see #removeObserver(net.sf.ivmaidns.util.Notifiable)
78 | */
79 | public abstract void addObserver(Notifiable agent)
80 | throws NullPointerException;
81 |
82 | /**
83 | * Unregisters a particular observer.
84 | **
85 | * If agent is not registered (or is null
)
86 | * then nothing is performed. Else the specified agent is removed
87 | * from the observers list of this
observable object
88 | * (this action is just the opposite to the agent registration).
89 | **
90 | * @param agent
91 | * the observer agent (may be null
) to be unregistered.
92 | **
93 | * @see #addObserver(net.sf.ivmaidns.util.Notifiable)
94 | */
95 | public abstract void removeObserver(Notifiable agent);
96 | }
97 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Notifiable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Notifiable.java --
3 | * Interface for custom observer agents.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski Verifiable
interface is extended to allow integrity
50 | * checking for typical agent objects. Important notes: agents must
51 | * not modify observed object anyhow; notification should
52 | * be performed just after changes; this notification mechanism has
53 | * nothing to do with threads and is completely separate from the
54 | * 'wait-notify' mechanism of Object
. Here is the usage
55 | * example of an observer agent:
56 | **
57 | *
58 | * final class MyAgent // hidden helper class
59 | * implements Notifiable
60 | * {
61 | * private final MyClass myClass; // myClass != null
62 | * protected MyAgent(MyClass myClass)
63 | * throws NullPointerException
64 | * {
65 | * myClass.equals(myClass);
66 | * this.myClass = myClass;
67 | * }
68 | * public void update(MultiObservable observed, Object argument)
69 | * {
70 | * MyClass myClass = this.myClass;
71 | * if (argument instanceof MyEvent && myClass.observed == observed)
72 | * // safe (private) actions on myClass
73 | * }
74 | * public void integrityCheck()
75 | * {
76 | * if (myClass == null)
77 | * throw new InternalError("myClass: null");
78 | * }
79 | * }
80 | * private transient Notifiable agent = new MyAgent(this);
81 | * . . .
82 | * observed.addObserver(agent);
83 | * . . .
84 | * observed.removeObserver(agent); // stop observing
85 | *
86 | **
87 | * @see MultiObservable
88 | **
89 | * @version 2.0
90 | * @author Ivan Maidanski
91 | */
92 | public interface Notifiable extends Verifiable
93 | {
94 |
95 | /**
96 | * Notifies this
observer agent on a particular event
97 | * that just occurred.
98 | **
99 | * This method is called whenever observed object is
100 | * changed. Important notes: observed object should not
101 | * be modified during the notification; types of observed
102 | * and argument should be checked inside; no access
103 | * should be provided to the instance of this interface (since this
104 | * method is public
) outside hidden
105 | * notifyObservers
method of observed
106 | * object; RuntimeException
(and
107 | * OutOfMemoryError
) may be thrown if a notification
108 | * failure has occurred.
109 | **
110 | * @param observed
111 | * the observed object (may be null
, should be checked
112 | * inside).
113 | * @param argument
114 | * the argument (may be null
, should be checked inside)
115 | * describing the occurred event.
116 | * @exception RuntimeException
117 | * if the notification process has failed (a custom exception).
118 | * @exception OutOfMemoryError
119 | * if there is not enough memory (to perform notification).
120 | */
121 | public abstract void update(MultiObservable observed,
122 | Object argument);
123 | }
124 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/ReallyCloneable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/ReallyCloneable.java --
3 | * Interface for cloneable objects.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski public
method
44 | * for making an instance "exact" copy (unlike
45 | * Cloneable
interface which is only tagging). The
46 | * standard Cloneable
interface is extended here to
47 | * allow the proper usage of native clone()
method of
48 | * Object
class (without throwing
49 | * CloneNotSupportedException
) Important notes: the
50 | * classes which implement this interface should also override the
51 | * standard equals(Object)
and hashCode()
52 | * methods.
53 | **
54 | * @version 2.0
55 | * @author Ivan Maidanski
56 | **
57 | * @since 2.0
58 | */
59 | public interface ReallyCloneable extends Cloneable
60 | {
61 |
62 | /**
63 | * Creates and returns a copy of this
object.
64 | **
65 | * By the clone()
standard definition, this method
66 | * creates a new instance of the class of this object and
67 | * initializes all its fields with exactly the contents of the
68 | * corresponding fields of this object. Typically, native
69 | * clone()
method of Object
class is used
70 | * inside this method.
71 | **
72 | * @return
73 | * a copy (not null
and != this
) of
74 | * this
instance.
75 | * @exception OutOfMemoryError
76 | * if there is not enough memory.
77 | */
78 | public abstract Object clone();
79 | }
80 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/SafeRunnable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/SafeRunnable.java --
3 | * Interface for safely runnable objects.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski InterruptedException
inside thread when it is
61 | * waiting or sleeping). This method returns immediately.
62 | */
63 | public abstract void interrupt();
64 |
65 | /**
66 | * Initiates safe suspend operation.
67 | **
68 | * This method just sets suspending flag which signals
69 | * active object that all its threads (only which are alive) must be
70 | * safely suspended (turned to sleeping state) as soon as possible.
71 | * This method returns immediately.
72 | **
73 | * @see #waitSuspend()
74 | * @see #resume()
75 | * @see #isSuspended()
76 | * @see #stop()
77 | */
78 | public abstract void suspend();
79 |
80 | /**
81 | * Initiates and waits for safe suspend.
82 | **
83 | * This method sets suspending flag which signals active
84 | * object that all its threads (only which are alive) must be safely
85 | * suspended (turned to sleeping state) as soon as possible. This
86 | * method returns just after all threads of active object have been
87 | * suspended (or died).
88 | **
89 | * @see #suspend()
90 | * @see #resume()
91 | * @see #isSuspended()
92 | */
93 | public abstract void waitSuspend();
94 |
95 | /**
96 | * Resumes running after suspend.
97 | **
98 | * This method clears suspending flag, thus telling
99 | * active object to resume normal running (stop sleeping) after safe
100 | * suspend for all its still alive threads. This method returns
101 | * immediately.
102 | **
103 | * @see #suspend()
104 | * @see #waitSuspend()
105 | * @see #isSuspended()
106 | */
107 | public abstract void resume();
108 |
109 | /**
110 | * Initiates safe stop operation.
111 | **
112 | * This method just sets stopping flag which signals
113 | * active object that all its threads (only which are alive) must be
114 | * safely terminated (stopped) as soon as possible. This method
115 | * returns immediately. If active object is suspended then safe stop
116 | * operation begins just when resuming.
117 | **
118 | * @see #suspend()
119 | * @see #resume()
120 | * @see #join()
121 | * @see #isSuspended()
122 | * @see #isAlive()
123 | */
124 | public abstract void stop();
125 |
126 | /**
127 | * Waits while active object is alive.
128 | **
129 | * This method infinitely waits for the death (termination) of all
130 | * threads inside this active object.
131 | **
132 | * @see #stop()
133 | * @see #isAlive()
134 | * @see #waitSuspend()
135 | */
136 | public abstract void join();
137 |
138 | /**
139 | * Tests whether this active object is suspended.
140 | **
141 | * This method just immediately returns suspended flag
142 | * which is true only when active object is in safe-suspend state
143 | * (and alive).
144 | **
145 | * @return
146 | * true
if and only if active object is suspended.
147 | **
148 | * @see #suspend()
149 | * @see #waitSuspend()
150 | * @see #resume()
151 | * @see #isAlive()
152 | */
153 | public abstract boolean isSuspended();
154 |
155 | /**
156 | * Tests whether this active object is still alive.
157 | **
158 | * This method just immediately returns the flag indicating that one
159 | * or more threads (inside this active object) have not died yet.
160 | **
161 | * @return
162 | * true
if and only if active object is alive.
163 | **
164 | * @see #stop()
165 | * @see #join()
166 | * @see #isSuspended()
167 | */
168 | public abstract boolean isAlive();
169 | }
170 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Sortable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Sortable.java --
3 | * Interface for comparable/orderable objects.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski this
object is greater than the specified
58 | * one. Important notes: in a particular final
class
59 | * int compareTo(Type val) throws NullPointerException
60 | * method may be provided for user convenience.
61 | **
62 | * @param obj
63 | * the second compared object (may be null
).
64 | * @return
65 | * true
if obj is comparable with
66 | * this
and this
object is greater than
67 | * obj, else false
.
68 | **
69 | * @since 2.0
70 | */
71 | public abstract boolean greaterThan(Object obj);
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/ToString.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/ToString.java --
3 | * Class for 'object-to-string' converters.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski toString(Object)
, implementing
47 | * their own conversion rules. The converters may be used in
48 | * serializable data structures since Serializable
49 | * interface is implemented.
50 | **
51 | * @see GComparator
52 | **
53 | * @version 2.0
54 | * @author Ivan Maidanski
55 | */
56 | public class ToString
57 | implements Serializable
58 | {
59 |
60 | /**
61 | * The class version unique identifier for serialization
62 | * interoperability.
63 | **
64 | * @since 1.1
65 | */
66 | private static final long serialVersionUID = 6412171811255872037L;
67 |
68 | /**
69 | * The default 'to-string' converter providing the standard Java
70 | * toString()
functionality.
71 | **
72 | * This constant field is initialized with the instantiation of
73 | * exactly this converter.
74 | **
75 | * @see #toString(java.lang.Object)
76 | **
77 | * @since 2.0
78 | */
79 | public static final ToString INSTANCE = new ToString();
80 |
81 | /**
82 | * Constructs a new 'to-string' converter.
83 | **
84 | * This constructor is made public
to allow custom
85 | * dynamic instantiation of this class.
86 | **
87 | * @see #INSTANCE
88 | **
89 | * @since 1.1
90 | */
91 | public ToString() {}
92 |
93 | /**
94 | * The body of 'Object-to-String' converter.
95 | **
96 | * Returns its operand as a string. If the argument is not instance
97 | * of the expected type then standard Java toString()
98 | * method for the specified argument is executed (or "null" is
99 | * returned if argument is null
). This method should be
100 | * overridden in adapter subclasses to implement specific
101 | * 'to-string' conversion (instead of the standard conversion).
102 | **
103 | * @param obj
104 | * the object to be converted (may be null
).
105 | * @return
106 | * the string representation (not null
) of the
107 | * specified object.
108 | * @exception OutOfMemoryError
109 | * if there is not enough memory.
110 | **
111 | * @see #INSTANCE
112 | */
113 | public String toString(Object obj)
114 | {
115 | String str = "null";
116 | if (obj != null)
117 | str = obj.toString();
118 | return str;
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/TrimToSizeable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/TrimToSizeable.java --
3 | * Interface for object 'trim-to-size'.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski OutOfMemoryError
59 | * is never thrown (should be ignored inside the method).
60 | */
61 | public abstract void trimToSize();
62 | }
63 |
--------------------------------------------------------------------------------
/app/src/main/java/net/sf/ivmaidns/util/Verifiable.java:
--------------------------------------------------------------------------------
1 | /*
2 | * @(#) src/net/sf/ivmaidns/util/Verifiable.java --
3 | * Interface for object self-integrity check.
4 | **
5 | * Copyright (c) 2000 Ivan Maidanski this
object for its integrity.
59 | **
60 | * This method is mostly used for debug purpose only. By default,
61 | * deep integrity (internal consistency) check is performed (that
62 | * is, all variable fields of this
object are verified
63 | * too). Internal state of object is not altered. If internal
64 | * consistency is violated somehow (due to an error in Java VM or
65 | * due to a programmer error) then InternalError
is
66 | * thrown (with some detailed message). Important notes:
67 | * static final
fields should not be checked. This
68 | * method should be synchronized outside (unless the object is not
69 | * mutable).
70 | **
71 | * @exception InternalError
72 | * if integrity violation is detected.
73 | */
74 | public abstract void integrityCheck();
75 | }
76 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable/arrow_left.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable/arrow_right.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable/arrow_up.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haikuowuya/AndroidRepeaterProject/fd914c95c609331de776bb5ede24c51a6f23394c/app/src/main/res/drawable/star.png
--------------------------------------------------------------------------------
/app/src/main/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |